Compare commits
No commits in common. "main" and "v0.1.0" have entirely different histories.
131 changed files with 214 additions and 4033 deletions
|
|
@ -1,2 +0,0 @@
|
|||
# The absolute path to the Foundry installation to create symlinks to
|
||||
FOUNDRY_ROOT=""
|
||||
18
.github/workflows/draft-release.yaml
vendored
18
.github/workflows/draft-release.yaml
vendored
|
|
@ -29,22 +29,16 @@ jobs:
|
|||
if: ${{ steps.check-tag.outputs.exists == 'true' }}
|
||||
run: exit 1
|
||||
|
||||
- name: "Building compendia"
|
||||
run: "npm run data:build"
|
||||
- name: Move system.json to a temp file
|
||||
id: manifest-move
|
||||
run: mv system.json module.temp.json
|
||||
|
||||
- name: "Removing compendium source"
|
||||
run: "rm -rf packs/**/_source"
|
||||
|
||||
- name: Update the manifest with the relevant properties
|
||||
- name: Update the download property in the manifest
|
||||
id: manifest-update
|
||||
uses: microsoft/variable-substitution@v1
|
||||
with:
|
||||
files: "system.json"
|
||||
env:
|
||||
download: "https://github.com/${{ github.repository }}/releases/download/v${{ steps.version.outputs.version }}/release.zip"
|
||||
run: cat module.temp.json | jq -r --tab '.download = "https://github.com/${{ github.repository }}/releases/download/v${{ steps.version.outputs.version }}/release.zip"' > system.json
|
||||
|
||||
- name: Create the zip
|
||||
run: zip -r release.zip system.json packs module langs assets templates README.md
|
||||
run: zip -r release.zip system.json module langs assets templates README.md
|
||||
|
||||
- name: Create the draft release
|
||||
uses: ncipollo/release-action@v1
|
||||
|
|
|
|||
8
.gitignore
vendored
8
.gitignore
vendored
|
|
@ -1,7 +1,6 @@
|
|||
dist/
|
||||
*.link
|
||||
*.txt
|
||||
/foundry
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
|
|
@ -13,10 +12,3 @@ jspm_packages/
|
|||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# Ignore all of the binaries and stuff that gets built for Foundry from the raw
|
||||
# JSON data because it's annoying seeing it in my git changes when it isn't actually
|
||||
# needed.
|
||||
/packs/**/*
|
||||
!/packs/**/*/
|
||||
!/packs/**/*.json
|
||||
|
|
|
|||
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
|
|
@ -1,10 +1,9 @@
|
|||
{
|
||||
"files.exclude": {
|
||||
"**/node_modules": true,
|
||||
"foundry": true
|
||||
"**/node_modules": true
|
||||
},
|
||||
"search.exclude": {
|
||||
"foundry": true
|
||||
"foundry.*.link": true
|
||||
},
|
||||
"html.customData": [
|
||||
"./.vscode/foundry.html-data.json",
|
||||
|
|
|
|||
|
|
@ -1,11 +1,8 @@
|
|||
Eldritch-Oliver:
|
||||
Oliver Akins:
|
||||
- geist-silhouette.v2.svg : All rights reserved.
|
||||
- caster-silhouette.v1.svg : All rights reserved.
|
||||
- icons/star-empty.svg : Modified from https://thenounproject.com/icon/star-7711815/ by Llisole
|
||||
- icons/star.svg : Modified from https://thenounproject.com/icon/star-7711815/ by Llisole
|
||||
- icons/shield/checked.v1.svg : Modified from https://thenounproject.com/icon/shield-5565751/ by Corner Pixel
|
||||
- icons/shield/crossed.v1.svg : Modified from https://thenounproject.com/icon/shield-5565751/ by Corner Pixel
|
||||
- icons/shield/solid.v1.svg : Modified from https://thenounproject.com/icon/shield-5565751/ by Corner Pixel
|
||||
|
||||
Kýnan Antos (Gritsilk Games):
|
||||
- hero-silhouette.svg : Licensed to Distribute and Modify within the bounds of the "Foundry-RipCrypt" system.
|
||||
|
|
@ -16,9 +13,6 @@ ARISO:
|
|||
Abdulloh Fauzan:
|
||||
- icons/info-circle.svg (https://thenounproject.com/icon/information-4176576/) : Rights Purchased
|
||||
|
||||
hanifmuhammad:
|
||||
- icons/plus.svg (https://thenounproject.com/icon/plus-7363257/) : Rights Purchased
|
||||
|
||||
QOLBIN SALIIM:
|
||||
- icons/arrow-left.svg (https://thenounproject.com/icon/arrow-1933583/) : Rights Purchased
|
||||
- icons/arrow-right.svg (https://thenounproject.com/icon/arrow-1933581/) : Rights Purchased
|
||||
|
|
|
|||
|
|
@ -1,3 +0,0 @@
|
|||
<svg version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m83.59 16.41c-18.547-18.547-48.633-18.547-67.18 0s-18.547 48.633 0 67.18 48.633 18.547 67.18 0 18.547-48.633 0-67.18zm-6.3438 39.922h-20.914v20.91c0 3.5039-2.8398 6.332-6.332 6.332s-6.332-2.8281-6.332-6.332v-20.91h-20.914c-3.5039 0-6.332-2.8398-6.332-6.332s2.8281-6.332 6.332-6.332h20.914v-20.914c0-3.5039 2.8398-6.332 6.332-6.332s6.332 2.8281 6.332 6.332v20.91h20.91c3.5039 0 6.332 2.8398 6.332 6.332 0.003906 3.4961-2.8242 6.3359-6.3281 6.3359z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 544 B |
|
|
@ -1 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M50 6.9q-2.1 0-3.9 1.4a47 47 0 0 1-24.8 10c-3.2.3-5.7 3-5.7 6.2v31c0 13 7.3 24.8 19 30.7l12.6 6.2a6 6 0 0 0 5.6 0l12.6-6.2a34 34 0 0 0 19-30.8V24.5c0-3.2-2.5-5.9-5.7-6.2a47 47 0 0 1-24.8-10A6 6 0 0 0 50 6.9m20.4 25.6a5 5 0 0 1 4 8.2L52.2 69a5 5 0 0 1-7.2.8L28.2 55.9a5 5 0 0 1 6.4-7.7l12.8 10.5 19.1-24.2a5 5 0 0 1 3.9-2"/></svg>
|
||||
|
Before Width: | Height: | Size: 401 B |
|
|
@ -1 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M50 6.9q-2.1 0-3.9 1.4a47 47 0 0 1-24.8 10c-3.2.3-5.7 3-5.7 6.2v31c0 13 7.3 24.8 19 30.7l12.6 6.2a6 6 0 0 0 5.6 0l12.6-6.2a34 34 0 0 0 19-30.8V24.5c0-3.2-2.5-5.9-5.7-6.2a47 47 0 0 1-24.8-10A6 6 0 0 0 50 6.9M36.7 27.6a6 6 0 0 1 4.6 2.3l9 11.2L59 30a6 6 0 0 1 8.4-1l.4.3a6 6 0 0 1 1 8.4L58.2 51.2l10.5 13.3a6 6 0 0 1-1 8.4l-.4.3a6 6 0 0 1-8.4-1l-8.7-11-8.7 11.1a6 6 0 0 1-8.4 1l-.3-.3a6 6 0 0 1-1-8.4l10.5-13.4-10.8-13.6a6 6 0 0 1 1-8.4l.4-.3a6 6 0 0 1 3.8-1.3"/></svg>
|
||||
|
Before Width: | Height: | Size: 539 B |
|
|
@ -1 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M49.996 6.9a6.2 6.2 0 0 0-3.869 1.362 46.9 46.9 0 0 1-24.828 10.035c-3.238.308-5.68 2.984-5.68 6.219V55.41c0 13.102 7.281 24.883 19.004 30.746l12.578 6.29a6.32 6.32 0 0 0 5.59 0l12.578-6.29c11.72-5.863 19.004-17.645 19.004-30.746l.004-30.894c0-3.239-2.441-5.91-5.68-6.22h-.002a46.9 46.9 0 0 1-24.83-10.034A6.2 6.2 0 0 0 49.996 6.9"/></svg>
|
||||
|
Before Width: | Height: | Size: 411 B |
14
augments.d.ts
vendored
14
augments.d.ts
vendored
|
|
@ -1,14 +0,0 @@
|
|||
declare global {
|
||||
class Hooks extends foundry.helpers.Hooks {};
|
||||
const fromUuid = foundry.utils.fromUuid;
|
||||
}
|
||||
|
||||
interface Actor {
|
||||
/** The system-specific data */
|
||||
system: any;
|
||||
};
|
||||
|
||||
interface Item {
|
||||
/** The system-specific data */
|
||||
system: any;
|
||||
};
|
||||
|
|
@ -4,7 +4,7 @@ import stylistic from "@stylistic/eslint-plugin";
|
|||
|
||||
export default [
|
||||
// Tell eslint to ignore files that I don't mind being formatted slightly differently
|
||||
{ ignores: [ `scripts/`, `foundry/` ] },
|
||||
{ ignores: [ `scripts/` ] },
|
||||
{
|
||||
languageOptions: {
|
||||
globals: globals.browser,
|
||||
|
|
@ -75,7 +75,7 @@ export default [
|
|||
"@stylistic/eol-last": `warn`,
|
||||
"@stylistic/operator-linebreak": [`warn`, `before`],
|
||||
"@stylistic/indent": [`warn`, `tab`],
|
||||
"@stylistic/brace-style": [`warn`, `stroustrup`, { "allowSingleLine": true }],
|
||||
"@stylistic/brace-style": [`warn`, `1tbs`, { "allowSingleLine": true }],
|
||||
"@stylistic/quotes": [`warn`, `backtick`, { "avoidEscape": true }],
|
||||
"@stylistic/comma-dangle": [`warn`, { arrays: `always-multiline`, objects: `always-multiline`, imports: `always-multiline`, exports: `always-multiline`, functions: `always-multiline` }],
|
||||
"@stylistic/comma-style": [`warn`, `last`],
|
||||
|
|
|
|||
|
|
@ -1,19 +1,11 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"module": "es2022",
|
||||
"target": "es2022",
|
||||
"types": [
|
||||
"./augments.d.ts"
|
||||
],
|
||||
"paths": {
|
||||
"@client/*": ["./foundry/client/*"],
|
||||
"@common/*": ["./foundry/common/*"],
|
||||
}
|
||||
"module": "ES2020",
|
||||
"target": "ES2020"
|
||||
},
|
||||
"include": [
|
||||
"module/**/*",
|
||||
"foundry/client/client.mjs",
|
||||
"foundry/client/global.d.mts",
|
||||
"foundry/common/primitives/global.d.mts"
|
||||
]
|
||||
"exclude": ["node_modules", "**/node_modules/*"],
|
||||
"include": ["module/**/*", "foundry.v13.link/client/**/*.js", "foundry.v13.link/**/*.mjs"],
|
||||
"typeAcquisition": {
|
||||
"include": ["jquery"]
|
||||
}
|
||||
}
|
||||
|
|
@ -17,7 +17,6 @@
|
|||
"RipCrypt": {
|
||||
"sheet-names": {
|
||||
"AllItemsSheetV1": "RipCrypt Item Sheet",
|
||||
"ArmourSheet": "Armour Sheet",
|
||||
"CombinedHeroSheet": "Hero Sheet",
|
||||
"StatsCardV1": "Hero Stat Card",
|
||||
"CraftCardV1": "Hero Craft Card",
|
||||
|
|
@ -155,14 +154,9 @@
|
|||
"both": "Notification and Pause Game",
|
||||
"nothing": "Do Nothing"
|
||||
}
|
||||
},
|
||||
"allowUpdateSandsSocket": {
|
||||
"name": "Player Haste Updates the Sands of Fate",
|
||||
"hint": "This setting determines if when a player makes a haste check that the result will automatically be applied to the global Sands of Fate. Disabling this is good if you want to let players roll without needing to worry about automation messing anything up while they spam rolls."
|
||||
}
|
||||
},
|
||||
"Apps": {
|
||||
"damage-reduction": "@RipCrypt.common.damage reduction",
|
||||
"traits-range": "@RipCrypt.common.traits & @RipCrypt.common.range",
|
||||
"grit-skills": "@RipCrypt.common.abilities.grit Skills",
|
||||
"gait-skills": "@RipCrypt.common.abilities.gait Skills",
|
||||
|
|
@ -190,18 +184,13 @@
|
|||
"star-button-tooltip": "Add Star",
|
||||
"unstar-button": "Remove {name} as a starred ammo",
|
||||
"unstar-button-tooltip": "Remove Star"
|
||||
},
|
||||
"protects-the-location": "Protects your {part}"
|
||||
}
|
||||
},
|
||||
"notifs": {
|
||||
"error": {
|
||||
"cannot-equip": "Cannot equip the {itemType}, see console for more details.",
|
||||
"invalid-delta": "The delta for \"{name}\" is not a number, cannot finish processing the action.",
|
||||
"at-favourite-limit": "Cannot favourite more than three items, unfavourite one to make space.",
|
||||
"invalid-socket": "Invalid socket data received, this means a module or system bug is present.",
|
||||
"unknown-socket-event": "An unknown socket event was received: {event}",
|
||||
"no-active-gm": "No active @USER.GM is logged in, you must wait for a @USER.GM to be active before you can do that.",
|
||||
"malformed-socket-payload": "Socket event \"{event}\" received with malformed payload. Details: {details}"
|
||||
"at-favourite-limit": "Cannot favourite more than three items, unfavourite one to make space."
|
||||
},
|
||||
"warn": {
|
||||
"cannot-go-negative": "\"{name}\" is unable to be a negative number."
|
||||
|
|
@ -214,7 +203,6 @@
|
|||
"shield-bonus": "Shield Bonus: {value}",
|
||||
"set-fate-to": "Set Fate to {ordinal}",
|
||||
"current-tour": "Current Delve Tour",
|
||||
"create-new-item": "Create new item",
|
||||
"next-tour": "Next Delve Tour",
|
||||
"prev-tour": "Previous Delve Tour",
|
||||
"auras": {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import { CraftCardV1 } from "./CraftCardV1.mjs";
|
||||
import { filePath } from "../../consts.mjs";
|
||||
import { GenericAppMixin } from "../GenericApp.mjs";
|
||||
import { Logger } from "../../utils/Logger.mjs";
|
||||
import { SkillsCardV1 } from "./SkillsCardV1.mjs";
|
||||
import { StatsCardV1 } from "./StatsCardV1.mjs";
|
||||
|
||||
|
|
@ -22,9 +23,7 @@ export class CombinedHeroSheet extends GenericAppMixin(HandlebarsApplicationMixi
|
|||
window: {
|
||||
resizable: false,
|
||||
},
|
||||
actions: {
|
||||
...StatsCardV1.DEFAULT_OPTIONS.actions,
|
||||
},
|
||||
actions: {},
|
||||
form: {
|
||||
submitOnChange: true,
|
||||
closeOnSubmit: false,
|
||||
|
|
@ -107,6 +106,7 @@ export class CombinedHeroSheet extends GenericAppMixin(HandlebarsApplicationMixi
|
|||
};
|
||||
};
|
||||
|
||||
Logger.debug(`Context keys:`, Object.keys(ctx));
|
||||
return ctx;
|
||||
};
|
||||
// #endregion
|
||||
|
|
|
|||
|
|
@ -115,8 +115,7 @@ export class CraftCardV1 extends GenericAppMixin(HandlebarsApplicationMixin(Acto
|
|||
const length = crafts.length;
|
||||
if (length >= limit) {
|
||||
crafts = crafts.slice(0, limit);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
crafts = crafts
|
||||
.concat(Array(limit - length).fill(null))
|
||||
.slice(0, limit);
|
||||
|
|
|
|||
|
|
@ -194,8 +194,7 @@ export class SkillsCardV1 extends GenericAppMixin(HandlebarsApplicationMixin(Act
|
|||
const length = ctx.skills[ability].length;
|
||||
if (length >= limit) {
|
||||
ctx.skills[ability] = ctx.skills[ability].slice(0, limit);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
ctx.skills[ability] = ctx.skills[ability]
|
||||
.concat(Array(limit - length).fill(null))
|
||||
.slice(0, limit);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import { deleteItemFromElement, editItemFromElement } from "../utils.mjs";
|
||||
import { DelveDiceHUD } from "../DelveDiceHUD.mjs";
|
||||
import { filePath } from "../../consts.mjs";
|
||||
import { gameTerms } from "../../gameTerms.mjs";
|
||||
import { GenericAppMixin } from "../GenericApp.mjs";
|
||||
|
|
@ -26,7 +25,6 @@ export class StatsCardV1 extends GenericAppMixin(HandlebarsApplicationMixin(Acto
|
|||
resizable: false,
|
||||
},
|
||||
actions: {
|
||||
rollForHaste: DelveDiceHUD.rollForHaste,
|
||||
},
|
||||
form: {
|
||||
submitOnChange: true,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ import { Logger } from "../utils/Logger.mjs";
|
|||
|
||||
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
||||
const { ContextMenu } = foundry.applications.ux;
|
||||
const { Roll } = foundry.dice;
|
||||
const { FatePath } = gameTerms;
|
||||
|
||||
const CompassRotations = {
|
||||
|
|
@ -88,8 +87,7 @@ export class DelveDiceHUD extends HandlebarsApplicationMixin(ApplicationV2) {
|
|||
const existing = document.getElementById(element.id);
|
||||
if (existing) {
|
||||
existing.replaceWith(element);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
const parent = document.getElementById(`ui-top`);
|
||||
parent.prepend(element);
|
||||
};
|
||||
|
|
@ -191,7 +189,18 @@ export class DelveDiceHUD extends HandlebarsApplicationMixin(ApplicationV2) {
|
|||
/** @this {DelveDiceHUD} */
|
||||
static async #tourDelta(_event, element) {
|
||||
const delta = parseInt(element.dataset.delta);
|
||||
await this.sandsOfFateDelta(delta);
|
||||
const initial = game.settings.get(`ripcrypt`, `sandsOfFateInitial`);
|
||||
let newSands = this._sandsOfFate + delta;
|
||||
|
||||
if (newSands > initial) {
|
||||
Logger.info(`Cannot go to a previous Delve Tour above the initial value`);
|
||||
return;
|
||||
};
|
||||
|
||||
if (newSands === 0) {
|
||||
newSands = initial;
|
||||
await this.alertCrypticEvent();
|
||||
};
|
||||
|
||||
switch (Math.sign(delta)) {
|
||||
case -1: {
|
||||
|
|
@ -203,6 +212,9 @@ export class DelveDiceHUD extends HandlebarsApplicationMixin(ApplicationV2) {
|
|||
break;
|
||||
}
|
||||
};
|
||||
|
||||
this.#animateSandsTo(newSands);
|
||||
game.settings.set(`ripcrypt`, `sandsOfFate`, newSands);
|
||||
};
|
||||
|
||||
/** @this {DelveDiceHUD} */
|
||||
|
|
@ -229,77 +241,11 @@ export class DelveDiceHUD extends HandlebarsApplicationMixin(ApplicationV2) {
|
|||
localizer(`RipCrypt.notifs.info.cryptic-event-alert`),
|
||||
{ console: false },
|
||||
);
|
||||
game.socket.emit(`system.ripcrypt`, {
|
||||
event: `notify`,
|
||||
payload: {
|
||||
message: `RipCrypt.notifs.info.cryptic-event-alert`,
|
||||
type: `info`,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
if ([`both`, `pause`].includes(alertType) && game.user.isGM) {
|
||||
game.togglePause(true, { broadcast: true });
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Changes the current Sands of Fate by an amount provided, animating the
|
||||
* @param {number} delta The amount of change
|
||||
*/
|
||||
async sandsOfFateDelta(delta) {
|
||||
const initial = game.settings.get(`ripcrypt`, `sandsOfFateInitial`);
|
||||
let newSands = this._sandsOfFate + delta;
|
||||
|
||||
if (newSands > initial) {
|
||||
Logger.info(`Cannot increase the Sands of Fate to a value about the initial`);
|
||||
return;
|
||||
};
|
||||
|
||||
if (newSands === 0) {
|
||||
newSands = initial;
|
||||
await this.alertCrypticEvent();
|
||||
};
|
||||
|
||||
this.#animateSandsTo(newSands);
|
||||
game.settings.set(`ripcrypt`, `sandsOfFate`, newSands);
|
||||
};
|
||||
|
||||
/**
|
||||
* A helper method that rolls the dice required for hasty turns while delving
|
||||
* and adjusts the Sands of Fate accordingly
|
||||
*/
|
||||
static async rollForHaste() {
|
||||
const shouldUpdateSands = game.settings.get(`ripcrypt`, `allowUpdateSandsSocket`);
|
||||
if (shouldUpdateSands && game.users.activeGM == null) {
|
||||
ui.notifications.error(localizer(`RipCrypt.notifs.error.no-active-gm`));
|
||||
return;
|
||||
};
|
||||
|
||||
const roll = new Roll(`1d8xo=1`);
|
||||
await roll.evaluate();
|
||||
|
||||
let delta = 0;
|
||||
if (roll.dice[0].results[0].exploded) {
|
||||
delta = -1;
|
||||
if (roll.dice[0].results[1].result === 1) {
|
||||
delta = -2;
|
||||
};
|
||||
};
|
||||
|
||||
roll.toMessage({ flavor: `Haste Check` });
|
||||
|
||||
// Change the Sands of Fate setting if required
|
||||
if (delta === 0 || !shouldUpdateSands) { return };
|
||||
if (game.user.isActiveGM) {
|
||||
ui.delveDice.sandsOfFateDelta(delta);
|
||||
}
|
||||
else {
|
||||
game.socket.emit(`system.ripcrypt`, {
|
||||
event: `updateSands`,
|
||||
payload: { delta },
|
||||
});
|
||||
};
|
||||
};
|
||||
// #endregion
|
||||
};
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ import { RichEditor } from "./RichEditor.mjs";
|
|||
import { toBoolean } from "../consts.mjs";
|
||||
|
||||
/**
|
||||
* A mixin that takes the class from HandlebarsApplicationMixin and combines it
|
||||
* with utility functions / data that is used across all RipCrypt applications
|
||||
* A mixin that takes the class from HandlebarsApplicationMixin and
|
||||
*/
|
||||
export function GenericAppMixin(HandlebarsApp) {
|
||||
class GenericRipCryptApp extends HandlebarsApp {
|
||||
|
|
@ -92,9 +91,8 @@ export function GenericAppMixin(HandlebarsApp) {
|
|||
ctx.meta.idp = this.document?.uuid ?? this.id;
|
||||
if (this.document) {
|
||||
ctx.meta.limited = this.document.limited;
|
||||
ctx.meta.editable = this.isEditable || game.user.isGM;
|
||||
ctx.meta.embedded = this.document.isEmbedded;
|
||||
};
|
||||
ctx.meta.editable = ctx.editable;
|
||||
}
|
||||
delete ctx.editable;
|
||||
|
||||
return ctx;
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ export class AllItemSheetV1 extends GenericAppMixin(HandlebarsApplicationMixin(I
|
|||
await super._processSubmitData(...args);
|
||||
|
||||
if (this.document.system.forceRerender) {
|
||||
await this.render();
|
||||
await this.render(false);
|
||||
};
|
||||
};
|
||||
// #endregion
|
||||
|
|
|
|||
|
|
@ -1,135 +0,0 @@
|
|||
import { filePath } from "../../consts.mjs";
|
||||
import { gameTerms } from "../../gameTerms.mjs";
|
||||
import { GenericAppMixin } from "../GenericApp.mjs";
|
||||
|
||||
const { HandlebarsApplicationMixin } = foundry.applications.api;
|
||||
const { ItemSheetV2 } = foundry.applications.sheets;
|
||||
const { getProperty, hasProperty, setProperty } = foundry.utils;
|
||||
|
||||
export class ArmourSheet extends GenericAppMixin(HandlebarsApplicationMixin(ItemSheetV2)) {
|
||||
|
||||
// #region Options
|
||||
static DEFAULT_OPTIONS = {
|
||||
classes: [
|
||||
`ripcrypt--item`,
|
||||
`ArmourSheet`,
|
||||
],
|
||||
position: {
|
||||
width: `auto`,
|
||||
height: `auto`,
|
||||
},
|
||||
window: {
|
||||
resizable: false,
|
||||
},
|
||||
form: {
|
||||
submitOnChange: true,
|
||||
closeOnSubmit: false,
|
||||
},
|
||||
};
|
||||
|
||||
static PARTS = {
|
||||
header: {
|
||||
template: filePath(`templates/Apps/partials/item-header.hbs`),
|
||||
},
|
||||
content: {
|
||||
template: filePath(`templates/Apps/ArmourSheet/content.hbs`),
|
||||
},
|
||||
};
|
||||
// #endregion
|
||||
|
||||
// #region Lifecycle
|
||||
async _onRender() {
|
||||
// remove the flag if it exists when we render the sheet
|
||||
delete this.document?.system?.forceRerender;
|
||||
};
|
||||
|
||||
/**
|
||||
* Used to make it so that items that don't get updated because of the
|
||||
* _preUpdate hook removing/changing the data submitted, can still get
|
||||
* re-rendered when the diff is empty. If the document does get updated,
|
||||
* this rerendering does not happen.
|
||||
*
|
||||
* @override
|
||||
*/
|
||||
async _processSubmitData(...args) {
|
||||
await super._processSubmitData(...args);
|
||||
|
||||
if (this.document.system.forceRerender) {
|
||||
await this.render();
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Customize how form data is extracted into an expanded object.
|
||||
* @param {SubmitEvent|null} event The originating form submission event
|
||||
* @param {HTMLFormElement} form The form element that was submitted
|
||||
* @param {FormDataExtended} formData Processed data for the submitted form
|
||||
* @returns {object} An expanded object of processed form data
|
||||
* @throws {Error} Subclasses may throw validation errors here to prevent form submission
|
||||
* @protected
|
||||
*/
|
||||
_processFormData(event, form, formData) {
|
||||
const data = super._processFormData(event, form, formData);
|
||||
|
||||
if (hasProperty(data, `system.location`)) {
|
||||
let locations = getProperty(data, `system.location`);
|
||||
locations = locations.filter(value => value != null);
|
||||
setProperty(data, `system.location`, locations);
|
||||
};
|
||||
|
||||
return data;
|
||||
};
|
||||
// #endregion
|
||||
|
||||
// #region Data Prep
|
||||
async _preparePartContext(partId, _, opts) {
|
||||
const ctx = await super._preparePartContext(partId, {}, opts);
|
||||
|
||||
ctx.item = this.document;
|
||||
ctx.system = this.document.system;
|
||||
|
||||
switch (partId) {
|
||||
case `content`: {
|
||||
this._prepareContentContext(ctx, opts);
|
||||
break;
|
||||
};
|
||||
};
|
||||
|
||||
return ctx;
|
||||
};
|
||||
|
||||
async _prepareContentContext(ctx) {
|
||||
ctx.weights = [
|
||||
{
|
||||
label: `RipCrypt.common.empty`,
|
||||
value: null,
|
||||
},
|
||||
...Object.values(gameTerms.WeightRatings).map(opt => ({
|
||||
label: `RipCrypt.common.weightRatings.${opt}`,
|
||||
value: opt,
|
||||
})),
|
||||
];
|
||||
|
||||
ctx.accesses = [
|
||||
{
|
||||
label: `RipCrypt.common.empty`,
|
||||
value: ``,
|
||||
},
|
||||
...gameTerms.Access.map(opt => ({
|
||||
label: `RipCrypt.common.accessLevels.${opt}`,
|
||||
value: opt,
|
||||
})),
|
||||
];
|
||||
|
||||
ctx.protects = {
|
||||
head: this.document.system.location.has(gameTerms.Anatomy.HEAD),
|
||||
body: this.document.system.location.has(gameTerms.Anatomy.BODY),
|
||||
arms: this.document.system.location.has(gameTerms.Anatomy.ARMS),
|
||||
legs: this.document.system.location.has(gameTerms.Anatomy.LEGS),
|
||||
};
|
||||
};
|
||||
// #endregion
|
||||
|
||||
// #region Actions
|
||||
// #endregion
|
||||
};
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
import { filePath } from "../../consts.mjs";
|
||||
import { StyledShadowElement } from "./mixins/StyledShadowElement.mjs";
|
||||
|
||||
const { renderTemplate } = foundry.applications.handlebars;
|
||||
|
||||
export class ArmourSummary extends StyledShadowElement(HTMLElement) {
|
||||
static elementName = `armour-summary`;
|
||||
static formAssociated = false;
|
||||
|
||||
/* Stuff for the mixin to use */
|
||||
static _stylePath = `css/components/armour-summary.css`;
|
||||
#container;
|
||||
|
||||
get type() {
|
||||
return this.getAttribute(`type`) ?? `hero`;
|
||||
};
|
||||
|
||||
set type(newValue) {
|
||||
this.setAttribute(`type`, newValue);
|
||||
};
|
||||
|
||||
_mounted = false;
|
||||
async connectedCallback() {
|
||||
super.connectedCallback();
|
||||
if (this._mounted) { return };
|
||||
|
||||
/*
|
||||
This converts all of the double-dash prefixed properties on the element to
|
||||
CSS variables so that they don't all need to be provided by doing style=""
|
||||
*/
|
||||
for (const attrVar of this.attributes) {
|
||||
if (attrVar.name?.startsWith(`var:`)) {
|
||||
const prop = attrVar.name.replace(`var:`, ``);
|
||||
this.style.setProperty(`--` + prop, attrVar.value);
|
||||
};
|
||||
};
|
||||
|
||||
this.#container = document.createElement(`div`);
|
||||
this.#container.classList = `person`;
|
||||
|
||||
this.#container.innerHTML = await renderTemplate(
|
||||
filePath(`templates/components/armour-summary.hbs`),
|
||||
{ type: this.type },
|
||||
);
|
||||
|
||||
this._shadow.appendChild(this.#container);
|
||||
|
||||
this._mounted = true;
|
||||
};
|
||||
|
||||
disconnectedCallback() {
|
||||
super.disconnectedCallback();
|
||||
if (!this._mounted) { return };
|
||||
this._mounted = false;
|
||||
};
|
||||
};
|
||||
|
|
@ -1,11 +1,9 @@
|
|||
import { ArmourSummary } from "./ArmourSummary.mjs";
|
||||
import { Logger } from "../../utils/Logger.mjs";
|
||||
import { RipCryptBorder } from "./RipCryptBorder.mjs";
|
||||
import { RipCryptIcon } from "./Icon.mjs";
|
||||
import { RipCryptSVGLoader } from "./svgLoader.mjs";
|
||||
|
||||
const components = [
|
||||
ArmourSummary,
|
||||
RipCryptIcon,
|
||||
RipCryptSVGLoader,
|
||||
RipCryptBorder,
|
||||
|
|
@ -51,8 +51,7 @@ export function StyledShadowElement(Base) {
|
|||
const stylePath = this.constructor._stylePath;
|
||||
if (this.constructor._styles.has(stylePath)) {
|
||||
this._style.innerHTML = this.constructor._styles.get(stylePath);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
fetch(`./systems/${game.system.id}/templates/${stylePath}`)
|
||||
.then(r => r.text())
|
||||
.then(t => {
|
||||
|
|
@ -11,7 +11,7 @@ export async function createItemFromElement(target, { parent } = {}) {
|
|||
const type = data.defaultItemType;
|
||||
await Item.createDialog(
|
||||
{ type },
|
||||
{ parent, showEquipPrompt: false },
|
||||
{ parent },
|
||||
{
|
||||
types,
|
||||
folders: [],
|
||||
|
|
@ -40,7 +40,7 @@ export async function deleteItemFromElement(target) {
|
|||
const itemId = itemEl.dataset.itemId;
|
||||
if (!itemId) { return };
|
||||
const item = await fromUuid(itemId);
|
||||
item.deleteDialog();
|
||||
item.delete();
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -42,11 +42,9 @@ export function toBoolean(val) {
|
|||
export function documentSorter(a, b) {
|
||||
if (!a && !b) {
|
||||
return 0;
|
||||
}
|
||||
else if (!a) {
|
||||
} else if (!a) {
|
||||
return 1;
|
||||
}
|
||||
else if (!b) {
|
||||
} else if (!b) {
|
||||
return -1;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -155,11 +155,6 @@ export class EntityData extends foundry.abstract.TypeDataModel {
|
|||
};
|
||||
|
||||
// #region Getters
|
||||
get equippedWeapons() {
|
||||
const weapons = this.parent.itemTypes.weapon;
|
||||
return weapons.filter(w => w.system.equipped);
|
||||
};
|
||||
|
||||
get equippedArmour() {
|
||||
const armours = this.parent.itemTypes.armour;
|
||||
const slots = Object.fromEntries(
|
||||
|
|
|
|||
|
|
@ -4,13 +4,12 @@ import { localizer } from "../../utils/Localizer.mjs";
|
|||
import { Logger } from "../../utils/Logger.mjs";
|
||||
import { requiredInteger } from "../helpers.mjs";
|
||||
|
||||
const { diffObject, getProperty, setProperty } = foundry.utils;
|
||||
const { DialogV2 } = foundry.applications.api;
|
||||
const { fields } = foundry.data;
|
||||
const { hasProperty, diffObject, mergeObject } = foundry.utils;
|
||||
|
||||
/** Used for Armour and Shields */
|
||||
export class ArmourData extends CommonItemData {
|
||||
// #region Schema
|
||||
// MARK: Schema
|
||||
static defineSchema() {
|
||||
return {
|
||||
...super.defineSchema(),
|
||||
|
|
@ -20,16 +19,16 @@ export class ArmourData extends CommonItemData {
|
|||
blank: false,
|
||||
trim: true,
|
||||
nullable: false,
|
||||
required: true,
|
||||
options: Object.values(gameTerms.Anatomy),
|
||||
}),
|
||||
{
|
||||
nullable: false,
|
||||
initial: [],
|
||||
required: true,
|
||||
},
|
||||
),
|
||||
equipped: new fields.BooleanField({
|
||||
initial: false,
|
||||
required: true,
|
||||
nullable: false,
|
||||
}),
|
||||
weight: new fields.StringField({
|
||||
|
|
@ -40,30 +39,27 @@ export class ArmourData extends CommonItemData {
|
|||
}),
|
||||
};
|
||||
};
|
||||
// #endregion Schema
|
||||
|
||||
// #region Lifecycle
|
||||
async _preCreate(item, options) {
|
||||
const showEquipPrompt = options.showEquipPrompt ?? true;
|
||||
if (showEquipPrompt && this.parent.isEmbedded && this._canEquip()) {
|
||||
const shouldEquip = await DialogV2.confirm({
|
||||
window: { title: `Equip Item?` },
|
||||
content: `Do you want to equip ${item.name}?`,
|
||||
});
|
||||
if (shouldEquip) {
|
||||
this.updateSource({ "equipped": true });
|
||||
};
|
||||
};
|
||||
// MARK: Base Data
|
||||
prepareBaseData() {
|
||||
super.prepareBaseData();
|
||||
};
|
||||
|
||||
// MARK: Derived Data
|
||||
prepareDerivedData() {
|
||||
super.prepareDerivedData();
|
||||
};
|
||||
|
||||
// #region Lifecycle
|
||||
async _preUpdate(changes, options, user) {
|
||||
// return false
|
||||
if (options.force && game.settings.get(`ripcrypt`, `devMode`)) { return };
|
||||
|
||||
// Ensure changes is a diffed object
|
||||
const diff = diffObject(this.parent._source, changes);
|
||||
let valid = await super._preUpdate(changes, options, user);
|
||||
|
||||
if (getProperty(diff, `system.equipped`) && !this._canEquip()) {
|
||||
if (hasProperty(diff, `system.equipped`) && !this._canEquip()) {
|
||||
ui.notifications.error(
|
||||
localizer(
|
||||
`RipCrypt.notifs.error.cannot-equip`,
|
||||
|
|
@ -73,7 +69,9 @@ export class ArmourData extends CommonItemData {
|
|||
);
|
||||
|
||||
// Don't stop the update, but don't allow changing the equipped status
|
||||
setProperty(changes, `system.equipped`, false);
|
||||
mergeObject(changes, {
|
||||
"system.equipped": false,
|
||||
});
|
||||
|
||||
// Set a flag so that we can tell the sheet that it needs to rerender
|
||||
this.forceRerender = true;
|
||||
|
|
@ -81,13 +79,8 @@ export class ArmourData extends CommonItemData {
|
|||
|
||||
return valid;
|
||||
};
|
||||
// #endregion Lifecycle
|
||||
|
||||
// #region Helpers
|
||||
/**
|
||||
* Used to tell the preUpdate logic whether or not to prevent the item from
|
||||
* being equipped or not.
|
||||
*/
|
||||
/** Used to tell the preUpdate logic whether or not to prevent the */
|
||||
_canEquip() {
|
||||
const parent = this.parent;
|
||||
if (!parent.isEmbedded || !(parent.parent instanceof Actor)) {
|
||||
|
|
@ -101,7 +94,7 @@ export class ArmourData extends CommonItemData {
|
|||
};
|
||||
|
||||
const slots = parent.parent.system.equippedArmour ?? {};
|
||||
|
||||
Logger.debug(`slots`, slots);
|
||||
for (const locationTag of this.location) {
|
||||
if (slots[locationTag.toLowerCase()] != null) {
|
||||
Logger.error(`Unable to equip multiple items in the same slot`);
|
||||
|
|
@ -110,9 +103,97 @@ export class ArmourData extends CommonItemData {
|
|||
};
|
||||
return true;
|
||||
};
|
||||
// #endregion
|
||||
|
||||
// #region Getters
|
||||
get locationString() {
|
||||
return [...this.location].join(`, `);
|
||||
};
|
||||
// #endregion Helpers
|
||||
// #endregion
|
||||
|
||||
// #region Sheet Data
|
||||
getFormFields(_ctx) {
|
||||
const fields = [
|
||||
{
|
||||
id: `quantity`,
|
||||
type: `integer`,
|
||||
label: `RipCrypt.common.quantity`,
|
||||
path: `system.quantity`,
|
||||
value: this.quantity,
|
||||
min: 0,
|
||||
},
|
||||
{
|
||||
id: `access`,
|
||||
type: `dropdown`,
|
||||
label: `RipCrypt.common.access`,
|
||||
path: `system.access`,
|
||||
value: this.access,
|
||||
limited: false,
|
||||
options: [
|
||||
{
|
||||
label: `RipCrypt.common.empty`,
|
||||
value: ``,
|
||||
},
|
||||
...gameTerms.Access.map(opt => ({
|
||||
label: `RipCrypt.common.accessLevels.${opt}`,
|
||||
value: opt,
|
||||
})),
|
||||
],
|
||||
},
|
||||
{
|
||||
id: `cost`,
|
||||
type: `cost`,
|
||||
label: `RipCrypt.common.cost`,
|
||||
gold: this.cost.gold,
|
||||
silver: this.cost.silver,
|
||||
copper: this.cost.copper,
|
||||
},
|
||||
{
|
||||
id: `weight`,
|
||||
type: `dropdown`,
|
||||
label: `RipCrypt.common.weightRating`,
|
||||
path: `system.weight`,
|
||||
value: this.weight,
|
||||
options: [
|
||||
{
|
||||
label: `RipCrypt.common.empty`,
|
||||
value: null,
|
||||
},
|
||||
...Object.values(gameTerms.WeightRatings).map(opt => ({
|
||||
label: `RipCrypt.common.weightRatings.${opt}`,
|
||||
value: opt,
|
||||
})),
|
||||
],
|
||||
},
|
||||
{
|
||||
id: `location`,
|
||||
type: `string-set`,
|
||||
label: `RipCrypt.common.location`,
|
||||
placeholder: `RipCrypt.Apps.location-placeholder`,
|
||||
path: `system.location`,
|
||||
value: this.locationString,
|
||||
},
|
||||
{
|
||||
id: `protection`,
|
||||
type: `integer`,
|
||||
label: `RipCrypt.common.protection`,
|
||||
value: this.protection,
|
||||
path: `system.protection`,
|
||||
min: 0,
|
||||
},
|
||||
];
|
||||
|
||||
if (this.parent.isEmbedded) {
|
||||
fields.push({
|
||||
id: `equipped`,
|
||||
type: `boolean`,
|
||||
label: `RipCrypt.common.equipped`,
|
||||
value: this.equipped,
|
||||
path: `system.equipped`,
|
||||
});
|
||||
};
|
||||
|
||||
return fields;
|
||||
};
|
||||
// #endregion
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2,14 +2,12 @@ import { barAttribute, optionalInteger, requiredInteger } from "../helpers.mjs";
|
|||
import { CommonItemData } from "./Common.mjs";
|
||||
import { gameTerms } from "../../gameTerms.mjs";
|
||||
import { localizer } from "../../utils/Localizer.mjs";
|
||||
import { Logger } from "../../utils/Logger.mjs";
|
||||
|
||||
const { diffObject, getProperty, setProperty } = foundry.utils;
|
||||
const { DialogV2 } = foundry.applications.api;
|
||||
const { fields } = foundry.data;
|
||||
const { hasProperty, mergeObject } = foundry.utils;
|
||||
|
||||
export class WeaponData extends CommonItemData {
|
||||
// #region Schema
|
||||
// MARK: Schema
|
||||
static defineSchema() {
|
||||
return {
|
||||
...super.defineSchema(),
|
||||
|
|
@ -43,69 +41,39 @@ export class WeaponData extends CommonItemData {
|
|||
}),
|
||||
};
|
||||
};
|
||||
// #endregion Schema
|
||||
|
||||
// #region Lifecycle
|
||||
async _preCreate(item, options) {
|
||||
const showEquipPrompt = options.showEquipPrompt ?? true;
|
||||
if (showEquipPrompt && this.parent.isEmbedded && this._canEquip()) {
|
||||
const shouldEquip = await DialogV2.confirm({
|
||||
window: { title: `Equip Item?` },
|
||||
content: `Do you want to equip ${item.name}?`,
|
||||
});
|
||||
if (shouldEquip) {
|
||||
this.updateSource({ "equipped": true });
|
||||
};
|
||||
};
|
||||
// MARK: Base Data
|
||||
prepareBaseData() {
|
||||
super.prepareBaseData();
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {*} changes The expanded object that was used for the update
|
||||
* @param {*} options
|
||||
* @param {*} user
|
||||
* @returns
|
||||
*/
|
||||
// MARK: Derived Data
|
||||
prepareDerivedData() {
|
||||
super.prepareDerivedData();
|
||||
};
|
||||
|
||||
// #region Lifecycle
|
||||
async _preUpdate(changes, options, user) {
|
||||
if (options.force && game.settings.get(`ripcrypt`, `devMode`)) { return };
|
||||
|
||||
const diff = diffObject(this.parent._source, changes);
|
||||
let valid = super._preUpdate(changes, options, user);
|
||||
|
||||
if (getProperty(diff, `system.equipped`) && !this._canEquip()) {
|
||||
if (hasProperty(changes, `system.equipped`) && !this.parent.isEmbedded) {
|
||||
ui.notifications.error(localizer(
|
||||
`RipCrypt.notifs.error.cannot-equip`,
|
||||
`RipCrypt.notifs.error.cannot-equip-not-embedded`,
|
||||
{ itemType: `@TYPES.Item.${this.parent.type}` },
|
||||
));
|
||||
|
||||
// Don't stop the update, but don't allow changing the equipped status
|
||||
setProperty(changes, `system.equipped`, false);
|
||||
|
||||
// Set a flag so that we can tell the sheet that it needs to rerender
|
||||
this.forceRerender = true;
|
||||
mergeObject(
|
||||
changes,
|
||||
{ "-=system.equipped": null },
|
||||
{ inplace: true, performDeletions: true },
|
||||
);
|
||||
return false;
|
||||
};
|
||||
return valid;
|
||||
};
|
||||
// #endregion Lifecycle
|
||||
|
||||
// #region Helpers
|
||||
/**
|
||||
* Used to tell the preUpdate logic whether or not to prevent the item from
|
||||
* being equipped or not.
|
||||
*/
|
||||
_canEquip() {
|
||||
const parent = this.parent;
|
||||
if (!parent.isEmbedded || !(parent.parent instanceof Actor)) {
|
||||
Logger.error(`Unable to equip item when it's not embedded`);
|
||||
return false;
|
||||
};
|
||||
const actor = this.parent.parent.system;
|
||||
if (actor.equippedWeapons?.length >= actor.limit.weapons) {
|
||||
return false;
|
||||
};
|
||||
return true;
|
||||
};
|
||||
// #endregion
|
||||
|
||||
// #region Getters
|
||||
get traitString() {
|
||||
return [...this.traits].join(`, `);
|
||||
};
|
||||
|
|
@ -116,7 +84,7 @@ export class WeaponData extends CommonItemData {
|
|||
};
|
||||
return String(this.range.short ?? this.range.long ?? ``);
|
||||
};
|
||||
// #endregion Helpers
|
||||
// #endregion
|
||||
|
||||
// #region Sheet Data
|
||||
async getFormFields(_ctx) {
|
||||
|
|
@ -199,8 +167,7 @@ export class WeaponData extends CommonItemData {
|
|||
value: this.range.long,
|
||||
},
|
||||
});
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
fields.push({
|
||||
id: `short-range`,
|
||||
type: `integer`,
|
||||
|
|
@ -258,5 +225,5 @@ export class WeaponData extends CommonItemData {
|
|||
|
||||
return fields;
|
||||
};
|
||||
// #endregion Sheet Data
|
||||
// #endregion
|
||||
};
|
||||
|
|
|
|||
|
|
@ -38,8 +38,7 @@ export class CryptDie extends Die {
|
|||
if (almostCrypted) {
|
||||
this.ripCryptState = `crypted`;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
almostCrypted = true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,8 +16,7 @@ export class RipCryptCombat extends Combat {
|
|||
|
||||
if (groups.has(groupKey)) {
|
||||
groups.get(groupKey).push(combatant);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
groups.set(groupKey, [combatant]);
|
||||
};
|
||||
};
|
||||
|
|
@ -130,8 +129,7 @@ export class RipCryptCombat extends Combat {
|
|||
const currentToken = this.combatant?.token?._object;
|
||||
if (!tokenGroup && currentToken) {
|
||||
currentToken.renderFlags.set({refreshTurnMarker: true});
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
const group = this.customGroups.get(tokenGroup) ?? [];
|
||||
for (const combatant of group) {
|
||||
combatant.token?._object?.renderFlags.set({ refreshTurnMarker: true });
|
||||
|
|
|
|||
|
|
@ -28,8 +28,7 @@ export class RipCryptCombatant extends Combatant {
|
|||
const disposition = this.disposition;
|
||||
if (disposition === `unknown`) {
|
||||
total += 0.25;
|
||||
}
|
||||
else if (whoFirst !== disposition) {
|
||||
} else if (whoFirst !== disposition) {
|
||||
total += 0.5;
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -26,8 +26,7 @@ export class RipCryptToken extends Token {
|
|||
};
|
||||
canvas.tokens.turnMarkers.add(this);
|
||||
this.turnMarker.draw();
|
||||
}
|
||||
else if (this.turnMarker) {
|
||||
} else if (this.turnMarker) {
|
||||
canvas.tokens.turnMarkers.delete(this);
|
||||
this.turnMarker.destroy();
|
||||
this.turnMarker = null;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
// Applications
|
||||
import { AllItemSheetV1 } from "../Apps/ItemSheets/AllItemSheetV1.mjs";
|
||||
import { ArmourSheet } from "../Apps/ItemSheets/ArmourSheet.mjs";
|
||||
import { CombinedHeroSheet } from "../Apps/ActorSheets/CombinedHeroSheet.mjs";
|
||||
import { CraftCardV1 } from "../Apps/ActorSheets/CraftCardV1.mjs";
|
||||
import { DelveDiceHUD } from "../Apps/DelveDiceHUD.mjs";
|
||||
|
|
@ -31,14 +30,14 @@ import { RipCryptToken } from "../documents/token.mjs";
|
|||
// Misc
|
||||
import helpers from "../handlebarHelpers/_index.mjs";
|
||||
import { Logger } from "../utils/Logger.mjs";
|
||||
import { registerCustomComponents } from "../Apps/components/_index.mjs";
|
||||
import { registerCustomComponents } from "../Apps/elements/_index.mjs";
|
||||
import { registerDevSettings } from "../settings/devSettings.mjs";
|
||||
import { registerMetaSettings } from "../settings/metaSettings.mjs";
|
||||
import { registerSockets } from "../sockets/_index.mjs";
|
||||
import { registerUserSettings } from "../settings/userSettings.mjs";
|
||||
import { registerWorldSettings } from "../settings/worldSettings.mjs";
|
||||
|
||||
const { Items, Actors } = foundry.documents.collections;
|
||||
const { ItemSheet, ActorSheet } = foundry.appv1.sheets;
|
||||
|
||||
Hooks.once(`init`, () => {
|
||||
Logger.log(`Initializing`);
|
||||
|
|
@ -75,6 +74,10 @@ Hooks.once(`init`, () => {
|
|||
// #endregion
|
||||
|
||||
// #region Sheets
|
||||
// Unregister core sheets
|
||||
Items.unregisterSheet(`core`, ItemSheet);
|
||||
Actors.unregisterSheet(`core`, ActorSheet);
|
||||
|
||||
// #region Actors
|
||||
Actors.registerSheet(game.system.id, CombinedHeroSheet, {
|
||||
makeDefault: true,
|
||||
|
|
@ -111,16 +114,6 @@ Hooks.once(`init`, () => {
|
|||
label: `RipCrypt.sheet-names.AllItemsSheetV1`,
|
||||
themes: AllItemSheetV1.themes,
|
||||
});
|
||||
|
||||
Items.registerSheet(game.system.id, ArmourSheet, {
|
||||
makeDefault: true,
|
||||
types: [`armour`, `shield`],
|
||||
label: `RipCrypt.sheet-names.ArmourSheet`,
|
||||
themes: ArmourSheet.themes,
|
||||
});
|
||||
Items.unregisterSheet(game.system.id, AllItemSheetV1, {
|
||||
types: [`armour`, `shield`],
|
||||
});
|
||||
// #endregion
|
||||
// #endregion
|
||||
|
||||
|
|
@ -128,7 +121,6 @@ Hooks.once(`init`, () => {
|
|||
CONFIG.Actor.trackableAttributes.hero = HeroData.trackableAttributes;
|
||||
// #endregion
|
||||
|
||||
registerSockets();
|
||||
registerCustomComponents();
|
||||
Handlebars.registerHelper(helpers);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -6,18 +6,17 @@ Hooks.once(`ready`, () => {
|
|||
|
||||
let defaultTab = game.settings.get(`ripcrypt`, `defaultTab`);
|
||||
if (defaultTab) {
|
||||
try {
|
||||
if (!ui.sidebar?.TABS?.[defaultTab]) {
|
||||
Logger.error(`Couldn't find a sidebar tab with ID:`, defaultTab);
|
||||
} else {
|
||||
Logger.debug(`Switching sidebar tab to:`, defaultTab);
|
||||
ui.sidebar.changeTab(defaultTab, `primary`);
|
||||
}
|
||||
catch {
|
||||
Logger.error(`Failed to change to sidebar tab:`, defaultTab);
|
||||
ui.sidebar.activateTab(defaultTab);
|
||||
};
|
||||
};
|
||||
|
||||
if (game.settings.get(`ripcrypt`, `devMode`)) {
|
||||
ui.sidebar.expand();
|
||||
if (game.paused) { game.togglePause(false, { broadcast: true }) };
|
||||
if (game.paused) { game.togglePause() };
|
||||
};
|
||||
|
||||
ui.delveDice.render({ force: true });
|
||||
|
|
@ -29,7 +28,7 @@ Hooks.once(`ready`, () => {
|
|||
combatConfig.turnMarker.src = filePath(`assets/turn-marker.png`);
|
||||
combatConfig.turnMarker.animation = `spinPulse`;
|
||||
game.settings.set(`core`, `combatTrackerConfig`, combatConfig);
|
||||
};
|
||||
}
|
||||
|
||||
game.settings.set(`ripcrypt`, `firstLoadFinished`, true);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -39,14 +39,4 @@ export function registerWorldSettings() {
|
|||
},
|
||||
}),
|
||||
});
|
||||
|
||||
game.settings.register(`ripcrypt`, `allowUpdateSandsSocket`, {
|
||||
name: `RipCrypt.setting.allowUpdateSandsSocket.name`,
|
||||
hint: `RipCrypt.setting.allowUpdateSandsSocket.hint`,
|
||||
scope: `world`,
|
||||
config: true,
|
||||
requiresReload: false,
|
||||
type: Boolean,
|
||||
default: true,
|
||||
});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,29 +0,0 @@
|
|||
import { localizer } from "../utils/Localizer.mjs";
|
||||
import { Logger } from "../utils/Logger.mjs";
|
||||
import { notify } from "./notify.mjs";
|
||||
import { updateSands } from "./updateSands.mjs";
|
||||
|
||||
const events = {
|
||||
notify,
|
||||
updateSands,
|
||||
};
|
||||
|
||||
export function registerSockets() {
|
||||
Logger.info(`Setting up socket listener`);
|
||||
|
||||
game.socket.on(`system.ripcrypt`, (data, userID) => {
|
||||
const { event, payload } = data ?? {};
|
||||
if (event == null || payload === undefined) {
|
||||
ui.notifications.error(localizer(`RipCrypt.notifs.error.invalid-socket`));
|
||||
return;
|
||||
};
|
||||
|
||||
if (events[event] == null) {
|
||||
ui.notifications.error(localizer(`RipCrypt.notifs.error.unknown-socket-event`, { event }));
|
||||
return;
|
||||
};
|
||||
|
||||
const user = game.users.get(userID);
|
||||
events[event](payload, user);
|
||||
});
|
||||
};
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
import { localizer } from "../utils/Localizer.mjs";
|
||||
|
||||
export function notify(payload) {
|
||||
// #region Payload Validity
|
||||
const {
|
||||
message,
|
||||
users = [],
|
||||
type = `info`,
|
||||
permanent = false,
|
||||
} = payload;
|
||||
|
||||
if (!message) {
|
||||
ui.notifications.error(localizer(
|
||||
`RipCrypt.notifs.error.malformed-socket-payload`,
|
||||
{
|
||||
event: `notify`,
|
||||
details: `A message must be provided`,
|
||||
},
|
||||
));
|
||||
return;
|
||||
};
|
||||
|
||||
if (users && !Array.isArray(users)) {
|
||||
ui.notifications.error(localizer(
|
||||
`RipCrypt.notifs.error.malformed-socket-payload`,
|
||||
{
|
||||
event: `notify`,
|
||||
details: `"users" must be an array of user IDs`,
|
||||
},
|
||||
));
|
||||
return;
|
||||
};
|
||||
|
||||
if (![`info`, `error`, `success`].includes(type)) {
|
||||
ui.notifications.error(localizer(
|
||||
`RipCrypt.notifs.error.malformed-socket-payload`,
|
||||
{
|
||||
event: `notify`,
|
||||
details: `An invalid notification type was provided.`,
|
||||
},
|
||||
));
|
||||
return;
|
||||
}
|
||||
// #endregion Payload Validity
|
||||
|
||||
// Act
|
||||
if (users.length === 0 || users.includes(game.user.id)) {
|
||||
ui.notifications[type]?.(
|
||||
localizer(message),
|
||||
{
|
||||
console: false,
|
||||
permanent,
|
||||
},
|
||||
);
|
||||
};
|
||||
};
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
import { clamp } from "../utils/clamp.mjs";
|
||||
import { localizer } from "../utils/Localizer.mjs";
|
||||
|
||||
export function updateSands(payload) {
|
||||
if (!game.user.isActiveGM) { return };
|
||||
if (!game.settings.get(game.system.id, `allowUpdateSandsSocket`)) { return };
|
||||
|
||||
// Assert payload validity
|
||||
const { value, delta } = payload;
|
||||
if (value == null && delta == null) {
|
||||
ui.notifications.error(localizer(
|
||||
`RipCrypt.notifs.error.malformed-socket-payload`,
|
||||
{
|
||||
event: `updateSands`,
|
||||
details: `Either value or delta must be provided`,
|
||||
},
|
||||
));
|
||||
return;
|
||||
};
|
||||
|
||||
// Take action
|
||||
if (value != null) {
|
||||
const initial = game.settings.get(game.system.id, `sandsOfFateInitial`);
|
||||
let sands = clamp(0, value, initial);
|
||||
if (sands === 0) {
|
||||
ui.delveDice.alertCrypticEvent();
|
||||
sands = initial;
|
||||
};
|
||||
game.settings.set(
|
||||
game.system.id,
|
||||
`sandsOfFate`,
|
||||
sands,
|
||||
);
|
||||
}
|
||||
else if (delta != null) {
|
||||
ui.delveDice.sandsOfFateDelta(delta);
|
||||
};
|
||||
};
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
export function clamp(min, ideal, max) {
|
||||
return Math.max(min, Math.min(ideal, max));
|
||||
};
|
||||
14
package-lock.json
generated
14
package-lock.json
generated
|
|
@ -8,7 +8,6 @@
|
|||
"@eslint/js": "^9.16.0",
|
||||
"@foundryvtt/foundryvtt-cli": "^1.0.3",
|
||||
"@stylistic/eslint-plugin": "^2.12.0",
|
||||
"dotenv": "^17.2.3",
|
||||
"eslint": "^9.16.0"
|
||||
}
|
||||
},
|
||||
|
|
@ -776,19 +775,6 @@
|
|||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/dotenv": {
|
||||
"version": "17.2.3",
|
||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz",
|
||||
"integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://dotenvx.com"
|
||||
}
|
||||
},
|
||||
"node_modules/dunder-proto": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz",
|
||||
|
|
|
|||
|
|
@ -3,13 +3,9 @@
|
|||
"@eslint/js": "^9.16.0",
|
||||
"@foundryvtt/foundryvtt-cli": "^1.0.3",
|
||||
"@stylistic/eslint-plugin": "^2.12.0",
|
||||
"dotenv": "^17.2.3",
|
||||
"eslint": "^9.16.0"
|
||||
},
|
||||
"scripts": {
|
||||
"data:build": "node scripts/buildCompendia.mjs",
|
||||
"data:extract": "node scripts/extractCompendia.mjs",
|
||||
"link": "node scripts/linkFoundry.mjs",
|
||||
"lint": "eslint --fix",
|
||||
"lint:nofix": "eslint"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": null,
|
||||
"name": "Armour",
|
||||
"color": "#04262a",
|
||||
"sorting": "m",
|
||||
"_id": "pZxc6QLgVWfnZlf7",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994081362,
|
||||
"modifiedTime": 1759994081362,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!folders!pZxc6QLgVWfnZlf7"
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"folder": "BsNUpCnwmlhOWBhZ",
|
||||
"name": "Breastplate",
|
||||
"type": "armour",
|
||||
"_id": "KQ6uyTPUOHuMTxDF",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 90,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 3,
|
||||
"location": [
|
||||
"body"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994459142,
|
||||
"modifiedTime": 1759994468351,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!KQ6uyTPUOHuMTxDF"
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": "pZxc6QLgVWfnZlf7",
|
||||
"name": "Heavy",
|
||||
"color": "#06393f",
|
||||
"sorting": "a",
|
||||
"_id": "BsNUpCnwmlhOWBhZ",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"_key": "!folders!BsNUpCnwmlhOWBhZ"
|
||||
}
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
{
|
||||
"folder": "RXPJBkzVxFnoT3Tm",
|
||||
"name": "Heavy Shields",
|
||||
"type": "shield",
|
||||
"_id": "uUrCwjxV6Ihisb6V",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 50,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 1,
|
||||
"location": [
|
||||
"head",
|
||||
"body",
|
||||
"arms",
|
||||
"legs"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994801184,
|
||||
"modifiedTime": 1759994810086,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!uUrCwjxV6Ihisb6V"
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"folder": "HRwiz1c1ZcQyPu4z",
|
||||
"name": "Leather Cap",
|
||||
"type": "armour",
|
||||
"_id": "JMkV8kMnCXhW5KDh",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 10,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 1,
|
||||
"location": [
|
||||
"head"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994118194,
|
||||
"modifiedTime": 1759994130845,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!JMkV8kMnCXhW5KDh"
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"folder": "HRwiz1c1ZcQyPu4z",
|
||||
"name": "Leather, Hide Bracers",
|
||||
"type": "armour",
|
||||
"_id": "nz4DXXR4iU9CeMRA",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 10,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 1,
|
||||
"location": [
|
||||
"arms"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994170968,
|
||||
"modifiedTime": 1759994180395,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!nz4DXXR4iU9CeMRA"
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"folder": "HRwiz1c1ZcQyPu4z",
|
||||
"name": "Leather, Hide Jacket",
|
||||
"type": "armour",
|
||||
"_id": "zMyxSJ6VpaH3ddOO",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 20,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 1,
|
||||
"location": [
|
||||
"body"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994151324,
|
||||
"modifiedTime": 1759994160761,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!zMyxSJ6VpaH3ddOO"
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"folder": "HRwiz1c1ZcQyPu4z",
|
||||
"name": "Leather, Hide Leggings",
|
||||
"type": "armour",
|
||||
"_id": "14Omu9q2sMxW8GWB",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 20,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 1,
|
||||
"location": [
|
||||
"legs"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994190989,
|
||||
"modifiedTime": 1759994198011,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!14Omu9q2sMxW8GWB"
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": "pZxc6QLgVWfnZlf7",
|
||||
"name": "Light",
|
||||
"color": "#06393f",
|
||||
"sorting": "a",
|
||||
"_id": "HRwiz1c1ZcQyPu4z",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"_key": "!folders!HRwiz1c1ZcQyPu4z"
|
||||
}
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
{
|
||||
"folder": "RXPJBkzVxFnoT3Tm",
|
||||
"name": "Light Shields",
|
||||
"type": "shield",
|
||||
"_id": "a6vPAa25z8L9t79K",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 20,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 1,
|
||||
"location": [
|
||||
"head",
|
||||
"arms"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994549164,
|
||||
"modifiedTime": 1759994761998,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!a6vPAa25z8L9t79K"
|
||||
}
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
{
|
||||
"folder": "cKN149ZGLqfyt0oi",
|
||||
"name": "Mail, Link, Scale Coat",
|
||||
"type": "armour",
|
||||
"_id": "Sr40RFsPr2M0bTKK",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 180,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 2,
|
||||
"location": [
|
||||
"body",
|
||||
"arms"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "modest",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994257751,
|
||||
"modifiedTime": 1759994294312,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!Sr40RFsPr2M0bTKK"
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"folder": "cKN149ZGLqfyt0oi",
|
||||
"name": "Mail, Link, Scale Coif",
|
||||
"type": "armour",
|
||||
"_id": "HfG5Doxf7576Jgbt",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 180,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 2,
|
||||
"location": [
|
||||
"head"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "modest",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994210701,
|
||||
"modifiedTime": 1759994221462,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!HfG5Doxf7576Jgbt"
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"folder": "cKN149ZGLqfyt0oi",
|
||||
"name": "Mail, Link, Scale Leggings",
|
||||
"type": "armour",
|
||||
"_id": "YBpElIVQ534pm3Mf",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 200,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 2,
|
||||
"location": [
|
||||
"legs"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": null,
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994280754,
|
||||
"modifiedTime": 1759994424980,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!YBpElIVQ534pm3Mf"
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"folder": "cKN149ZGLqfyt0oi",
|
||||
"name": "Mail, Link, Scale Shirt",
|
||||
"type": "armour",
|
||||
"_id": "wab6Bo8ngar4mBCN",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 90,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 2,
|
||||
"location": [
|
||||
"body"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "modest",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994235204,
|
||||
"modifiedTime": 1759994246578,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!wab6Bo8ngar4mBCN"
|
||||
}
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
{
|
||||
"folder": "RXPJBkzVxFnoT3Tm",
|
||||
"name": "Modest Shields",
|
||||
"type": "shield",
|
||||
"_id": "fyL8LZ8jpEQbjpM2",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 30,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 1,
|
||||
"location": [
|
||||
"head",
|
||||
"body",
|
||||
"arms"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "modest",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994777609,
|
||||
"modifiedTime": 1759994784898,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!fyL8LZ8jpEQbjpM2"
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": "pZxc6QLgVWfnZlf7",
|
||||
"name": "Modest",
|
||||
"color": "#06393f",
|
||||
"sorting": "a",
|
||||
"_id": "cKN149ZGLqfyt0oi",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"_key": "!folders!cKN149ZGLqfyt0oi"
|
||||
}
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
{
|
||||
"folder": "BsNUpCnwmlhOWBhZ",
|
||||
"name": "Plate Bracers",
|
||||
"type": "armour",
|
||||
"_id": "e8JRJn5Blw3UrvnW",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 180,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 1,
|
||||
"location": [
|
||||
"body",
|
||||
"arms"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994478040,
|
||||
"modifiedTime": 1759994486947,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!e8JRJn5Blw3UrvnW"
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"folder": "BsNUpCnwmlhOWBhZ",
|
||||
"name": "Plate Leggings",
|
||||
"type": "armour",
|
||||
"_id": "v1y4RKGad2IXOu5e",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 200,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 3,
|
||||
"location": [
|
||||
"legs"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994497119,
|
||||
"modifiedTime": 1759994506514,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!v1y4RKGad2IXOu5e"
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"folder": "BsNUpCnwmlhOWBhZ",
|
||||
"name": "Ring Coif, Helm",
|
||||
"type": "armour",
|
||||
"_id": "Z4NTsrX63JNjjZ8Z",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 440,
|
||||
"copper": null
|
||||
},
|
||||
"protection": 3,
|
||||
"location": [
|
||||
"head"
|
||||
],
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994438779,
|
||||
"modifiedTime": 1759994448846,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!Z4NTsrX63JNjjZ8Z"
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": null,
|
||||
"name": "Shields",
|
||||
"color": "#04262a",
|
||||
"sorting": "m",
|
||||
"_id": "RXPJBkzVxFnoT3Tm",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994538745,
|
||||
"modifiedTime": 1759994538745,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!folders!RXPJBkzVxFnoT3Tm"
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": null,
|
||||
"name": "Ammo",
|
||||
"color": "#04262a",
|
||||
"sorting": "a",
|
||||
"_id": "gvNPXXRBx2eGIzcU",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993925940,
|
||||
"modifiedTime": 1759993925940,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!folders!gvNPXXRBx2eGIzcU"
|
||||
}
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
{
|
||||
"folder": "dBAI76CApXH8qqjx",
|
||||
"name": "Arming Sword",
|
||||
"type": "weapon",
|
||||
"_id": "xXUItaoHTQ2QiaX4",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 80,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 2,
|
||||
"wear": {
|
||||
"value": 4,
|
||||
"max": 4
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "modest",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759992689272,
|
||||
"modifiedTime": 1759992708712,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!xXUItaoHTQ2QiaX4"
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"folder": "gvNPXXRBx2eGIzcU",
|
||||
"name": "Arrow",
|
||||
"type": "ammo",
|
||||
"_id": "gN9JbmouUI7eOrSj",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 12,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 3,
|
||||
"copper": null
|
||||
},
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993937035,
|
||||
"modifiedTime": 1759993944077,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!gN9JbmouUI7eOrSj"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "mmd8siMKSLyOeILo",
|
||||
"name": "Axe, Hammer, Pick",
|
||||
"type": "weapon",
|
||||
"_id": "cr35WzuPGDojuOuJ",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 10,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Thrown"
|
||||
],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 0,
|
||||
"wear": {
|
||||
"value": 2,
|
||||
"max": 2
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759991980652,
|
||||
"modifiedTime": 1759992328546,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!cr35WzuPGDojuOuJ"
|
||||
}
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
{
|
||||
"folder": "dBAI76CApXH8qqjx",
|
||||
"name": "Battleaxe, Warhammer",
|
||||
"type": "weapon",
|
||||
"_id": "otIFI9TIDPWnT3cq",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 40,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 3,
|
||||
"wear": {
|
||||
"value": 3,
|
||||
"max": 3
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "modest",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759992730036,
|
||||
"modifiedTime": 1759992748112,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!otIFI9TIDPWnT3cq"
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"folder": "gvNPXXRBx2eGIzcU",
|
||||
"name": "Black Powder",
|
||||
"type": "ammo",
|
||||
"_id": "c86ht86Z9vOEBtNH",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 12,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 40,
|
||||
"copper": null
|
||||
},
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759994005587,
|
||||
"modifiedTime": 1759994010244,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!c86ht86Z9vOEBtNH"
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"folder": "gvNPXXRBx2eGIzcU",
|
||||
"name": "Blowgun Darts",
|
||||
"type": "ammo",
|
||||
"_id": "FvtiEaQhJumPsCwb",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 12,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 2,
|
||||
"copper": null
|
||||
},
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993963869,
|
||||
"modifiedTime": 1759993969644,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!FvtiEaQhJumPsCwb"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "vPyj2cK1j66Zyrul",
|
||||
"name": "Blowgun, Sling",
|
||||
"type": "weapon",
|
||||
"_id": "VrG2xer1quhjwUag",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 10,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Ammo"
|
||||
],
|
||||
"range": {
|
||||
"short": 5,
|
||||
"long": 10
|
||||
},
|
||||
"damage": 1,
|
||||
"wear": {
|
||||
"value": 1,
|
||||
"max": 1
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993449825,
|
||||
"modifiedTime": 1759993468278,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!VrG2xer1quhjwUag"
|
||||
}
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
{
|
||||
"folder": "dBAI76CApXH8qqjx",
|
||||
"name": "Broadsword",
|
||||
"type": "weapon",
|
||||
"_id": "I9QaJTU6O2E9WzUS",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 100,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 3,
|
||||
"wear": {
|
||||
"value": 3,
|
||||
"max": 3
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "modest",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759992797603,
|
||||
"modifiedTime": 1759992815028,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!I9QaJTU6O2E9WzUS"
|
||||
}
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
{
|
||||
"folder": "mmd8siMKSLyOeILo",
|
||||
"name": "Club",
|
||||
"type": "weapon",
|
||||
"_id": "NlDJVbXeXRfoCZWp",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 2,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 1,
|
||||
"wear": {
|
||||
"value": 2,
|
||||
"max": 2
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759992392474,
|
||||
"modifiedTime": 1759992619109,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!NlDJVbXeXRfoCZWp"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "8NNF9jBjpmPpmw1B",
|
||||
"name": "Crossbow",
|
||||
"type": "weapon",
|
||||
"_id": "BNoYUrlpDk6oBeJt",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 90,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Reload"
|
||||
],
|
||||
"range": {
|
||||
"short": 10,
|
||||
"long": 25
|
||||
},
|
||||
"damage": 3,
|
||||
"wear": {
|
||||
"value": 3,
|
||||
"max": 3
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "modest",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993621847,
|
||||
"modifiedTime": 1759993694978,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!BNoYUrlpDk6oBeJt"
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"folder": "gvNPXXRBx2eGIzcU",
|
||||
"name": "Crossbow Bolts",
|
||||
"type": "ammo",
|
||||
"_id": "7cmLLV6o2pPAyyAg",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 12,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 3,
|
||||
"copper": null
|
||||
},
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993977460,
|
||||
"modifiedTime": 1759993982911,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!7cmLLV6o2pPAyyAg"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "dBAI76CApXH8qqjx",
|
||||
"name": "Cutlass, Saber, Scimitar",
|
||||
"type": "weapon",
|
||||
"_id": "kSWrbdKdYIRxkWka",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 120,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Agile"
|
||||
],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 2,
|
||||
"wear": {
|
||||
"value": 2,
|
||||
"max": 2
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "modest",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759992861725,
|
||||
"modifiedTime": 1759992882913,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!kSWrbdKdYIRxkWka"
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
{
|
||||
"folder": "mmd8siMKSLyOeILo",
|
||||
"name": "Dagger",
|
||||
"type": "weapon",
|
||||
"_id": "q8z2HptFaPmeHU9n",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 20,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Agile",
|
||||
"Thrown"
|
||||
],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 1,
|
||||
"wear": {
|
||||
"value": 1,
|
||||
"max": 1
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759992606052,
|
||||
"modifiedTime": 1759992639628,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!q8z2HptFaPmeHU9n"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "vPyj2cK1j66Zyrul",
|
||||
"name": "Darts",
|
||||
"type": "weapon",
|
||||
"_id": "rDxS6EJzg2zvSpxR",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 6,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 30,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Thrown"
|
||||
],
|
||||
"range": {
|
||||
"short": 3,
|
||||
"long": 6
|
||||
},
|
||||
"damage": 1,
|
||||
"wear": {
|
||||
"value": 1,
|
||||
"max": 1
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993477954,
|
||||
"modifiedTime": 1759993498878,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!rDxS6EJzg2zvSpxR"
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
{
|
||||
"folder": "vPyj2cK1j66Zyrul",
|
||||
"name": "Flintlock Pistol",
|
||||
"type": "weapon",
|
||||
"_id": "1vxM6KoEPrQ7pjcg",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 260,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Reload",
|
||||
"Loud"
|
||||
],
|
||||
"range": {
|
||||
"short": 5,
|
||||
"long": 10
|
||||
},
|
||||
"damage": 2,
|
||||
"wear": {
|
||||
"value": 2,
|
||||
"max": 2
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993514814,
|
||||
"modifiedTime": 1759993538727,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!1vxM6KoEPrQ7pjcg"
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
{
|
||||
"folder": "IkSGLBUzPI9Jbcj7",
|
||||
"name": "Flintlock Rifle",
|
||||
"type": "weapon",
|
||||
"_id": "xUGUgnjJsKUPgPpX",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 640,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Reload",
|
||||
"Loud"
|
||||
],
|
||||
"range": {
|
||||
"short": 15,
|
||||
"long": 30
|
||||
},
|
||||
"damage": 4,
|
||||
"wear": {
|
||||
"value": 3,
|
||||
"max": 3
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993769479,
|
||||
"modifiedTime": 1759993794528,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!xUGUgnjJsKUPgPpX"
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"folder": "gvNPXXRBx2eGIzcU",
|
||||
"name": "Great Arrows",
|
||||
"type": "ammo",
|
||||
"_id": "FQ5VBjR0LdXf8Nh2",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 12,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 12,
|
||||
"copper": null
|
||||
},
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993988701,
|
||||
"modifiedTime": 1759993993428,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!FQ5VBjR0LdXf8Nh2"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "3tp9cwpArQNOpkAY",
|
||||
"name": "Greataxe, Maul, Sword",
|
||||
"type": "weapon",
|
||||
"_id": "Pfm448hGPVSuyyrd",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 120,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Long"
|
||||
],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 4,
|
||||
"wear": {
|
||||
"value": 4,
|
||||
"max": 4
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993233713,
|
||||
"modifiedTime": 1759993258414,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!Pfm448hGPVSuyyrd"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "IkSGLBUzPI9Jbcj7",
|
||||
"name": "Greatbow",
|
||||
"type": "weapon",
|
||||
"_id": "N80F8sq9SaHrXBvS",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 320,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Ammo"
|
||||
],
|
||||
"range": {
|
||||
"short": 20,
|
||||
"long": 40
|
||||
},
|
||||
"damage": 4,
|
||||
"wear": {
|
||||
"value": 4,
|
||||
"max": 4
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993806102,
|
||||
"modifiedTime": 1759993839512,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!N80F8sq9SaHrXBvS"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "3tp9cwpArQNOpkAY",
|
||||
"name": "Greatclub, Staff",
|
||||
"type": "weapon",
|
||||
"_id": "Ct9iNF9KPMGStSQo",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 30,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Long"
|
||||
],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 4,
|
||||
"wear": {
|
||||
"value": 4,
|
||||
"max": 4
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993276032,
|
||||
"modifiedTime": 1759993292511,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!Ct9iNF9KPMGStSQo"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "vPyj2cK1j66Zyrul",
|
||||
"name": "Hand Crossbow",
|
||||
"type": "weapon",
|
||||
"_id": "5sUeNom6dn6MaoAE",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 120,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Reload"
|
||||
],
|
||||
"range": {
|
||||
"short": 5,
|
||||
"long": 10
|
||||
},
|
||||
"damage": 2,
|
||||
"wear": {
|
||||
"value": 1,
|
||||
"max": 1
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993551322,
|
||||
"modifiedTime": 1759993570977,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!5sUeNom6dn6MaoAE"
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": null,
|
||||
"name": "Hand Weapons",
|
||||
"color": "#04262a",
|
||||
"sorting": "m",
|
||||
"_id": "3mr6aZe43z7YBysA",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759992349332,
|
||||
"modifiedTime": 1759993205214,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!folders!3mr6aZe43z7YBysA"
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": "3mr6aZe43z7YBysA",
|
||||
"name": "Heavy",
|
||||
"color": "#06393f",
|
||||
"sorting": "a",
|
||||
"_id": "3tp9cwpArQNOpkAY",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"_key": "!folders!3tp9cwpArQNOpkAY"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "IkSGLBUzPI9Jbcj7",
|
||||
"name": "Heavy Crossbow",
|
||||
"type": "weapon",
|
||||
"_id": "xJzHTrYsJVL2WsSF",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 200,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Ammo"
|
||||
],
|
||||
"range": {
|
||||
"short": 20,
|
||||
"long": 40
|
||||
},
|
||||
"damage": 4,
|
||||
"wear": {
|
||||
"value": 4,
|
||||
"max": 4
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993848517,
|
||||
"modifiedTime": 1759993869078,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!xJzHTrYsJVL2WsSF"
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": "sjc6X9bKf7BY04Ar",
|
||||
"name": "Heavy",
|
||||
"color": "#06393f",
|
||||
"sorting": "a",
|
||||
"_id": "IkSGLBUzPI9Jbcj7",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"_key": "!folders!IkSGLBUzPI9Jbcj7"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "mmd8siMKSLyOeILo",
|
||||
"name": "Knife",
|
||||
"type": "weapon",
|
||||
"_id": "fv5D0xOJVpOwnyTn",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 6,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Thrown"
|
||||
],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 1,
|
||||
"wear": {
|
||||
"value": 1,
|
||||
"max": 1
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "light",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759992653763,
|
||||
"modifiedTime": 1759992669428,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!fv5D0xOJVpOwnyTn"
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": "3mr6aZe43z7YBysA",
|
||||
"name": "Light",
|
||||
"color": "#06393f",
|
||||
"sorting": "a",
|
||||
"_id": "mmd8siMKSLyOeILo",
|
||||
"description": "",
|
||||
"sort": -100000,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759991969340,
|
||||
"modifiedTime": 1759993210807,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!folders!mmd8siMKSLyOeILo"
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": "sjc6X9bKf7BY04Ar",
|
||||
"name": "Light",
|
||||
"color": "#06393f",
|
||||
"sorting": "a",
|
||||
"_id": "vPyj2cK1j66Zyrul",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"_key": "!folders!vPyj2cK1j66Zyrul"
|
||||
}
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
{
|
||||
"folder": "IkSGLBUzPI9Jbcj7",
|
||||
"name": "Long Rifle",
|
||||
"type": "weapon",
|
||||
"_id": "dn1eja68NNuxB8K1",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 840,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Reload",
|
||||
"Loud"
|
||||
],
|
||||
"range": {
|
||||
"short": 20,
|
||||
"long": 40
|
||||
},
|
||||
"damage": 4,
|
||||
"wear": {
|
||||
"value": 3,
|
||||
"max": 3
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993878663,
|
||||
"modifiedTime": 1759993902478,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!dn1eja68NNuxB8K1"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "8NNF9jBjpmPpmw1B",
|
||||
"name": "Longbow",
|
||||
"type": "weapon",
|
||||
"_id": "oyVNU8XgMiZI0Uxr",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 80,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Ammo"
|
||||
],
|
||||
"range": {
|
||||
"short": 9,
|
||||
"long": 30
|
||||
},
|
||||
"damage": 3,
|
||||
"wear": {
|
||||
"value": 3,
|
||||
"max": 3
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "modest",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993703627,
|
||||
"modifiedTime": 1759993727378,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!oyVNU8XgMiZI0Uxr"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "dBAI76CApXH8qqjx",
|
||||
"name": "Longsword",
|
||||
"type": "weapon",
|
||||
"_id": "7ezV0MrGA0duoGbl",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 220,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Able"
|
||||
],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 3,
|
||||
"wear": {
|
||||
"value": 3,
|
||||
"max": 3
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "modest",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759992894140,
|
||||
"modifiedTime": 1759992913378,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!7ezV0MrGA0duoGbl"
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": "sjc6X9bKf7BY04Ar",
|
||||
"name": "Modest",
|
||||
"color": "#06393f",
|
||||
"sorting": "a",
|
||||
"_id": "8NNF9jBjpmPpmw1B",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"_key": "!folders!8NNF9jBjpmPpmw1B"
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
{
|
||||
"type": "Item",
|
||||
"folder": "3mr6aZe43z7YBysA",
|
||||
"name": "Modest",
|
||||
"color": "#06393f",
|
||||
"sorting": "a",
|
||||
"_id": "dBAI76CApXH8qqjx",
|
||||
"description": "",
|
||||
"sort": 0,
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"lastModifiedBy": null
|
||||
},
|
||||
"_key": "!folders!dBAI76CApXH8qqjx"
|
||||
}
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
{
|
||||
"folder": "3tp9cwpArQNOpkAY",
|
||||
"name": "Poleaxe, Glaive, Halberd",
|
||||
"type": "weapon",
|
||||
"_id": "j6C9IyebpKsk7M6R",
|
||||
"img": "icons/svg/item-bag.svg",
|
||||
"system": {
|
||||
"quantity": 1,
|
||||
"cost": {
|
||||
"gold": null,
|
||||
"silver": 60,
|
||||
"copper": null
|
||||
},
|
||||
"traits": [
|
||||
"Long"
|
||||
],
|
||||
"range": {
|
||||
"short": null,
|
||||
"long": null
|
||||
},
|
||||
"damage": 4,
|
||||
"wear": {
|
||||
"value": 4,
|
||||
"max": 4
|
||||
},
|
||||
"equipped": false,
|
||||
"weight": "heavy",
|
||||
"access": ""
|
||||
},
|
||||
"effects": [],
|
||||
"sort": 0,
|
||||
"ownership": {
|
||||
"default": 0,
|
||||
"9x9FgB0YTeCJJUDK": 3
|
||||
},
|
||||
"flags": {},
|
||||
"_stats": {
|
||||
"compendiumSource": null,
|
||||
"duplicateSource": null,
|
||||
"exportSource": null,
|
||||
"coreVersion": "13.350",
|
||||
"systemId": "ripcrypt",
|
||||
"systemVersion": "0.2.0",
|
||||
"createdTime": 1759993308439,
|
||||
"modifiedTime": 1759993324411,
|
||||
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
|
||||
},
|
||||
"_key": "!items!j6C9IyebpKsk7M6R"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue