Compare commits

..

26 commits

Author SHA1 Message Date
Eldritch-Oliver
f3aecc1ce8 Remove handlebars log 2025-10-15 22:35:52 -06:00
Eldritch-Oliver
1d13f38f81 Tweak the way armour shows up on the sheet so that it's a bit easier to deal with 2025-10-15 22:35:44 -06:00
Eldritch-Oliver
8ed6f49c8d Finish the initial requirements for the header partial 2025-10-15 22:34:46 -06:00
Eldritch-Oliver
d70c5113b1 Remove log that's a bit spammy 2025-10-15 22:33:39 -06:00
Eldritch-Oliver
0d1c2ddbb3 Fix deprecation warning 2025-10-15 21:27:40 -06:00
Eldritch-Oliver
cd69228e68 Add Craft as it's own section item. Display the attack range 2025-10-13 21:29:56 -06:00
Eldritch-Oliver
28345bdef0 Begin making the BookGeistSheet have the final design 2025-10-12 21:29:59 -06:00
Eldritch-Oliver
798e7441b4 Add a helper to output a value if it's truthy or nothing otherwise 2025-10-12 21:28:52 -06:00
Eldritch-Oliver
d81d86ef47 Auto-equip weapons when embedded into Geist 2025-10-12 20:37:16 -06:00
Eldritch-Oliver
e7ac049ae3 Update the eslint indentation rule to be better when using a buncha mixins 2025-10-12 20:18:18 -06:00
Eldritch-Oliver
4a8ce9b099 Update the GenericAppMixin so that it persists focus better 2025-10-12 18:01:47 -06:00
Eldritch-Oliver
28989c2d35 Update fate path preparation to use localized labels 2025-10-12 14:08:01 -06:00
Eldritch-Oliver
f237bce4d9 Update the GenericApp to be using _prepareContext instead of _preparePartContext 2025-10-12 01:42:23 -06:00
Eldritch-Oliver
7935a85188 Initialize the BookGeistSheet 2025-10-12 01:42:05 -06:00
Eldritch-Oliver
163423ea5b Add dev button for getting an easy actor reference in the console 2025-10-12 00:56:07 -06:00
Eldritch-Oliver
0626279fbe Move the GenericApp mixin into the mixins folder 2025-10-11 22:52:51 -06:00
Eldritch-Oliver
ca185ba42a Add a custom mixin that allows doing complex structural position while maintaining partial rerenders 2025-10-11 22:52:12 -06:00
Eldritch-Oliver
e8baec0bc4 Implement the script that handles preparing the manifest for release 2025-10-11 17:19:03 -06:00
Eldritch-Oliver
165c24f32c Remove unneeded helper method 2025-10-11 17:02:58 -06:00
Eldritch-Oliver
d6beb4ba63 Localize the button label 2025-10-11 17:02:01 -06:00
Eldritch-Oliver
7de3f1ca87 Add an item sheet for editing Traits 2025-10-10 21:50:01 -06:00
Eldritch-Oliver
4d0f29d7f0 Prevent creating a Trait when it's on a non-geist Actor 2025-10-10 21:49:32 -06:00
Eldritch-Oliver
0e0f9d3831 Clean up some non-functional CSS 2025-10-10 21:09:44 -06:00
Eldritch-Oliver
803c1673e2 Move dev-only hooks into their own folder that isn't included in the build 2025-10-10 19:25:07 -06:00
Eldritch-Oliver
8de63e91c7 Get the foundation Trait type defined 2025-10-10 18:07:02 -06:00
Eldritch-Oliver
507c9b0341 Remove parts of the item schemas that aren't necessary 2025-10-10 18:05:56 -06:00
116 changed files with 933 additions and 2976 deletions

View file

@ -29,12 +29,6 @@ jobs:
if: ${{ steps.check-tag.outputs.exists == 'true' }} if: ${{ steps.check-tag.outputs.exists == 'true' }}
run: exit 1 run: exit 1
- name: "Building compendia"
run: "npm run data:build"
- name: "Removing compendium source"
run: "rm -rf packs/**/_source"
- name: Update the manifest with the relevant properties - name: Update the manifest with the relevant properties
id: manifest-update id: manifest-update
uses: microsoft/variable-substitution@v1 uses: microsoft/variable-substitution@v1
@ -44,7 +38,7 @@ jobs:
download: "https://github.com/${{ github.repository }}/releases/download/v${{ steps.version.outputs.version }}/release.zip" download: "https://github.com/${{ github.repository }}/releases/download/v${{ steps.version.outputs.version }}/release.zip"
- name: Create the zip - 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 - name: Create the draft release
uses: ncipollo/release-action@v1 uses: ncipollo/release-action@v1

7
.gitignore vendored
View file

@ -13,10 +13,3 @@ jspm_packages/
.env.test.local .env.test.local
.env.production.local .env.production.local
.env.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

View file

@ -0,0 +1,23 @@
/*
This hook exists to be able to change all of the actor-sheets to allow
them to have dev-mode controls in their header that are useful for
testing purposes. (This is particularly useful for testing embedded
items that are only allowed to exist on specific actor types)
*/
Hooks.on(`getHeaderControlsActorSheetV2`, (app, controls) => {
if (!game.settings.get(`ripcrypt`, `devMode`)) { return }
controls.push(
{
icon: `fa-solid fa-terminal`,
label: `Embed New Item (DEV)`,
action: `createItem`,
},
{
label: `Make Global Reference`,
onClick: () => {
globalThis._doc = app.actor;
},
},
);
});

View file

@ -1,4 +1,4 @@
import { Logger } from "../utils/Logger.mjs"; import { Logger } from "../../module/utils/Logger.mjs";
const loaders = { const loaders = {
svg(data) { svg(data) {

3
dev/main.mjs Normal file
View file

@ -0,0 +1,3 @@
// Hooks
import "./hooks/hotReload.mjs";
import "./hooks/getHeaderControlsActorSheetV2.mjs";

View file

@ -74,7 +74,16 @@ export default [
"@stylistic/space-infix-ops": `warn`, "@stylistic/space-infix-ops": `warn`,
"@stylistic/eol-last": `warn`, "@stylistic/eol-last": `warn`,
"@stylistic/operator-linebreak": [`warn`, `before`], "@stylistic/operator-linebreak": [`warn`, `before`],
"@stylistic/indent": [`warn`, `tab`], "@stylistic/indent": [
`warn`,
`tab`,
{
SwitchCase: 1,
ignoredNodes: [
`> .superClass`,
],
},
],
"@stylistic/brace-style": [`warn`, `stroustrup`, { "allowSingleLine": true }], "@stylistic/brace-style": [`warn`, `stroustrup`, { "allowSingleLine": true }],
"@stylistic/quotes": [`warn`, `backtick`, { "avoidEscape": 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-dangle": [`warn`, { arrays: `always-multiline`, objects: `always-multiline`, imports: `always-multiline`, exports: `always-multiline`, functions: `always-multiline` }],

View file

@ -12,6 +12,7 @@
}, },
"include": [ "include": [
"module/**/*", "module/**/*",
"dev/**/*",
"foundry/client/client.mjs", "foundry/client/client.mjs",
"foundry/client/global.d.mts", "foundry/client/global.d.mts",
"foundry/common/primitives/global.d.mts" "foundry/common/primitives/global.d.mts"

View file

@ -11,6 +11,7 @@
"good": "Good", "good": "Good",
"shield": "Shield", "shield": "Shield",
"skill": "Skill", "skill": "Skill",
"trait": "Trait",
"weapon": "Weapon" "weapon": "Weapon"
} }
}, },
@ -173,6 +174,7 @@
"guts-value-readonly": "The current amount of guts the character has", "guts-value-readonly": "The current amount of guts the character has",
"guts-max-readonly": "The maximum amount of guts the character can have" "guts-max-readonly": "The maximum amount of guts the character can have"
}, },
"edit-description": "Edit Description",
"traits-placeholder": "New Trait...", "traits-placeholder": "New Trait...",
"short-range": "Short @RipCrypt.common.range", "short-range": "Short @RipCrypt.common.range",
"long-range": "Long @RipCrypt.common.range", "long-range": "Long @RipCrypt.common.range",
@ -201,7 +203,8 @@
"invalid-socket": "Invalid socket data received, this means a module or system bug is present.", "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}", "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.", "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}" "malformed-socket-payload": "Socket event \"{event}\" received with malformed payload. Details: {details}",
"invalid-parent-document": "Cannot create an item with type \"{itemType}\" on a parent document of type \"{parentType}\""
}, },
"warn": { "warn": {
"cannot-go-negative": "\"{name}\" is unable to be a negative number." "cannot-go-negative": "\"{name}\" is unable to be a negative number."

View file

@ -0,0 +1,217 @@
import { filePath } from "../../consts.mjs";
import { GenericAppMixin } from "../mixins/GenericApp.mjs";
import { LaidOutAppMixin } from "../mixins/LaidOutAppMixin.mjs";
import { localizer } from "../../utils/Localizer.mjs";
import { editItemFromElement, deleteItemFromElement } from "../utils.mjs";
import { gameTerms } from "../../gameTerms.mjs";
const { HandlebarsApplicationMixin } = foundry.applications.api;
const { ActorSheetV2 } = foundry.applications.sheets;
const { ContextMenu, TextEditor } = foundry.applications.ux;
export class BookGeistSheet extends
LaidOutAppMixin(
GenericAppMixin(
HandlebarsApplicationMixin(
ActorSheetV2,
))) {
// #region Options
static DEFAULT_OPTIONS = {
classes: [
`ripcrypt--actor`,
`BookGeistSheet`,
],
position: {
width: `auto`,
height: `auto`,
},
window: {
resizable: true,
},
form: {
submitOnChange: true,
closeOnSubmite: false,
},
};
static PARTS = {
layout: {
root: true,
template: filePath(`templates/Apps/BookGeistSheet/layout.hbs`),
},
image: { template: filePath(`templates/Apps/BookGeistSheet/image.hbs`) },
header: { template: filePath(`templates/Apps/BookGeistSheet/header.hbs`) },
stats: { template: filePath(`templates/Apps/BookGeistSheet/stats.hbs`) },
items: { template: filePath(`templates/Apps/BookGeistSheet/items.hbs`) },
};
// #endregion Options
// #region Lifecycle
async _onRender() {
await super._onRender();
new ContextMenu.implementation(
this.element,
`[data-ctx-menu="item"]`,
[
{
name: localizer(`RipCrypt.common.edit`),
condition: (el) => {
const itemId = el.dataset.itemId;
return itemId !== ``;
},
callback: editItemFromElement,
},
{
name: localizer(`RipCrypt.common.delete`),
condition: (el) => {
const itemId = el.dataset.itemId;
return itemId !== ``;
},
callback: deleteItemFromElement,
},
],
{ jQuery: false, fixed: true },
);
};
// #endregion Lifecycle
// #region Data Prep
async _preparePartContext(partID, ctx) {
switch (partID) {
case `layout`: await this._prepareLayoutContext(ctx); break;
case `image`: await this._prepareImageContext(ctx); break;
case `header`: await this._prepareHeaderContext(ctx); break;
case `stats`: await this._prepareStatsContext(ctx); break;
case `items`: await this._prepareItemsContext(ctx); break;
};
return ctx;
};
async _prepareLayoutContext(ctx) {
ctx.imageVisible = true;
};
async _prepareImageContext(ctx) {
ctx.url = this.actor.img;
};
async _prepareHeaderContext(ctx) {
ctx.name = this.actor.name;
ctx.rank = this.actor.system.level.rank;
ctx.ranks = Object.values(gameTerms.Rank)
.map((value, index) => ({
value,
label: index
}));
ctx.description = await TextEditor.implementation.enrichHTML(this.actor.system.description);
};
async _prepareStatsContext(ctx) {
const system = this.actor.system;
const fate = system.fate;
if (fate) {
ctx.path = {
full: localizer(`RipCrypt.common.ordinals.${fate}.full`),
abbv: localizer(`RipCrypt.common.ordinals.${fate}.abbv`),
};
}
else {
ctx.path = {
full: null,
abbv: localizer(`RipCrypt.common.empty`),
};
};
Object.assign(ctx, system.ability);
ctx.guts = system.guts;
ctx.speed = system.speed;
};
async _prepareItemsContext(ctx) {
const armours = this.actor.system.equippedArmour;
const shield = this.actor.system.equippedShield;
let defenses = [];
for (const [location, armour] of Object.entries(armours)) {
if (!armour) { continue }
const defense = {
name: localizer(`RipCrypt.common.anatomy.${location}`),
tooltip: null,
protection: 0,
shielded: false,
};
if (armour) {
defense.armourUUID = armour.uuid;
defense.tooltip = armour.name,
defense.protection = armour.system.protection;
}
if (shield?.system.location.has(location)) {
defense.shieldUUID = shield.uuid;
defense.shielded = true;
defense.protection += shield.system.protection;
};
if (defense.protection > 0) {
defenses.push(defense);
};
};
ctx.defenses = defenses
ctx.traits = []; // Array<{name: string}>
for (const item of this.actor.items) {
switch (item.type) {
case `weapon`: {
if (!item.system.equipped) { continue };
ctx.attacks ??= [];
ctx.attacks.push(this._prepareWeapon(item));
break;
};
case `craft`: {
ctx.crafts ??= [];
ctx.crafts.push(this._prepareCraft(item));
break;
};
case `trait`: {
ctx.traits.push(this._prepareTrait(item));
break;
};
};
};
};
_prepareWeapon(weapon) {
const hasShortRange = weapon.system.range.short != null;
const hasLongRange = weapon.system.range.long != null;
const isRanged = hasShortRange || hasLongRange;
return {
uuid: weapon.uuid,
name: weapon.name,
damage: weapon.system.damage,
isRanged,
range: weapon.system.range,
};
};
_prepareCraft(craft) {
return {
uuid: craft.uuid,
name: craft.name,
};
};
_prepareTrait(trait) {
return {
uuid: trait.uuid,
name: trait.name,
description: trait.system.description,
};
};
// #endregion Data Prep
// #region Actions
// #endregion Actions
};

View file

@ -1,6 +1,6 @@
import { CraftCardV1 } from "./CraftCardV1.mjs"; import { CraftCardV1 } from "./CraftCardV1.mjs";
import { filePath } from "../../consts.mjs"; import { filePath } from "../../consts.mjs";
import { GenericAppMixin } from "../GenericApp.mjs"; import { GenericAppMixin } from "../mixins/GenericApp.mjs";
import { SkillsCardV1 } from "./SkillsCardV1.mjs"; import { SkillsCardV1 } from "./SkillsCardV1.mjs";
import { StatsCardV1 } from "./StatsCardV1.mjs"; import { StatsCardV1 } from "./StatsCardV1.mjs";

View file

@ -1,7 +1,7 @@
import { deleteItemFromElement, editItemFromElement } from "../utils.mjs"; import { deleteItemFromElement, editItemFromElement } from "../utils.mjs";
import { documentSorter, filePath } from "../../consts.mjs"; import { documentSorter, filePath } from "../../consts.mjs";
import { gameTerms } from "../../gameTerms.mjs"; import { gameTerms } from "../../gameTerms.mjs";
import { GenericAppMixin } from "../GenericApp.mjs"; import { GenericAppMixin } from "../mixins/GenericApp.mjs";
import { localizer } from "../../utils/Localizer.mjs"; import { localizer } from "../../utils/Localizer.mjs";
import { Logger } from "../../utils/Logger.mjs"; import { Logger } from "../../utils/Logger.mjs";

View file

@ -2,7 +2,7 @@ import { deleteItemFromElement, editItemFromElement } from "../utils.mjs";
import { documentSorter, filePath } from "../../consts.mjs"; import { documentSorter, filePath } from "../../consts.mjs";
import { AmmoTracker } from "../popovers/AmmoTracker.mjs"; import { AmmoTracker } from "../popovers/AmmoTracker.mjs";
import { gameTerms } from "../../gameTerms.mjs"; import { gameTerms } from "../../gameTerms.mjs";
import { GenericAppMixin } from "../GenericApp.mjs"; import { GenericAppMixin } from "../mixins/GenericApp.mjs";
import { ItemFlags } from "../../flags/item.mjs"; import { ItemFlags } from "../../flags/item.mjs";
import { localizer } from "../../utils/Localizer.mjs"; import { localizer } from "../../utils/Localizer.mjs";
import { Logger } from "../../utils/Logger.mjs"; import { Logger } from "../../utils/Logger.mjs";

View file

@ -2,7 +2,7 @@ import { deleteItemFromElement, editItemFromElement } from "../utils.mjs";
import { DelveDiceHUD } from "../DelveDiceHUD.mjs"; import { DelveDiceHUD } from "../DelveDiceHUD.mjs";
import { filePath } from "../../consts.mjs"; import { filePath } from "../../consts.mjs";
import { gameTerms } from "../../gameTerms.mjs"; import { gameTerms } from "../../gameTerms.mjs";
import { GenericAppMixin } from "../GenericApp.mjs"; import { GenericAppMixin } from "../mixins/GenericApp.mjs";
import { localizer } from "../../utils/Localizer.mjs"; import { localizer } from "../../utils/Localizer.mjs";
import { Logger } from "../../utils/Logger.mjs"; import { Logger } from "../../utils/Logger.mjs";

View file

@ -143,7 +143,6 @@ export class DelveDiceHUD extends HandlebarsApplicationMixin(ApplicationV2) {
}; };
}; };
Logger.log(`${partId} Context`, ctx);
return ctx; return ctx;
}; };

View file

@ -1,5 +1,5 @@
import { filePath } from "../consts.mjs"; import { filePath } from "../consts.mjs";
import { GenericAppMixin } from "./GenericApp.mjs"; import { GenericAppMixin } from "./mixins/GenericApp.mjs";
import { localizer } from "../utils/Localizer.mjs"; import { localizer } from "../utils/Localizer.mjs";
import { Logger } from "../utils/Logger.mjs"; import { Logger } from "../utils/Logger.mjs";

View file

@ -1,5 +1,5 @@
import { filePath } from "../../consts.mjs"; import { filePath } from "../../consts.mjs";
import { GenericAppMixin } from "../GenericApp.mjs"; import { GenericAppMixin } from "../mixins/GenericApp.mjs";
import { Logger } from "../../utils/Logger.mjs"; import { Logger } from "../../utils/Logger.mjs";
const { HandlebarsApplicationMixin } = foundry.applications.api; const { HandlebarsApplicationMixin } = foundry.applications.api;

View file

@ -1,6 +1,6 @@
import { filePath } from "../../consts.mjs"; import { filePath } from "../../consts.mjs";
import { gameTerms } from "../../gameTerms.mjs"; import { gameTerms } from "../../gameTerms.mjs";
import { GenericAppMixin } from "../GenericApp.mjs"; import { GenericAppMixin } from "../mixins/GenericApp.mjs";
const { HandlebarsApplicationMixin } = foundry.applications.api; const { HandlebarsApplicationMixin } = foundry.applications.api;
const { ItemSheetV2 } = foundry.applications.sheets; const { ItemSheetV2 } = foundry.applications.sheets;

View file

@ -0,0 +1,53 @@
import { filePath } from "../../consts.mjs";
import { GenericAppMixin } from "../mixins/GenericApp.mjs";
const { HandlebarsApplicationMixin } = foundry.applications.api;
const { ItemSheetV2 } = foundry.applications.sheets;
export class TraitSheet extends GenericAppMixin(HandlebarsApplicationMixin(ItemSheetV2)) {
// #region Options
static DEFAULT_OPTIONS = {
classes: [
`ripcrypt--item`,
`TraitSheet`,
],
position: {
width: `auto`,
height: `auto`,
},
window: {
resizable: true,
},
form: {
submitOnChange: true,
closeOnSubmit: false,
},
};
static PARTS = {
content: {
template: filePath(`templates/Apps/TraitSheet/content.hbs`),
root: true,
},
};
// #endregion Options
// #region Data Prep
async _prepareContext() {
const TextEditor = foundry.applications.ux.TextEditor.implementation;
const ctx = {
meta: {
idp: this.id,
},
item: this.document,
enriched: {
system: {
description: await TextEditor.enrichHTML(this.document.system.description),
},
},
};
return ctx;
};
// #endregion Data Prep
};

View file

@ -1,7 +1,7 @@
import { createItemFromElement, deleteItemFromElement, editItemFromElement, updateForeignDocumentFromEvent } from "./utils.mjs"; import { createItemFromElement, deleteItemFromElement, editItemFromElement, updateForeignDocumentFromEvent } from "../utils.mjs";
import { DicePool } from "./DicePool.mjs"; import { DicePool } from "../DicePool.mjs";
import { RichEditor } from "./RichEditor.mjs"; import { RichEditor } from "../RichEditor.mjs";
import { toBoolean } from "../consts.mjs"; import { toBoolean } from "../../consts.mjs";
/** /**
* A mixin that takes the class from HandlebarsApplicationMixin and combines it * A mixin that takes the class from HandlebarsApplicationMixin and combines it
@ -37,6 +37,8 @@ export function GenericAppMixin(HandlebarsApp) {
_popoverManagers = new Map(); _popoverManagers = new Map();
/** @type {Map<number, string>} */ /** @type {Map<number, string>} */
_hookIDs = new Map(); _hookIDs = new Map();
/** @type {string | null} */
#focus = null;
// #endregion // #endregion
// #region Lifecycle // #region Lifecycle
@ -53,6 +55,26 @@ export function GenericAppMixin(HandlebarsApp) {
}; };
}; };
/**
* @override
* This method overrides Foundry's default behaviour for caching the focused
* element so that it actually works when the application has a root partial
*/
async _preRender(...args) {
if (this.rendered) {
const target = this.element.querySelector(`:focus`);
if (target) {
if (target.id) {
this.#focus = `#${CSS.escape(target.id)}`;
}
else if (target.name) {
this.#focus = `${target.tagName}[name="${target.name}"]`;
};
};
};
return super._preRender(...args);
};
/** @override */ /** @override */
async _onRender(...args) { async _onRender(...args) {
await super._onRender(...args); await super._onRender(...args);
@ -83,19 +105,30 @@ export function GenericAppMixin(HandlebarsApp) {
}); });
}; };
async _preparePartContext(partId, ctx, opts) { /**
ctx = await super._preparePartContext(partId, ctx, opts); * @override
delete ctx.document; * This method overrides Foundry's default behaviour for caching the focused
delete ctx.fields; * element so that it actually works when the application has a root partial
*/
async _postRender(...args) {
if (this.rendered) {
const target = this.element.querySelector(this.#focus);
target?.focus();
};
this.#focus = null;
return super._postRender(...args);
};
async _prepareContext(_options) {
const ctx = {};
ctx.meta ??= {}; ctx.meta ??= {};
ctx.meta.idp = this.document?.uuid ?? this.id; ctx.meta.idp = this.id;
if (this.document) { if (this.document) {
ctx.meta.limited = this.document.limited; ctx.meta.limited = this.document.limited;
ctx.meta.editable = this.isEditable || game.user.isGM; ctx.meta.editable = this.isEditable || game.user.isGM;
ctx.meta.embedded = this.document.isEmbedded; ctx.meta.embedded = this.document.isEmbedded;
}; };
delete ctx.editable;
return ctx; return ctx;
}; };

View file

@ -0,0 +1,56 @@
/**
* This mixin makes it so that we can provide a specific layout template without
* needing to reference each of the inner areas via a partial embedded in the root,
* enabling partial re-renders for parts of the sheet without losing advanced
* layout capabilities.
*
* @param {ReturnType<HandlebarsApp>} HandlebarsApp The mixin'd class from HAM to further mix
*/
export function LaidOutAppMixin(HandlebarsApp) {
class LaidOutApp extends HandlebarsApp {
#partDescriptors;
/**
* This caches the part descriptors into this class of the heirarchy, because
* Foundry doesn't expose the partDescriptors from the HAM directly, so we
* inject a heirarchy call so that we can nab the pointer that Foundry has
* in the HAM so that we can also read/write it from this class.
*/
_configureRenderParts(options) {
const parts = super._configureRenderParts(options);
this.#partDescriptors = parts;
return parts;
};
/**
* @override
* This is essentially Foundry's HandlebarsApplicationMixin implementation,
* however if an existing part for non-root elements don't get concatenated
* into the DOM.
*/
_replaceHTML(result, content, options) {
const partInfo = this.#partDescriptors;
for ( const [partId, htmlElement] of Object.entries(result) ) {
const part = partInfo[partId];
const priorElement = part.root ? content : content.querySelector(`[data-application-part="${partId}"]`);
const state = {};
if ( priorElement ) {
this._preSyncPartState(partId, htmlElement, priorElement, state);
if ( part.root ) {
priorElement.replaceChildren(...htmlElement.children);
}
else {
priorElement.replaceWith(htmlElement);
}
this._syncPartState(partId, htmlElement, priorElement, state);
}
else {
continue;
};
this._attachPartListeners(partId, htmlElement, options);
this.parts[partId] = htmlElement;
}
};
};
return LaidOutApp;
};

View file

@ -1,3 +1,18 @@
import { EntityData } from "./Entity.mjs"; import { EntityData } from "./Entity.mjs";
export class GeistData extends EntityData {}; const { fields } = foundry.data;
export class GeistData extends EntityData {
static defineSchema() {
const schema = super.defineSchema();
schema.description = new fields.HTMLField({
blank: true,
nullable: true,
trim: true,
initial: null,
});
return schema;
};
};

View file

@ -2,19 +2,6 @@ import { CommonItemData } from "./Common.mjs";
import { gameTerms } from "../../gameTerms.mjs"; import { gameTerms } from "../../gameTerms.mjs";
export class AmmoData extends CommonItemData { export class AmmoData extends CommonItemData {
// MARK: Base Data
prepareBaseData() {
super.prepareBaseData();
};
// MARK: Derived Data
prepareDerivedData() {
super.prepareDerivedData();
};
// #region Getters
// #endregion
// #region Sheet Data // #region Sheet Data
getFormFields(_ctx) { getFormFields(_ctx) {
const fields = [ const fields = [

View file

@ -4,7 +4,7 @@ import { gameTerms } from "../../gameTerms.mjs";
const { fields } = foundry.data; const { fields } = foundry.data;
export class CommonItemData extends foundry.abstract.TypeDataModel { export class CommonItemData extends foundry.abstract.TypeDataModel {
// MARK: Schema // #region Schema
static defineSchema() { static defineSchema() {
return { return {
quantity: requiredInteger({ min: 0, initial: 1 }), quantity: requiredInteger({ min: 0, initial: 1 }),
@ -21,14 +21,5 @@ export class CommonItemData extends foundry.abstract.TypeDataModel {
}), }),
}; };
}; };
// #endregion Schema
// MARK: Base Data
prepareBaseData() {
super.prepareBaseData();
};
// MARK: Derived Data
prepareDerivedData() {
super.prepareDerivedData();
};
}; };

View file

@ -21,19 +21,6 @@ export class CraftData extends SkillData {
return schema; return schema;
}; };
// MARK: Base Data
prepareBaseData() {
super.prepareBaseData();
};
// MARK: Derived Data
prepareDerivedData() {
super.prepareDerivedData();
};
// #region Getters
// #endregion
// #region Sheet Data // #region Sheet Data
async getFormFields(_ctx) { async getFormFields(_ctx) {
const fields = [ const fields = [

View file

@ -17,19 +17,6 @@ export class GoodData extends CommonItemData {
return schema; return schema;
}; };
// MARK: Base Data
prepareBaseData() {
super.prepareBaseData();
};
// MARK: Derived Data
prepareDerivedData() {
super.prepareDerivedData();
};
// #region Getters
// #endregion
// #region Sheet Data // #region Sheet Data
async getFormFields(_ctx) { async getFormFields(_ctx) {
const fields = [ const fields = [

View file

@ -34,19 +34,6 @@ export class SkillData extends foundry.abstract.TypeDataModel {
return schema; return schema;
}; };
// MARK: Base Data
prepareBaseData() {
super.prepareBaseData();
};
// MARK: Derived Data
prepareDerivedData() {
super.prepareDerivedData();
};
// #region Getters
// #endregion
// #region Sheet Data // #region Sheet Data
async getFormFields(_ctx) { async getFormFields(_ctx) {
const fields = [ const fields = [

View file

@ -0,0 +1,25 @@
import { localizer } from "../../utils/Localizer.mjs";
const { fields } = foundry.data;
export class TraitData extends foundry.abstract.TypeDataModel {
// #region Schema
static defineSchema() {
return {
description: new fields.HTMLField({ blank: true, nullable: false, trim: true }),
};
};
// #endregion Schema
// #region Lifecycle
async _preCreate() {
if (this.parent.isEmbedded && this.parent.parent.type !== `geist`) {
ui.notifications.error(localizer(
`RipCrypt.notifs.error.invalid-parent-document`,
{ itemType: `trait`, parentType: this.parent.parent.type },
));
return false;
};
};
// #endregion
};

View file

@ -49,10 +49,13 @@ export class WeaponData extends CommonItemData {
async _preCreate(item, options) { async _preCreate(item, options) {
const showEquipPrompt = options.showEquipPrompt ?? true; const showEquipPrompt = options.showEquipPrompt ?? true;
if (showEquipPrompt && this.parent.isEmbedded && this._canEquip()) { if (showEquipPrompt && this.parent.isEmbedded && this._canEquip()) {
const shouldEquip = await DialogV2.confirm({ let shouldEquip = this.parent.parent.type === `geist`;
shouldEquip ||= await DialogV2.confirm({
window: { title: `Equip Item?` }, window: { title: `Equip Item?` },
content: `Do you want to equip ${item.name}?`, content: `Do you want to equip ${item.name}?`,
}); });
if (shouldEquip) { if (shouldEquip) {
this.updateSource({ "equipped": true }); this.updateSource({ "equipped": true });
}; };

View file

@ -9,5 +9,6 @@ export default {
"rc-options": options, "rc-options": options,
// #region Simple // #region Simple
"rc-ifOut": (v) => (v || ``),
"rc-empty-state": (v) => v ?? localizer(`RipCrypt.common.empty`), "rc-empty-state": (v) => v ?? localizer(`RipCrypt.common.empty`),
}; };

View file

@ -1,6 +1,7 @@
// Applications // Applications
import { AllItemSheetV1 } from "../Apps/ItemSheets/AllItemSheetV1.mjs"; import { AllItemSheetV1 } from "../Apps/ItemSheets/AllItemSheetV1.mjs";
import { ArmourSheet } from "../Apps/ItemSheets/ArmourSheet.mjs"; import { ArmourSheet } from "../Apps/ItemSheets/ArmourSheet.mjs";
import { BookGeistSheet } from "../Apps/ActorSheets/BookGeistSheet.mjs";
import { CombinedHeroSheet } from "../Apps/ActorSheets/CombinedHeroSheet.mjs"; import { CombinedHeroSheet } from "../Apps/ActorSheets/CombinedHeroSheet.mjs";
import { CraftCardV1 } from "../Apps/ActorSheets/CraftCardV1.mjs"; import { CraftCardV1 } from "../Apps/ActorSheets/CraftCardV1.mjs";
import { DelveDiceHUD } from "../Apps/DelveDiceHUD.mjs"; import { DelveDiceHUD } from "../Apps/DelveDiceHUD.mjs";
@ -17,6 +18,7 @@ import { GoodData } from "../data/Item/Good.mjs";
import { HeroData } from "../data/Actor/Hero.mjs"; import { HeroData } from "../data/Actor/Hero.mjs";
import { ShieldData } from "../data/Item/Shield.mjs"; import { ShieldData } from "../data/Item/Shield.mjs";
import { SkillData } from "../data/Item/Skill.mjs"; import { SkillData } from "../data/Item/Skill.mjs";
import { TraitData } from "../data/Item/Trait.mjs";
import { WeaponData } from "../data/Item/Weapon.mjs"; import { WeaponData } from "../data/Item/Weapon.mjs";
// Class Overrides // Class Overrides
@ -37,6 +39,7 @@ import { registerMetaSettings } from "../settings/metaSettings.mjs";
import { registerSockets } from "../sockets/_index.mjs"; import { registerSockets } from "../sockets/_index.mjs";
import { registerUserSettings } from "../settings/userSettings.mjs"; import { registerUserSettings } from "../settings/userSettings.mjs";
import { registerWorldSettings } from "../settings/worldSettings.mjs"; import { registerWorldSettings } from "../settings/worldSettings.mjs";
import { TraitSheet } from "../Apps/ItemSheets/TraitSheet.mjs";
const { Items, Actors } = foundry.documents.collections; const { Items, Actors } = foundry.documents.collections;
@ -62,6 +65,7 @@ Hooks.once(`init`, () => {
CONFIG.Item.dataModels.good = GoodData; CONFIG.Item.dataModels.good = GoodData;
CONFIG.Item.dataModels.shield = ShieldData; CONFIG.Item.dataModels.shield = ShieldData;
CONFIG.Item.dataModels.skill = SkillData; CONFIG.Item.dataModels.skill = SkillData;
CONFIG.Item.dataModels.trait = TraitData;
CONFIG.Item.dataModels.weapon = WeaponData; CONFIG.Item.dataModels.weapon = WeaponData;
// #endregion // #endregion
@ -87,22 +91,21 @@ Hooks.once(`init`, () => {
label: `RipCrypt.sheet-names.StatsCardV1`, label: `RipCrypt.sheet-names.StatsCardV1`,
themes: StatsCardV1.themes, themes: StatsCardV1.themes,
}); });
Actors.registerSheet(game.system.id, StatsCardV1, {
makeDefault: true,
types: [`geist`],
label: `RipCrypt.sheet-names.StatsCardV1`,
themes: StatsCardV1.themes,
});
Actors.registerSheet(game.system.id, SkillsCardV1, { Actors.registerSheet(game.system.id, SkillsCardV1, {
types: [`hero`, `geist`], types: [`hero`],
label: `RipCrypt.sheet-names.SkillsCardV1`, label: `RipCrypt.sheet-names.SkillsCardV1`,
themes: SkillsCardV1.themes, themes: SkillsCardV1.themes,
}); });
Actors.registerSheet(game.system.id, CraftCardV1, { Actors.registerSheet(game.system.id, CraftCardV1, {
types: [`hero`, `geist`], types: [`hero`],
label: `RipCrypt.sheet-names.CraftCardV1`, label: `RipCrypt.sheet-names.CraftCardV1`,
themes: CraftCardV1.themes, themes: CraftCardV1.themes,
}); });
Actors.registerSheet(game.system.id, BookGeistSheet, {
types: [`geist`],
label: `RipCrypt.sheet-names.BookGeistSheet`,
themes: BookGeistSheet.themes,
});
// #endregion // #endregion
// #region Items // #region Items
@ -118,8 +121,15 @@ Hooks.once(`init`, () => {
label: `RipCrypt.sheet-names.ArmourSheet`, label: `RipCrypt.sheet-names.ArmourSheet`,
themes: ArmourSheet.themes, themes: ArmourSheet.themes,
}); });
Items.registerSheet(game.system.id, TraitSheet, {
makeDefault: true,
types: [`trait`],
label: `RipCrypt.sheet-names.TraitSheet`,
themes: TraitSheet.themes,
});
Items.unregisterSheet(game.system.id, AllItemSheetV1, { Items.unregisterSheet(game.system.id, AllItemSheetV1, {
types: [`armour`, `shield`], types: [`armour`, `shield`, `trait`],
}); });
// #endregion // #endregion
// #endregion // #endregion

View file

@ -1,7 +1,6 @@
// Hooks // Hooks
import "./hooks/init.mjs"; import "./hooks/init.mjs";
import "./hooks/ready.mjs"; import "./hooks/ready.mjs";
import "./hooks/hotReload.mjs";
// Global API // Global API
import "./api.mjs"; import "./api.mjs";

View file

@ -7,8 +7,6 @@
"eslint": "^9.16.0" "eslint": "^9.16.0"
}, },
"scripts": { "scripts": {
"data:build": "node scripts/buildCompendia.mjs",
"data:extract": "node scripts/extractCompendia.mjs",
"link": "node scripts/linkFoundry.mjs", "link": "node scripts/linkFoundry.mjs",
"lint": "eslint --fix", "lint": "eslint --fix",
"lint:nofix": "eslint" "lint:nofix": "eslint"

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -1,49 +0,0 @@
{
"folder": "dBAI76CApXH8qqjx",
"name": "Quarterstaff",
"type": "weapon",
"_id": "0ebCxTylmQa5UJvF",
"img": "icons/svg/item-bag.svg",
"system": {
"quantity": 1,
"cost": {
"gold": null,
"silver": 20,
"copper": null
},
"traits": [
"Able"
],
"range": {
"short": null,
"long": null
},
"damage": 2,
"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": 1759992932299,
"modifiedTime": 1759992950112,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!items!0ebCxTylmQa5UJvF"
}

View file

@ -1,23 +0,0 @@
{
"type": "Item",
"folder": null,
"name": "Ranged Weapons",
"color": "#04262a",
"sorting": "m",
"_id": "sjc6X9bKf7BY04Ar",
"description": "",
"sort": 0,
"flags": {},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"exportSource": null,
"coreVersion": "13.350",
"systemId": "ripcrypt",
"systemVersion": "0.2.0",
"createdTime": 1759993402367,
"modifiedTime": 1759993402367,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!folders!sjc6X9bKf7BY04Ar"
}

View file

@ -1,50 +0,0 @@
{
"folder": "dBAI76CApXH8qqjx",
"name": "Rapier, Foil",
"type": "weapon",
"_id": "cgEQKXKnSShCRQaq",
"img": "icons/svg/item-bag.svg",
"system": {
"quantity": 1,
"cost": {
"gold": null,
"silver": 120,
"copper": null
},
"traits": [
"Agile",
"Long"
],
"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": 1759992972763,
"modifiedTime": 1759992992895,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!items!cgEQKXKnSShCRQaq"
}

View file

@ -1,49 +0,0 @@
{
"folder": "3tp9cwpArQNOpkAY",
"name": "Scythe",
"type": "weapon",
"_id": "PnBWkLNzmQjXbB94",
"img": "icons/svg/item-bag.svg",
"system": {
"quantity": 1,
"cost": {
"gold": null,
"silver": 80,
"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": 1759993335901,
"modifiedTime": 1759993351161,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!items!PnBWkLNzmQjXbB94"
}

View file

@ -1,49 +0,0 @@
{
"folder": "8NNF9jBjpmPpmw1B",
"name": "Shortbow",
"type": "weapon",
"_id": "qmnDO3TrKoeW7DZB",
"img": "icons/svg/item-bag.svg",
"system": {
"quantity": 1,
"cost": {
"gold": null,
"silver": 50,
"copper": null
},
"traits": [
"Ammo"
],
"range": {
"short": 6,
"long": 20
},
"damage": 2,
"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": 1759993734661,
"modifiedTime": 1759993756094,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!items!qmnDO3TrKoeW7DZB"
}

View file

@ -1,47 +0,0 @@
{
"folder": "dBAI76CApXH8qqjx",
"name": "Shortsword",
"type": "weapon",
"_id": "UulalWrMRtSX5KxZ",
"img": "icons/svg/item-bag.svg",
"system": {
"quantity": 1,
"cost": {
"gold": null,
"silver": 60,
"copper": null
},
"traits": [],
"range": {
"short": null,
"long": null
},
"damage": 2,
"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": 1759993008835,
"modifiedTime": 1759993028879,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!items!UulalWrMRtSX5KxZ"
}

View file

@ -1,35 +0,0 @@
{
"folder": "gvNPXXRBx2eGIzcU",
"name": "Shot",
"type": "ammo",
"_id": "Q5i7hMOPgb9oXmh5",
"img": "icons/svg/item-bag.svg",
"system": {
"quantity": 12,
"cost": {
"gold": null,
"silver": 10,
"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": 1759994014714,
"modifiedTime": 1759994020511,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!items!Q5i7hMOPgb9oXmh5"
}

View file

@ -1,47 +0,0 @@
{
"folder": "dBAI76CApXH8qqjx",
"name": "Sickle",
"type": "weapon",
"_id": "o9saXoHahbxTxt4h",
"img": "icons/svg/item-bag.svg",
"system": {
"quantity": 1,
"cost": {
"gold": null,
"silver": 80,
"copper": null
},
"traits": [],
"range": {
"short": null,
"long": null
},
"damage": 3,
"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": 1759993051839,
"modifiedTime": 1759993069744,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!items!o9saXoHahbxTxt4h"
}

View file

@ -1,50 +0,0 @@
{
"folder": "dBAI76CApXH8qqjx",
"name": "Spear, Javelin, Pike",
"type": "weapon",
"_id": "bTOoWxHeLSY9JWNY",
"img": "icons/svg/item-bag.svg",
"system": {
"quantity": 1,
"cost": {
"gold": null,
"silver": 30,
"copper": null
},
"traits": [
"Agile",
"Thrown"
],
"range": {
"short": 5,
"long": 10
},
"damage": 2,
"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": 1759993081111,
"modifiedTime": 1759993110561,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!items!bTOoWxHeLSY9JWNY"
}

View file

@ -1,49 +0,0 @@
{
"folder": "vPyj2cK1j66Zyrul",
"name": "Throwing Axe",
"type": "weapon",
"_id": "n2j1gxnn3WnUPag6",
"img": "icons/svg/item-bag.svg",
"system": {
"quantity": 1,
"cost": {
"gold": null,
"silver": 30,
"copper": null
},
"traits": [
"Thrown"
],
"range": {
"short": 2,
"long": 4
},
"damage": 1,
"wear": {
"value": 3,
"max": 3
},
"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": 1759993592390,
"modifiedTime": 1759993609878,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!items!n2j1gxnn3WnUPag6"
}

View file

@ -1,47 +0,0 @@
{
"folder": "dBAI76CApXH8qqjx",
"name": "Warclub, Flail, Mace",
"type": "weapon",
"_id": "WMiQdSVgM8z84MEv",
"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": 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": 1759993125576,
"modifiedTime": 1759993138211,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!items!WMiQdSVgM8z84MEv"
}

View file

@ -1,50 +0,0 @@
{
"folder": "dBAI76CApXH8qqjx",
"name": "Whip",
"type": "weapon",
"_id": "vVF6LZSFi0pNB95E",
"img": "icons/svg/item-bag.svg",
"system": {
"quantity": 1,
"cost": {
"gold": null,
"silver": 20,
"copper": null
},
"traits": [
"Agile",
"Long"
],
"range": {
"short": null,
"long": null
},
"damage": 1,
"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": 1759993155738,
"modifiedTime": 1759993176128,
"lastModifiedBy": "9x9FgB0YTeCJJUDK"
},
"_key": "!items!vVF6LZSFi0pNB95E"
}

View file

@ -1,36 +0,0 @@
import { existsSync } from "fs";
import { readFile } from "fs/promises";
import { join } from "path";
import { compilePack } from "@foundryvtt/foundryvtt-cli";
import { pathToFileURL } from "url";
export async function buildCompendia() {
const manifest = JSON.parse(await readFile(`./system.json`, `utf-8`));
if (!manifest.packs || manifest.packs.length === 0) {
console.log(`No compendium packs defined`);
process.exit(0);
};
console.log(`Packing compendia`);
for (const compendium of manifest.packs) {
console.debug(`Packing ${compendium.label} (${compendium.name})`);
let src = join(process.cwd(), compendium.path, `_source`);
if (!existsSync(src)) {
console.warn(`${compendium.path} doesn't exist, skipping.`)
continue;
};
await compilePack(
src,
join(process.cwd(), compendium.path),
{ recursive: true },
);
console.debug(`Finished packing compendium: ${compendium.name}`);
};
console.log(`Finished packing all compendia`)
};
if (import.meta.url === pathToFileURL(process.argv[1]).href) {
buildCompendia();
};

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