[^)]+)\))?$/i;
+ const match = original.trim().match(pattern);
+ if (match) {
+ // Match a known creature type
+ const typeLc = match.groups.type.trim().toLowerCase();
+ const typeMatch = Object.entries(CONFIG.SW5E.creatureTypes).find(([k, v]) => {
+ return (
+ typeLc === k ||
+ typeLc === game.i18n.localize(v).toLowerCase() ||
+ typeLc === game.i18n.localize(`${v}Pl`).toLowerCase()
+ );
+ });
+ if (typeMatch) data.value = typeMatch[0];
+ else {
+ data.value = "custom";
+ data.custom = match.groups.type.trim().titleCase();
+ }
+ data.subtype = match.groups.subtype?.trim().titleCase() || "";
- // Match a known creature type
- const typeLc = match.groups.type.trim().toLowerCase();
- const typeMatch = Object.entries(CONFIG.SW5E.creatureTypes).find(([k, v]) => {
- return (typeLc === k) ||
- (typeLc === game.i18n.localize(v).toLowerCase()) ||
- (typeLc === game.i18n.localize(`${v}Pl`).toLowerCase());
- });
- if (typeMatch) data.value = typeMatch[0];
- else {
- data.value = "custom";
- data.custom = match.groups.type.trim().titleCase();
- }
- data.subtype = match.groups.subtype?.trim().titleCase() || "";
+ // Match a swarm
+ const isNamedSwarm = actor.name.startsWith(game.i18n.localize("SW5E.CreatureSwarm"));
+ if (match.groups.size || isNamedSwarm) {
+ const sizeLc = match.groups.size ? match.groups.size.trim().toLowerCase() : "tiny";
+ const sizeMatch = Object.entries(CONFIG.SW5E.actorSizes).find(([k, v]) => {
+ return sizeLc === k || sizeLc === game.i18n.localize(v).toLowerCase();
+ });
+ data.swarm = sizeMatch ? sizeMatch[0] : "tiny";
+ } else data.swarm = "";
+ }
- // Match a swarm
- const isNamedSwarm = actor.name.startsWith(game.i18n.localize("SW5E.CreatureSwarm"));
- if (match.groups.size || isNamedSwarm) {
- const sizeLc = match.groups.size ? match.groups.size.trim().toLowerCase() : "tiny";
- const sizeMatch = Object.entries(CONFIG.SW5E.actorSizes).find(([k, v]) => {
- return (sizeLc === k) || (sizeLc === game.i18n.localize(v).toLowerCase());
- });
- data.swarm = sizeMatch ? sizeMatch[0] : "tiny";
- } else data.swarm = "";
+ // No match found
+ else {
+ data.value = "custom";
+ data.custom = original;
+ }
}
- // No match found
- else {
- data.value = "custom";
- data.custom = original;
- }
- }
-
- // Update the actor data
- updateData["data.details.type"] = data;
- return updateData;
+ // Update the actor data
+ updateData["data.details.type"] = data;
+ return updateData;
}
/* -------------------------------------------- */
@@ -551,42 +558,41 @@ function _migrateActorType(actor, updateData) {
* @private
*/
function _migrateItemClassPowerCasting(item, updateData) {
- if (item.type === "class"){
- switch (item.name){
- case "Consular":
- updateData["data.powercasting"] = {
- progression: "consular",
- ability: ""
- };
- break;
- case "Engineer":
-
- updateData["data.powercasting"] = {
- progression: "engineer",
- ability: ""
- };
- break;
- case "Guardian":
- updateData["data.powercasting"] = {
- progression: "guardian",
- ability: ""
- };
- break;
- case "Scout":
- updateData["data.powercasting"] = {
- progression: "scout",
- ability: ""
- };
- break;
- case "Sentinel":
- updateData["data.powercasting"] = {
- progression: "sentinel",
- ability: ""
- };
- break;
+ if (item.type === "class") {
+ switch (item.name) {
+ case "Consular":
+ updateData["data.powercasting"] = {
+ progression: "consular",
+ ability: ""
+ };
+ break;
+ case "Engineer":
+ updateData["data.powercasting"] = {
+ progression: "engineer",
+ ability: ""
+ };
+ break;
+ case "Guardian":
+ updateData["data.powercasting"] = {
+ progression: "guardian",
+ ability: ""
+ };
+ break;
+ case "Scout":
+ updateData["data.powercasting"] = {
+ progression: "scout",
+ ability: ""
+ };
+ break;
+ case "Sentinel":
+ updateData["data.powercasting"] = {
+ progression: "sentinel",
+ ability: ""
+ };
+ break;
+ }
}
- }
- return updateData;
+ return updateData;
}
/* -------------------------------------------- */
@@ -598,42 +604,45 @@ function _migrateItemClassPowerCasting(item, updateData) {
* @private
*/
async function _migrateItemPower(item, actor, updateData) {
- // if item is not a power shortcut out
- if (item.type !== "power") return updateData;
+ // if item is not a power shortcut out
+ if (item.type !== "power") return updateData;
- console.log(`Checking Actor ${actor.name}'s ${item.name} for migration needs`);
- // check for flag.core, if not there is no compendium power so exit
- const hasSource = item?.flags?.core?.sourceId !== undefined;
- if (!hasSource) return updateData;
+ console.log(`Checking Actor ${actor.name}'s ${item.name} for migration needs`);
+ // check for flag.core, if not there is no compendium power so exit
+ const hasSource = item?.flags?.core?.sourceId !== undefined;
+ if (!hasSource) return updateData;
- // shortcut out if dataVersion flag is set to 1.2.4 or higher
- const hasDataVersion = item?.flags?.sw5e?.dataVersion !== undefined;
- if (hasDataVersion && (item.flags.sw5e.dataVersion === "1.2.4" || isNewerVersion("1.2.4", item.flags.sw5e.dataVersion))) return updateData;
-
- // Check to see what the source of Power is
- const sourceId = item.flags.core.sourceId;
- const coreSource = sourceId.substr(0, sourceId.length - 17);
- const core_id = sourceId.substr(sourceId.length - 16, 16);
-
- //if power type is not force or tech exit out
- let powerType = "none";
- if (coreSource === "Compendium.sw5e.forcepowers") powerType = "sw5e.forcepowers";
- if (coreSource === "Compendium.sw5e.techpowers") powerType = "sw5e.techpowers";
- if (powerType === "none") return updateData;
+ // shortcut out if dataVersion flag is set to 1.2.4 or higher
+ const hasDataVersion = item?.flags?.sw5e?.dataVersion !== undefined;
+ if (
+ hasDataVersion &&
+ (item.flags.sw5e.dataVersion === "1.2.4" || isNewerVersion("1.2.4", item.flags.sw5e.dataVersion))
+ )
+ return updateData;
+
+ // Check to see what the source of Power is
+ const sourceId = item.flags.core.sourceId;
+ const coreSource = sourceId.substr(0, sourceId.length - 17);
+ const core_id = sourceId.substr(sourceId.length - 16, 16);
+
+ //if power type is not force or tech exit out
+ let powerType = "none";
+ if (coreSource === "Compendium.sw5e.forcepowers") powerType = "sw5e.forcepowers";
+ if (coreSource === "Compendium.sw5e.techpowers") powerType = "sw5e.techpowers";
+ if (powerType === "none") return updateData;
const corePower = duplicate(await game.packs.get(powerType).getEntity(core_id));
console.log(`Updating Actor ${actor.name}'s ${item.name} from compendium`);
const corePowerData = corePower.data;
// copy Core Power Data over original Power
updateData["data"] = corePowerData;
- updateData["flags"] = {"sw5e": {"dataVersion": "1.2.4"}};
+ updateData["flags"] = {sw5e: {dataVersion: "1.2.4"}};
return updateData;
-
-
- //game.packs.get(powerType).getEntity(core_id).then(corePower => {
- //})
+ //game.packs.get(powerType).getEntity(core_id).then(corePower => {
+
+ //})
}
/* -------------------------------------------- */
@@ -647,10 +656,10 @@ async function _migrateItemPower(item, actor, updateData) {
* @private
*/
function _migrateItemAttunement(item, updateData) {
- if ( item.data?.attuned === undefined ) return updateData;
- updateData["data.attunement"] = CONFIG.SW5E.attunementTypes.NONE;
- updateData["data.-=attuned"] = null;
- return updateData;
+ if (item.data?.attuned === undefined) return updateData;
+ updateData["data.attunement"] = CONFIG.SW5E.attunementTypes.NONE;
+ updateData["data.-=attuned"] = null;
+ return updateData;
}
/* -------------------------------------------- */
@@ -661,43 +670,41 @@ function _migrateItemAttunement(item, updateData) {
* @private
*/
export async function purgeFlags(pack) {
- const cleanFlags = (flags) => {
- const flags5e = flags.sw5e || null;
- return flags5e ? {sw5e: flags5e} : {};
- };
- await pack.configure({locked: false});
- const content = await pack.getContent();
- for ( let entity of content ) {
- const update = {_id: entity.id, flags: cleanFlags(entity.data.flags)};
- if ( pack.entity === "Actor" ) {
- update.items = entity.data.items.map(i => {
- i.flags = cleanFlags(i.flags);
- return i;
- })
+ const cleanFlags = (flags) => {
+ const flags5e = flags.sw5e || null;
+ return flags5e ? {sw5e: flags5e} : {};
+ };
+ await pack.configure({locked: false});
+ const content = await pack.getContent();
+ for (let entity of content) {
+ const update = {_id: entity.id, flags: cleanFlags(entity.data.flags)};
+ if (pack.entity === "Actor") {
+ update.items = entity.data.items.map((i) => {
+ i.flags = cleanFlags(i.flags);
+ return i;
+ });
+ }
+ await pack.updateEntity(update, {recursive: false});
+ console.log(`Purged flags from ${entity.name}`);
}
- await pack.updateEntity(update, {recursive: false});
- console.log(`Purged flags from ${entity.name}`);
- }
- await pack.configure({locked: true});
+ await pack.configure({locked: true});
}
/* -------------------------------------------- */
-
/**
* Purge the data model of any inner objects which have been flagged as _deprecated.
* @param {object} data The data to clean
* @private
*/
export function removeDeprecatedObjects(data) {
- for ( let [k, v] of Object.entries(data) ) {
- if ( getType(v) === "Object" ) {
- if (v._deprecated === true) {
- console.log(`Deleting deprecated object key ${k}`);
- delete data[k];
- }
- else removeDeprecatedObjects(v);
+ for (let [k, v] of Object.entries(data)) {
+ if (getType(v) === "Object") {
+ if (v._deprecated === true) {
+ console.log(`Deleting deprecated object key ${k}`);
+ delete data[k];
+ } else removeDeprecatedObjects(v);
+ }
}
- }
- return data;
+ return data;
}
diff --git a/module/pixi/ability-template.js b/module/pixi/ability-template.js
index 3af99181..6799eaec 100644
--- a/module/pixi/ability-template.js
+++ b/module/pixi/ability-template.js
@@ -1,133 +1,132 @@
-import { SW5E } from "../config.js";
+import {SW5E} from "../config.js";
/**
* A helper class for building MeasuredTemplates for 5e powers and abilities
* @extends {MeasuredTemplate}
*/
export default class AbilityTemplate extends MeasuredTemplate {
+ /**
+ * A factory method to create an AbilityTemplate instance using provided data from an Item5e instance
+ * @param {Item5e} item The Item object for which to construct the template
+ * @return {AbilityTemplate|null} The template object, or null if the item does not produce a template
+ */
+ static fromItem(item) {
+ const target = getProperty(item.data, "data.target") || {};
+ const templateShape = SW5E.areaTargetTypes[target.type];
+ if (!templateShape) return null;
- /**
- * A factory method to create an AbilityTemplate instance using provided data from an Item5e instance
- * @param {Item5e} item The Item object for which to construct the template
- * @return {AbilityTemplate|null} The template object, or null if the item does not produce a template
- */
- static fromItem(item) {
- const target = getProperty(item.data, "data.target") || {};
- const templateShape = SW5E.areaTargetTypes[target.type];
- if ( !templateShape ) return null;
+ // Prepare template data
+ const templateData = {
+ t: templateShape,
+ user: game.user.data._id,
+ distance: target.value,
+ direction: 0,
+ x: 0,
+ y: 0,
+ fillColor: game.user.color
+ };
- // Prepare template data
- const templateData = {
- t: templateShape,
- user: game.user.data._id,
- distance: target.value,
- direction: 0,
- x: 0,
- y: 0,
- fillColor: game.user.color
- };
+ // Additional type-specific data
+ switch (templateShape) {
+ case "cone":
+ templateData.angle = CONFIG.MeasuredTemplate.defaults.angle;
+ break;
+ case "rect": // 5e rectangular AoEs are always cubes
+ templateData.distance = Math.hypot(target.value, target.value);
+ templateData.width = target.value;
+ templateData.direction = 45;
+ break;
+ case "ray": // 5e rays are most commonly 1 square (5 ft) in width
+ templateData.width = target.width ?? canvas.dimensions.distance;
+ break;
+ default:
+ break;
+ }
- // Additional type-specific data
- switch ( templateShape ) {
- case "cone":
- templateData.angle = CONFIG.MeasuredTemplate.defaults.angle;
- break;
- case "rect": // 5e rectangular AoEs are always cubes
- templateData.distance = Math.hypot(target.value, target.value);
- templateData.width = target.value;
- templateData.direction = 45;
- break;
- case "ray": // 5e rays are most commonly 1 square (5 ft) in width
- templateData.width = target.width ?? canvas.dimensions.distance;
- break;
- default:
- break;
+ // Return the template constructed from the item data
+ const cls = CONFIG.MeasuredTemplate.documentClass;
+ const template = new cls(templateData, {parent: canvas.scene});
+ const object = new this(template);
+ object.item = item;
+ object.actorSheet = item.actor?.sheet || null;
+ return object;
}
- // Return the template constructed from the item data
- const cls = CONFIG.MeasuredTemplate.documentClass;
- const template = new cls(templateData, {parent: canvas.scene});
- const object = new this(template);
- object.item = item;
- object.actorSheet = item.actor?.sheet || null;
- return object;
- }
+ /* -------------------------------------------- */
- /* -------------------------------------------- */
+ /**
+ * Creates a preview of the power template
+ */
+ drawPreview() {
+ const initialLayer = canvas.activeLayer;
- /**
- * Creates a preview of the power template
- */
- drawPreview() {
- const initialLayer = canvas.activeLayer;
+ // Draw the template and switch to the template layer
+ this.draw();
+ this.layer.activate();
+ this.layer.preview.addChild(this);
- // Draw the template and switch to the template layer
- this.draw();
- this.layer.activate();
- this.layer.preview.addChild(this);
+ // Hide the sheet that originated the preview
+ if (this.actorSheet) this.actorSheet.minimize();
- // Hide the sheet that originated the preview
- if ( this.actorSheet ) this.actorSheet.minimize();
+ // Activate interactivity
+ this.activatePreviewListeners(initialLayer);
+ }
- // Activate interactivity
- this.activatePreviewListeners(initialLayer);
- }
+ /* -------------------------------------------- */
- /* -------------------------------------------- */
+ /**
+ * Activate listeners for the template preview
+ * @param {CanvasLayer} initialLayer The initially active CanvasLayer to re-activate after the workflow is complete
+ */
+ activatePreviewListeners(initialLayer) {
+ const handlers = {};
+ let moveTime = 0;
- /**
- * Activate listeners for the template preview
- * @param {CanvasLayer} initialLayer The initially active CanvasLayer to re-activate after the workflow is complete
- */
- activatePreviewListeners(initialLayer) {
- const handlers = {};
- let moveTime = 0;
+ // Update placement (mouse-move)
+ handlers.mm = (event) => {
+ event.stopPropagation();
+ let now = Date.now(); // Apply a 20ms throttle
+ if (now - moveTime <= 20) return;
+ const center = event.data.getLocalPosition(this.layer);
+ const snapped = canvas.grid.getSnappedPosition(center.x, center.y, 2);
+ this.data.update({x: snapped.x, y: snapped.y});
+ this.refresh();
+ moveTime = now;
+ };
- // Update placement (mouse-move)
- handlers.mm = event => {
- event.stopPropagation();
- let now = Date.now(); // Apply a 20ms throttle
- if ( now - moveTime <= 20 ) return;
- const center = event.data.getLocalPosition(this.layer);
- const snapped = canvas.grid.getSnappedPosition(center.x, center.y, 2);
- this.data.update({x: snapped.x, y: snapped.y});
- this.refresh();
- moveTime = now;
- };
+ // Cancel the workflow (right-click)
+ handlers.rc = (event) => {
+ this.layer.preview.removeChildren();
+ canvas.stage.off("mousemove", handlers.mm);
+ canvas.stage.off("mousedown", handlers.lc);
+ canvas.app.view.oncontextmenu = null;
+ canvas.app.view.onwheel = null;
+ initialLayer.activate();
+ this.actorSheet.maximize();
+ };
- // Cancel the workflow (right-click)
- handlers.rc = event => {
- this.layer.preview.removeChildren();
- canvas.stage.off("mousemove", handlers.mm);
- canvas.stage.off("mousedown", handlers.lc);
- canvas.app.view.oncontextmenu = null;
- canvas.app.view.onwheel = null;
- initialLayer.activate();
- this.actorSheet.maximize();
- };
+ // Confirm the workflow (left-click)
+ handlers.lc = (event) => {
+ handlers.rc(event);
+ const destination = canvas.grid.getSnappedPosition(this.data.x, this.data.y, 2);
+ this.data.update(destination);
+ canvas.scene.createEmbeddedDocuments("MeasuredTemplate", [this.data]);
+ };
- // Confirm the workflow (left-click)
- handlers.lc = event => {
- handlers.rc(event);
- const destination = canvas.grid.getSnappedPosition(this.data.x, this.data.y, 2);
- this.data.update(destination);
- canvas.scene.createEmbeddedDocuments("MeasuredTemplate", [this.data]);
- };
+ // Rotate the template by 3 degree increments (mouse-wheel)
+ handlers.mw = (event) => {
+ if (event.ctrlKey) event.preventDefault(); // Avoid zooming the browser window
+ event.stopPropagation();
+ let delta = canvas.grid.type > CONST.GRID_TYPES.SQUARE ? 30 : 15;
+ let snap = event.shiftKey ? delta : 5;
+ this.data.update({direction: this.data.direction + snap * Math.sign(event.deltaY)});
+ this.refresh();
+ };
- // Rotate the template by 3 degree increments (mouse-wheel)
- handlers.mw = event => {
- if ( event.ctrlKey ) event.preventDefault(); // Avoid zooming the browser window
- event.stopPropagation();
- let delta = canvas.grid.type > CONST.GRID_TYPES.SQUARE ? 30 : 15;
- let snap = event.shiftKey ? delta : 5;
- this.data.update({direction: this.data.direction + (snap * Math.sign(event.deltaY))});
- this.refresh();
- };
-
- // Activate listeners
- canvas.stage.on("mousemove", handlers.mm);
- canvas.stage.on("mousedown", handlers.lc);
- canvas.app.view.oncontextmenu = handlers.rc;
- canvas.app.view.onwheel = handlers.mw;
- }
+ // Activate listeners
+ canvas.stage.on("mousemove", handlers.mm);
+ canvas.stage.on("mousedown", handlers.lc);
+ canvas.app.view.oncontextmenu = handlers.rc;
+ canvas.app.view.onwheel = handlers.mw;
+ }
}
diff --git a/module/settings.js b/module/settings.js
index 2adde8d3..3b765c69 100644
--- a/module/settings.js
+++ b/module/settings.js
@@ -1,145 +1,144 @@
-export const registerSystemSettings = function() {
+export const registerSystemSettings = function () {
+ /**
+ * Track the system version upon which point a migration was last applied
+ */
+ game.settings.register("sw5e", "systemMigrationVersion", {
+ name: "System Migration Version",
+ scope: "world",
+ config: false,
+ type: String,
+ default: game.system.data.version
+ });
- /**
- * Track the system version upon which point a migration was last applied
- */
- game.settings.register("sw5e", "systemMigrationVersion", {
- name: "System Migration Version",
- scope: "world",
- config: false,
- type: String,
- default: game.system.data.version
- });
+ /**
+ * Register resting variants
+ */
+ game.settings.register("sw5e", "restVariant", {
+ name: "SETTINGS.5eRestN",
+ hint: "SETTINGS.5eRestL",
+ scope: "world",
+ config: true,
+ default: "normal",
+ type: String,
+ choices: {
+ normal: "SETTINGS.5eRestPHB",
+ gritty: "SETTINGS.5eRestGritty",
+ epic: "SETTINGS.5eRestEpic"
+ }
+ });
- /**
- * Register resting variants
- */
- game.settings.register("sw5e", "restVariant", {
- name: "SETTINGS.5eRestN",
- hint: "SETTINGS.5eRestL",
- scope: "world",
- config: true,
- default: "normal",
- type: String,
- choices: {
- "normal": "SETTINGS.5eRestPHB",
- "gritty": "SETTINGS.5eRestGritty",
- "epic": "SETTINGS.5eRestEpic",
- }
- });
+ /**
+ * Register diagonal movement rule setting
+ */
+ game.settings.register("sw5e", "diagonalMovement", {
+ name: "SETTINGS.5eDiagN",
+ hint: "SETTINGS.5eDiagL",
+ scope: "world",
+ config: true,
+ default: "555",
+ type: String,
+ choices: {
+ 555: "SETTINGS.5eDiagPHB",
+ 5105: "SETTINGS.5eDiagDMG",
+ EUCL: "SETTINGS.5eDiagEuclidean"
+ },
+ onChange: (rule) => (canvas.grid.diagonalRule = rule)
+ });
- /**
- * Register diagonal movement rule setting
- */
- game.settings.register("sw5e", "diagonalMovement", {
- name: "SETTINGS.5eDiagN",
- hint: "SETTINGS.5eDiagL",
- scope: "world",
- config: true,
- default: "555",
- type: String,
- choices: {
- "555": "SETTINGS.5eDiagPHB",
- "5105": "SETTINGS.5eDiagDMG",
- "EUCL": "SETTINGS.5eDiagEuclidean",
- },
- onChange: rule => canvas.grid.diagonalRule = rule
- });
+ /**
+ * Register Initiative formula setting
+ */
+ game.settings.register("sw5e", "initiativeDexTiebreaker", {
+ name: "SETTINGS.5eInitTBN",
+ hint: "SETTINGS.5eInitTBL",
+ scope: "world",
+ config: true,
+ default: false,
+ type: Boolean
+ });
- /**
- * Register Initiative formula setting
- */
- game.settings.register("sw5e", "initiativeDexTiebreaker", {
- name: "SETTINGS.5eInitTBN",
- hint: "SETTINGS.5eInitTBL",
- scope: "world",
- config: true,
- default: false,
- type: Boolean
- });
+ /**
+ * Require Currency Carrying Weight
+ */
+ game.settings.register("sw5e", "currencyWeight", {
+ name: "SETTINGS.5eCurWtN",
+ hint: "SETTINGS.5eCurWtL",
+ scope: "world",
+ config: true,
+ default: true,
+ type: Boolean
+ });
- /**
- * Require Currency Carrying Weight
- */
- game.settings.register("sw5e", "currencyWeight", {
- name: "SETTINGS.5eCurWtN",
- hint: "SETTINGS.5eCurWtL",
- scope: "world",
- config: true,
- default: true,
- type: Boolean
- });
+ /**
+ * Option to disable XP bar for session-based or story-based advancement.
+ */
+ game.settings.register("sw5e", "disableExperienceTracking", {
+ name: "SETTINGS.5eNoExpN",
+ hint: "SETTINGS.5eNoExpL",
+ scope: "world",
+ config: true,
+ default: false,
+ type: Boolean
+ });
- /**
- * Option to disable XP bar for session-based or story-based advancement.
- */
- game.settings.register("sw5e", "disableExperienceTracking", {
- name: "SETTINGS.5eNoExpN",
- hint: "SETTINGS.5eNoExpL",
- scope: "world",
- config: true,
- default: false,
- type: Boolean,
- });
+ /**
+ * Option to automatically collapse Item Card descriptions
+ */
+ game.settings.register("sw5e", "autoCollapseItemCards", {
+ name: "SETTINGS.5eAutoCollapseCardN",
+ hint: "SETTINGS.5eAutoCollapseCardL",
+ scope: "client",
+ config: true,
+ default: false,
+ type: Boolean,
+ onChange: (s) => {
+ ui.chat.render();
+ }
+ });
- /**
- * Option to automatically collapse Item Card descriptions
- */
- game.settings.register("sw5e", "autoCollapseItemCards", {
- name: "SETTINGS.5eAutoCollapseCardN",
- hint: "SETTINGS.5eAutoCollapseCardL",
- scope: "client",
- config: true,
- default: false,
- type: Boolean,
- onChange: s => {
- ui.chat.render();
- }
- });
+ /**
+ * Option to allow GMs to restrict polymorphing to GMs only.
+ */
+ game.settings.register("sw5e", "allowPolymorphing", {
+ name: "SETTINGS.5eAllowPolymorphingN",
+ hint: "SETTINGS.5eAllowPolymorphingL",
+ scope: "world",
+ config: true,
+ default: false,
+ type: Boolean
+ });
- /**
- * Option to allow GMs to restrict polymorphing to GMs only.
- */
- game.settings.register('sw5e', 'allowPolymorphing', {
- name: 'SETTINGS.5eAllowPolymorphingN',
- hint: 'SETTINGS.5eAllowPolymorphingL',
- scope: 'world',
- config: true,
- default: false,
- type: Boolean
- });
-
- /**
- * Remember last-used polymorph settings.
- */
- game.settings.register('sw5e', 'polymorphSettings', {
- scope: 'client',
- default: {
- keepPhysical: false,
- keepMental: false,
- keepSaves: false,
- keepSkills: false,
- mergeSaves: false,
- mergeSkills: false,
- keepClass: false,
- keepFeats: false,
- keepPowers: false,
- keepItems: false,
- keepBio: false,
- keepVision: true,
- transformTokens: true
- }
- });
- game.settings.register("sw5e", "colorTheme", {
- name: "SETTINGS.SWColorN",
- hint: "SETTINGS.SWColorL",
- scope: "world",
- config: true,
- default: "light",
- type: String,
- choices: {
- "light": "SETTINGS.SWColorLight",
- "dark": "SETTINGS.SWColorDark"
- }
- });
+ /**
+ * Remember last-used polymorph settings.
+ */
+ game.settings.register("sw5e", "polymorphSettings", {
+ scope: "client",
+ default: {
+ keepPhysical: false,
+ keepMental: false,
+ keepSaves: false,
+ keepSkills: false,
+ mergeSaves: false,
+ mergeSkills: false,
+ keepClass: false,
+ keepFeats: false,
+ keepPowers: false,
+ keepItems: false,
+ keepBio: false,
+ keepVision: true,
+ transformTokens: true
+ }
+ });
+ game.settings.register("sw5e", "colorTheme", {
+ name: "SETTINGS.SWColorN",
+ hint: "SETTINGS.SWColorL",
+ scope: "world",
+ config: true,
+ default: "light",
+ type: String,
+ choices: {
+ light: "SETTINGS.SWColorLight",
+ dark: "SETTINGS.SWColorDark"
+ }
+ });
};
diff --git a/module/templates.js b/module/templates.js
index a27bdf71..e810b6da 100644
--- a/module/templates.js
+++ b/module/templates.js
@@ -3,34 +3,33 @@
* Pre-loaded templates are compiled and cached for fast access when rendering
* @return {Promise}
*/
-export const preloadHandlebarsTemplates = async function() {
- return loadTemplates([
+export const preloadHandlebarsTemplates = async function () {
+ return loadTemplates([
+ // Shared Partials
+ "systems/sw5e/templates/actors/parts/active-effects.html",
- // Shared Partials
- "systems/sw5e/templates/actors/parts/active-effects.html",
+ // Actor Sheet Partials
+ "systems/sw5e/templates/actors/oldActor/parts/actor-traits.html",
+ "systems/sw5e/templates/actors/oldActor/parts/actor-inventory.html",
+ "systems/sw5e/templates/actors/oldActor/parts/actor-features.html",
+ "systems/sw5e/templates/actors/oldActor/parts/actor-powerbook.html",
+ "systems/sw5e/templates/actors/oldActor/parts/actor-notes.html",
- // Actor Sheet Partials
- "systems/sw5e/templates/actors/oldActor/parts/actor-traits.html",
- "systems/sw5e/templates/actors/oldActor/parts/actor-inventory.html",
- "systems/sw5e/templates/actors/oldActor/parts/actor-features.html",
- "systems/sw5e/templates/actors/oldActor/parts/actor-powerbook.html",
- "systems/sw5e/templates/actors/oldActor/parts/actor-notes.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-biography.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-core.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-crew.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-active-effects.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-features.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-inventory.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-force-powerbook.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-tech-powerbook.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-resources.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-traits.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-biography.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-core.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-crew.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-active-effects.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-features.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-inventory.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-force-powerbook.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-tech-powerbook.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-resources.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-traits.html",
-
- // Item Sheet Partials
- "systems/sw5e/templates/items/parts/item-action.html",
- "systems/sw5e/templates/items/parts/item-activation.html",
- "systems/sw5e/templates/items/parts/item-description.html",
- "systems/sw5e/templates/items/parts/item-mountable.html"
- ]);
+ // Item Sheet Partials
+ "systems/sw5e/templates/items/parts/item-action.html",
+ "systems/sw5e/templates/items/parts/item-activation.html",
+ "systems/sw5e/templates/items/parts/item-description.html",
+ "systems/sw5e/templates/items/parts/item-mountable.html"
+ ]);
};
diff --git a/module/token.js b/module/token.js
index db811603..873372cc 100644
--- a/module/token.js
+++ b/module/token.js
@@ -3,11 +3,10 @@
* @extends {TokenDocument}
*/
export class TokenDocument5e extends TokenDocument {
-
/** @inheritdoc */
getBarAttribute(...args) {
const data = super.getBarAttribute(...args);
- if ( data && (data.attribute === "attributes.hp") ) {
+ if (data && data.attribute === "attributes.hp") {
data.value += parseInt(getProperty(this.actor.data, "data.attributes.hp.temp") || 0);
data.max += parseInt(getProperty(this.actor.data, "data.attributes.hp.tempmax") || 0);
}
@@ -15,19 +14,16 @@ export class TokenDocument5e extends TokenDocument {
}
}
-
/* -------------------------------------------- */
-
/**
* Extend the base Token class to implement additional system-specific logic.
* @extends {Token}
*/
export class Token5e extends Token {
-
/** @inheritdoc */
_drawBar(number, bar, data) {
- if ( data.attribute === "attributes.hp" ) return this._drawHPBar(number, bar, data);
+ if (data.attribute === "attributes.hp") return this._drawHPBar(number, bar, data);
return super._drawBar(number, bar, data);
}
@@ -41,7 +37,6 @@ export class Token5e extends Token {
* @private
*/
_drawHPBar(number, bar, data) {
-
// Extract health data
let {value, max, temp, tempmax} = this.document.actor.data.data.attributes.hp;
temp = Number(temp || 0);
@@ -58,42 +53,50 @@ export class Token5e extends Token {
// Determine colors to use
const blk = 0x000000;
- const hpColor = PIXI.utils.rgb2hex([(1-(colorPct/2)), colorPct, 0]);
+ const hpColor = PIXI.utils.rgb2hex([1 - colorPct / 2, colorPct, 0]);
const c = CONFIG.SW5E.tokenHPColors;
// Determine the container size (logic borrowed from core)
const w = this.w;
- let h = Math.max((canvas.dimensions.size / 12), 8);
- if ( this.data.height >= 2 ) h *= 1.6;
+ let h = Math.max(canvas.dimensions.size / 12, 8);
+ if (this.data.height >= 2) h *= 1.6;
const bs = Math.clamped(h / 8, 1, 2);
- const bs1 = bs+1;
+ const bs1 = bs + 1;
// Overall bar container
- bar.clear()
+ bar.clear();
bar.beginFill(blk, 0.5).lineStyle(bs, blk, 1.0).drawRoundedRect(0, 0, w, h, 3);
// Temporary maximum HP
if (tempmax > 0) {
const pct = max / effectiveMax;
- bar.beginFill(c.tempmax, 1.0).lineStyle(1, blk, 1.0).drawRoundedRect(pct*w, 0, (1-pct)*w, h, 2);
+ bar.beginFill(c.tempmax, 1.0)
+ .lineStyle(1, blk, 1.0)
+ .drawRoundedRect(pct * w, 0, (1 - pct) * w, h, 2);
}
// Maximum HP penalty
else if (tempmax < 0) {
const pct = (max + tempmax) / max;
- bar.beginFill(c.negmax, 1.0).lineStyle(1, blk, 1.0).drawRoundedRect(pct*w, 0, (1-pct)*w, h, 2);
+ bar.beginFill(c.negmax, 1.0)
+ .lineStyle(1, blk, 1.0)
+ .drawRoundedRect(pct * w, 0, (1 - pct) * w, h, 2);
}
// Health bar
- bar.beginFill(hpColor, 1.0).lineStyle(bs, blk, 1.0).drawRoundedRect(0, 0, valuePct*w, h, 2)
+ bar.beginFill(hpColor, 1.0)
+ .lineStyle(bs, blk, 1.0)
+ .drawRoundedRect(0, 0, valuePct * w, h, 2);
// Temporary hit points
- if ( temp > 0 ) {
- bar.beginFill(c.temp, 1.0).lineStyle(0).drawRoundedRect(bs1, bs1, (tempPct*w)-(2*bs1), h-(2*bs1), 1);
+ if (temp > 0) {
+ bar.beginFill(c.temp, 1.0)
+ .lineStyle(0)
+ .drawRoundedRect(bs1, bs1, tempPct * w - 2 * bs1, h - 2 * bs1, 1);
}
// Set position
- let posY = (number === 0) ? (this.h - h) : 0;
+ let posY = number === 0 ? this.h - h : 0;
bar.position.set(0, posY);
}
}
diff --git a/package-lock.json b/package-lock.json
index 759e9b50..b2fbf9ac 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1266,9 +1266,9 @@
}
},
"hosted-git-info": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
- "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
},
"image-size": {
"version": "0.5.5",
@@ -3068,9 +3068,9 @@
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
},
"y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+ "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
},
"yargs": {
"version": "7.1.1",
diff --git a/packs/packs/adventuringgear.db b/packs/packs/adventuringgear.db
index e9b74e5a..1e4f8991 100644
--- a/packs/packs/adventuringgear.db
+++ b/packs/packs/adventuringgear.db
@@ -52,7 +52,7 @@
{"name":"Traz","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"tool","data":{"description":{"value":"","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":6,"price":300,"attuned":false,"equipped":false,"rarity":"","identified":true,"ability":"int","chatFlavor":"","proficient":0,"attributes":{"spelldc":10},"damage":{"parts":[]}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"systems/sw5e/packs/Icons/Musical%20Instrument/Traz.webp","_id":"UQu4duMtxYEXKAbo"}
{"name":"Tent, two-person","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"loot","data":{"description":{"value":"","chat":"","unidentified":""},"source":"","quantity":1,"weight":5,"price":20,"attuned":false,"equipped":false,"rarity":"","identified":true,"attributes":{"spelldc":10},"damage":{"parts":[]}},"flags":{},"img":"systems/sw5e/packs/Icons/Utility/Tent.webp","_id":"UxL0trd3omeqzBk4"}
{"name":"Homing Beacon","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"loot","data":{"description":{"value":"A homing beacon is a device used to track starships or any other entity being transported. Homing beacons transmit using non-mass HoloNet transceivers able to be tracked through hyperspace. Homing beacons are small enough that they can easily be hidden inside a ship, or tucked into some crevice on its exterior.
","chat":"","unidentified":""},"source":"","quantity":1,"weight":1,"price":450,"attuned":false,"equipped":false,"rarity":"","identified":true,"attributes":{"spelldc":10},"damage":{"parts":[]}},"flags":{},"img":"systems/sw5e/packs/Icons/Utility/Homing%20Beacon.webp","_id":"V2hSxkLfq461mvNz"}
-{"name":"Power Cell","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"consumable","data":{"description":{"value":"Power cells fuel blaster weapons that deal energy or ion damage. Additionally, power cells are used to energize certain tools.
","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":1,"price":10,"attuned":false,"equipped":false,"rarity":"","identified":true,"activation":{"type":"none","cost":null,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":100,"max":"100","per":"charges","autoDestroy":false},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"spell"},"consumableType":"ammo","attributes":{"spelldc":10}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"systems/sw5e/packs/Icons/Ammunition/Power%20Cell.webp","_id":"VUkO1T2aYMuUcBZM"}
+{"name":"Power Cell","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"consumable","data":{"description":{"value":"Power cells fuel blaster weapons that deal energy or ion damage. Additionally, power cells are used to energize certain tools.
","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":1,"price":10,"attuned":false,"equipped":false,"rarity":"","identified":true,"activation": {"type": "none","cost": null,"condition": ""},"duration": {"value": null,"units": ""},"target": {"value": null,"width": null,"units": "","type": ""},"range":{"value": null,"long": null,"units": ""},"uses": {"value": 100,"max": "100","per": "charges","autoDestroy": false},"consume": {"type": "","target": "","amount": null},"ability": null,"actionType": "","attackBonus": 0,"chatFlavor": "","critical": null,"damage": {"parts": [],"versatile": ""},"formula": "","save": {"ability": "","dc": null,"scaling": "spell"},"consumableType": "ammo","attributes": {"spelldc": 10}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"systems/sw5e/packs/Icons/Ammunition/Power%20Cell.webp","_id":"VUkO1T2aYMuUcBZM"}
{"name":"Propulsion pack","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"loot","data":{"description":{"value":"Propulsion packs enhance underwater movement. Activating or deactivating the propulsion pack requires a bonus action and, while active, you have a swimming speed of 30 feet. The propulsion pack lasts for 1 minute per power cell (to a maximum of 10 minutes) and can be recharged by a power source or replacing the power cells.
","chat":"","unidentified":""},"source":"WH","quantity":1,"weight":20,"price":400,"attuned":false,"equipped":false,"rarity":"","identified":true,"attributes":{"spelldc":10},"damage":{"parts":[]}},"flags":{},"img":"systems/sw5e/packs/Icons/Weapon%20or%20Armor%20Accessory/Propulsion%20Pack.webp","_id":"XR1obpDj1PqDLfA8"}
{"name":"Emergency Battery","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"consumable","data":{"description":{"value":"All non-expendable droids need recharging as they are used. The battery has ten uses. As an action, you can expend one use of the kit to stabilize a droid that has 0 hit points, without needing to make an Intelligence (Technology) check.
","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":5,"price":70,"attuned":false,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":1,"units":"","type":"creature"},"range":{"value":null,"long":null,"units":""},"uses":{"value":10,"max":10,"per":"charges","autoDestroy":true},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"other","attackBonus":0,"chatFlavor":"Stabilize Droid","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"spell"},"consumableType":"potion","attributes":{"spelldc":10}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"systems/sw5e/packs/Icons/Medical/Emergency%20Battery.webp","_id":"Z0YM3aYCyCRhL6cx"}
{"name":"Smugglepack","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"backpack","data":{"description":{"value":"This backpack comes with a main compartment that can store up to 15 lb., not exceeding a volume of 1/2 cubic foot. Additionally, it has a hidden storage compartment that can hold up to 5 lb, not exceeding a volume of 1/4 cubic foot. Finding the hidden compartment requires a DC 15 Investigation check.
","chat":"","unidentified":""},"source":"WH","quantity":1,"weight":6,"price":400,"attuned":false,"equipped":false,"rarity":"","identified":true,"capacity":{"type":"weight","value":20,"weightless":false},"currency":{"cp":0,"sp":0,"ep":0,"gp":0,"pp":0},"attributes":{"spelldc":10},"damage":{"parts":[]}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"systems/sw5e/packs/Icons/Storage/Smugglerpack.webp","_id":"Zlj5z56A4oVQ5iEC"}
@@ -111,3 +111,4 @@
{"name":"Headcomm","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"loot","data":{"description":{"value":"A headcomm can be installed in a helmet or worn independently. It functions as a hands-free commlink.
","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":1,"price":200,"attuned":false,"equipped":false,"rarity":"","identified":true,"attributes":{"spelldc":10},"damage":{"parts":[]}},"flags":{},"img":"systems/sw5e/packs/Icons/Communications/Headcomm.webp","_id":"zHERdLuCUPpxzaSJ"}
{"name":"Poisoner's Kit","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"tool","data":{"description":{"value":"A poisoner’s kit includes the vials, chemicals, and other equipment necessary for the creation of poisons. Proficiency with this kit lets you add your proficiency bonus to any ability checks you make to craft or use poisons.
","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":2,"price":500,"attuned":false,"equipped":false,"rarity":"","identified":true,"ability":"int","chatFlavor":"","proficient":0,"attributes":{"spelldc":10},"damage":{"parts":[]}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"systems/sw5e/packs/Icons/Kit/Poisoner_s%20Kit.webp","_id":"zaLzNlsfzRf71Xpl"}
{"name":"Mine, Plasma","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"weapon","data":{"description":{"value":"When you use your action to set it, this mine sets an imperceptible laser line extending up to 15 feet. When the laser is tripped, the mine explodes, coating the area in a 15-foot radius around it in fire that burns for 1 minute. When a creature enters the fire or starts its turn there it must make a DC 13 Dexterity saving throw. On a failed save, the creature takes 2d6 fire damage, or half as much on a successful one. A construct makes this save with disadvantage.
","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":2,"price":550,"attuned":false,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":15,"units":"ft","type":"radius"},"range":{"value":null,"long":null,"units":""},"uses":{"value":1,"max":1,"per":"charges"},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"save","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"dex","dc":13,"scaling":"flat"},"weaponType":"improv","properties":{"amm":false,"fin":false,"fir":false,"foc":false,"hvy":false,"lgt":false,"lod":false,"rch":false,"rel":false,"ret":false,"spc":false,"thr":false,"two":false,"ver":false},"proficient":false,"attributes":{"spelldc":10}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"systems/sw5e/packs/Icons/Explosive/Mine%2C%20Plasma.webp","_id":"zrSOUA8dUg9lHVdS"}
+{"name":"Power Cell","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"consumable","data":{"description":{"value":"Power cells fuel blaster weapons that deal energy or ion damage. Additionally, power cells are used to energize certain tools.
","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":1,"price":10,"attuned":false,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":null,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":240,"max":240,"per":"charges","autoDestroy":false},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"spell"},"consumableType":"ammo","attributes":{"spelldc":10}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"systems/sw5e/packs/Icons/Ammunition/Power%20Cell.webp","_id":"VUkO1T2aYMuUcBZM"}
diff --git a/packs/packs/species.db b/packs/packs/species.db
index f5122423..b3ae3616 100644
--- a/packs/packs/species.db
+++ b/packs/packs/species.db
@@ -119,3 +119,5 @@
{"_id":"ynuvnI54pMKLwF2a","name":"Echani","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"Biology and Appearance
Echani are characterized by their white skin, hair, and eyes, and their remarkable tendency to look very much alike one another to outside observers, particularly amongst family members. It is thought that their origins stem from Arkanian experimentation on the human genome, a hypothesis that could explain their physical conformity.
Society and Culture
A matriarchal, caste-based society originating from the Inner Rim world of Eshan, the echani spread to encompass a confederacy of six worlds including Bengali and Thyrsus, known as the Six Sisters, governed by the all-female Echani Command. \r\n\t\r\nEchani generals are sometimes seen by others as having the ability to predict their opponent's next move. This is no biologicial trait inherent to the species, but rather stems from the fact that combat is so ingrained into every level of echani culture; the echani hold to the idea that combat is the truest form of communication, and to know someone fully, you must fight them. While their combat rituals require complete freedom of movement and unarmed martial arts, in warfare, they tend towards light armor and melee weapons, and are considered excellent craftsmen of such.
Names
Echani names tend to lack hard consonants, but are otherwise as variable as human ones. Echani surnames are tied directly to their place in the caste system.
Male Names. Caelian, Inarin, Losor, Uelis, Yusanis Female Names. Astri, Brianna, Isena, Raskta, Senriel Surnames. Authal, Elysi, Fenni, Kinro, Lsu","chat":"","unidentified":""},"traits":{"value":"Ability Score Increase. Your Dexterity score increases by 2, and your Wisdom score increases by 1.
\nAge. Echani reach adulthood in their late teens and live less than a century.
\nAlignment. Echani culture's emphasis on honor and combat cause them to tend towards lawful alignments, though there are exceptions.
\nSize. Echani stand between 5 and a half and 6 feet tall and weigh around 150 lbs, with little variation between them. Your size is Medium.
\nSpeed. Your base walking speed is 30 feet.
\nAllies of the Force. Whenever you make a Wisdom (Insight) check against someone you know to wield the Force, you are considered to have expertise in the Insight skill.
\nCombative Culture. You have proficiency in Lore and Acrobatics.
\nEchani Art. If a humanoid you can see makes a melee weapon attack, you can use your reaction to make a Wisdom (Insight) check against the target's Charisma (Deception). On a success you learn one of the following traits about that creature: it's Strength, Dexterity or Constitution score; bonus to Strength, Dexterity or Constitution saving throws; armor class; or current hit points. On a failure, the target becomes immune to this feature for one day. You can use this ability a number of times equal to your Wisdom modifier (a minimum of once). You regain all expended uses on a long rest.
\nMartial Upbringing. You have proficiency in light armor, and gain proficiency with two martial vibroweapons of your choice.
\nUnarmed Combatant. Your unarmed strikes deal 1d6 kinetic damage. You can use your choice of your Strength or Dexterity modifier for the attack and damage rolls. You must use the same modifier for both rolls.
\nLanguages. You can speak, read, and write Galactic Basic and one extra language of your choice.
"},"skinColorOptions":{"value":"Pale tones"},"hairColorOptions":{"value":"White"},"eyeColorOptions":{"value":"Silver"},"distinctions":{"value":"Fair skin, white hair and eyes, remarkable familial similarity."},"heightAverage":{"value":"5'1\""},"heightRollMod":{"value":"+1d10\""},"weightAverage":{"value":"105 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Eshan"},"slanguage":{"value":"Galactic Basic"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Echani","mode":"=","targetSpecific":false,"id":1,"itemId":"RZ06rVoMQ80tK8W1","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.dex.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"RZ06rVoMQ80tK8W1","active":false,"_targets":[],"label":"Abilities Dexterity"},{"modSpecKey":"data.abilities.wis.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"RZ06rVoMQ80tK8W1","active":false,"_targets":[],"label":"Abilities Wisdom"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"RZ06rVoMQ80tK8W1","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"RZ06rVoMQ80tK8W1","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.skills.lor.value","value":"1","mode":"+","targetSpecific":false,"id":6,"itemId":"RZ06rVoMQ80tK8W1","active":false,"_targets":[],"label":"Skills Lore"},{"modSpecKey":"data.skills.acr.value","value":"1","mode":"+","targetSpecific":false,"id":7,"itemId":"RZ06rVoMQ80tK8W1","active":false,"_targets":[],"label":"Skills Acrobatics"},{"modSpecKey":"data.traits.armorProf.value","value":"lgt","mode":"+","targetSpecific":false,"id":8,"itemId":"RZ06rVoMQ80tK8W1","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":9,"itemId":"RZ06rVoMQ80tK8W1","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Echani.webp","effects":[{"_id":"HNBMxZCToQEy6PSr","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Echani","mode":5,"priority":5},{"key":"data.abilities.dex.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.wis.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":0,"priority":5},{"key":"data.attributes.movement.walk","value":"30","mode":5,"priority":5},{"key":"data.skills.lor.value","value":1,"mode":4,"priority":20},{"key":"data.skills.acr.value","value":1,"mode":4,"priority":20},{"key":"data.traits.armorProf.value","value":"lgt","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"flags.sw5e.unarmedCombatant","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Echani.webp","label":"Echani","tint":"","transfer":true}]}
{"_id":"yyCUAG4cUUKh4IUz","name":"Iktotchi","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"Biology and Appearance
Iktotchi do not have hair, but rather they had a very resistant skin which protected them from the violent winds which crossed the satellite. Both males and females have down-curved cranial horns, which gave them an aggressive aspect. The males' horns are generally a little larger, a remnant from their mountain-dwelling, caprinaen ancestors. The horns are able to regenerate if damaged.
Society and Culture
The Iktotchi are a fiercely guarded and isolationist species - vaunted for their ability to hide their feelings and bury any semblance of emotion. Originating on the harsh, windy moon of Iktotch, which orbits the planet Iktotchon in the Expansion Region, the Iktotch are gifted with precognition, and are courted as often by Jedi as by pirates for their skills.\r\n\r\nIktotchi society is a stratified society. Upward mobility is both possible and encouraged. Iktotchi are an outwardly dispassionate people, which is evidenced by their culture. They have a robust legal system, and suffer little crime. Iktotchi are respectful of cultures other than their own and can easily integrate with others.\r\n\r\nIktotchi who distinguish themselves often earn a titular nickname, by which they are referred to in place of their name. Generally, this is done by accomplishing a remarkable feat that benefits the Iktotchi as whole.
Names
Iktotchi names are generally two syllables. Surnames are familial. Respected Iktotchi often adopt a nickname, which they use in place of their birth name.
Male Names. Dilnam, Imruth, Kashkil, Yellam Female Names. Kemkal, Onyeth, Reshu, Zorlu Surnames. Hevil, Kaawi, Mimir, Nudaal, Zelend","chat":"","unidentified":""},"traits":{"value":"Ability Score Increase. Your Intelligence score increases by 2, and your Strength score increases by 1.
\nAge. Iktotchi reach adulthood in their late teens and live less than a century.
\nAlignment. Iktotchi are lawful and tend toward the light side, though there are exceptions.
\nSize. Iktotchi typically stand between 5 and 6 feet tall and weigh about 170 lbs. Regardless of your position in that range, your size is Medium.
\nSpeed. Your base walking speed is 30 feet.
\nPrecognition. You can see brief fragments of the future that allow you to turn failures into successes. When you roll a 1 on an attack roll, ability check, or saving throw, you can reroll the die and must use the new roll.
\nTelepathy. You can communicate telepathically with creatures within 30 feet of you. You must share a language with the target in order to communicate in this way.
\nHorns. Your horns are a natural weapon, which you can use to make unarmed strikes. If you hit with it, you deal kinetic damage equal to 1d6 + your Strength modifier.
\nPilot. You have proficiency in the Piloting skill.
\nLanguages. You can speak, read, and write Galactic Basic and Iktotchese.
"},"skinColorOptions":{"value":"Pink"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Black"},"distinctions":{"value":"Horns, precognition, telepathy, thick pink skin"},"heightAverage":{"value":"4'11\""},"heightRollMod":{"value":"+2d10\""},"weightAverage":{"value":"120 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Iktotch, moon of Iktotchon"},"slanguage":{"value":"Iktotchese"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"colorScheme":{"value":""},"manufacturer":{"value":""},"planguage":{"value":""},"droidDistinctions":{"value":""},"droidLanguage":{"value":""},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Iktotchi","mode":"=","targetSpecific":false,"id":1,"itemId":"UZKrP5BCcEle7QSh","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.int.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"UZKrP5BCcEle7QSh","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.abilities.str.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"UZKrP5BCcEle7QSh","active":false,"_targets":[],"label":"Abilities Strength"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"UZKrP5BCcEle7QSh","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"UZKrP5BCcEle7QSh","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.skills.pil.value","value":"1","mode":"+","targetSpecific":false,"id":6,"itemId":"UZKrP5BCcEle7QSh","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":7,"itemId":"UZKrP5BCcEle7QSh","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"iktotchese","mode":"+","targetSpecific":false,"id":8,"itemId":"UZKrP5BCcEle7QSh","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.custom","value":"telepathy (30 ft.)","mode":"+","targetSpecific":false,"id":9,"itemId":"UZKrP5BCcEle7QSh","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Iktotchi.webp","effects":[{"_id":"MAjUMql3tivJTfVO","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Iktotchi","mode":5,"priority":5},{"key":"data.abilities.int.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.str.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":0,"priority":5},{"key":"data.attributes.movement.walk","value":"30","mode":5,"priority":5},{"key":"data.skills.pil.value","value":1,"mode":4,"priority":20},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"iktotchese","mode":0,"priority":0},{"key":"data.traits.languages.custom","value":"telepathy (30 ft.)","mode":0,"priority":0},{"key":"flags.sw5e.precognition","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Iktotchi.webp","label":"Iktotchi","tint":"","transfer":true}]}
{"_id":"zKpCsa8WCfz9abwv","name":"Killik","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"Biology and Appearance
\nKilliks possess a strong chitinous exoskeleton that is glossy and greenish with their carcasses capable of surviving thousands of years of erosion as seen by the colonists of Alderaan. The exoskeleton also contains a number of spiracles which served as their way of breathing. Typically, these Human-sized hive creatures have four arms with each ending in a powerful three-fingered claw. They stand on two stout legs that are capable of leaping great distances. Killiks can communicate with other Killiks through use of pheromones.
\nSociety and Culture
\nThe Killiks have a communal society, with each and every Killik being in mental contact with another. Due to their hive mind, every Killik nest is virtually one individual. Killiks are also peaceful in nature. Their telepathic connection is capable of extending to other species which includes non-insectoids. A willing creature can submit to this telepathy to become a Joiner. They effectively become another vessel of the hive mind. Killiks lose connection to their hive mind at great distances. Those who voluntarily leave the hive mind are referred to as Leavers. It is rare that they are allowed to rejoin their hive without reason.
\nNames
\nKilliks are a hive-mind insectoid that typically don't use names. On the off chance they do, it's usually an incomprehensible series of clicking noises. They are receptive to nicknames given by others.
","chat":"","unidentified":""},"traits":{"value":"Ability Score Increase. Your Intelligence score increases by 2, and your Constitution score increases by 1.
Age. Killiks reach adulthood in their 40s and live an average of 200 years.
Alignment. Killiks' willingness to brainwash or kill their enemies cause them to tend towards the dark side, though there are exceptions.
Size. Killiks stand between 5 and 6 feet tall and weigh about 160 lbs. Regardless of your position in that range, your size is Medium.
Speed. Your base walking speed is 30 feet.
Four-Armed. Killiks have four arms which they can use independently of one another. You can only gain the benefit of items held by two of your arms at any given time, and once per round you can switch which arms you are benefiting from (no action required).
Hardened Carapace. While you are unarmored or wearing light armor, your AC is 13 + your Dexterity modifier.
Strong-Legged. When you make a long jump, you can cover a number of feet up to twice your Strength score. When you make a high jump, you can leap a number of feet up into the air equal to 3 + twice your Strength modifier.
Telepathy. You can communicate telepathically with creatures within 30 feet of you. You must share a language with the target in order to communicate in this way.
Languages. You can speak, read, and write Killik. You can understand spoken and written Galactic Basic, but your vocal cords do not allow you to speak it.
"},"skinColorOptions":{"value":"Brown, chestnut, green, red, scarlet, or yellow"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Black or orange"},"distinctions":{"value":"Chitinous armor, mandibles projected from face, four arms ending in long three toed claws protrude from their torsos"},"heightAverage":{"value":"4'9\""},"heightRollMod":{"value":"+2d10\""},"weightAverage":{"value":"110 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Alderaan"},"slanguage":{"value":"Killik"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Killik","mode":"=","targetSpecific":false,"id":1,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.int.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.abilities.con.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Abilities Constitution"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.attributes.ac.min","value":"13","mode":"=","targetSpecific":false,"id":6,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Attributes Armor Class Min"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":7,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"killik","mode":"+","targetSpecific":false,"id":8,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.custom","value":"telepathy (30 ft.)","mode":"+","targetSpecific":false,"id":9,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Killik.webp","effects":[{"_id":"EWQOMXrZbfi4zSPF","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Killik","mode":5,"priority":5},{"key":"data.abilities.int.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.con.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":0,"priority":5},{"key":"data.attributes.movement.walk","value":"30","mode":5,"priority":5},{"key":"data.attributes.ac.value","value":"13+@abilities.dex.mod","mode":5,"priority":1},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"killik","mode":0,"priority":0},{"key":"data.traits.languages.custom","value":"telepathy (30 ft.)","mode":0,"priority":0},{"key":"flags.sw5e.strongLegged","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.extraArms","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Killik.webp","label":"Killik","tint":"","transfer":true}]}
+{"_id":"J7HJQkcvghtwMAdF","name":"Anzellan","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"Biology and Appearance
\nThe anzellans are a diminutive species hailing from the secluded planet Anzella. Their eyes have floating corneal micro-lenses that allow them to see microscopic details. Anzellans are a bubbly and receptive people. They are a jovial and trusting people that tend to welcome strangers with open arms. Due to their volcanic homeworld, anzellans are also adapted towards heat. This, coupled with their small size, make them well-suited to working in compact places.
\nSociety and Culture
\nAnzella is a tropical planet covered in thousands of small volcanic islands. Many of these islands are developed as small villages, with the largest islands designed to accommodate larger species. Anzellan culture is generally based around tourism and crafting; in fact, anzellans are renowned craftsmen due to their discerning eyesight and ability to fit into small spaces. Anzellan government is generally casual. Each village has its own governing council of rotating members; these villages act independently from one another unless their decisions would affect more than a single island. In that case, all of the councils work together to come to a planet-wide decision.
\nNames
\nAnzellan names are rarely longer than two syllables, with a bouncy intonation to them. Their surnames are familial.
\n Male Names. Babu, Gridel, Moru, Rano, Yodel
\n Female Names. Dibi, Fing, Nooni, Teena, Zazi
\n Surnames. E'ayoo, Frik, Meer, Tanni, Vrut
","chat":"","unidentified":""},"traits":{"value":"Ability Score Increase. Your Intelligence score increases by 2, and two other ability scores of your choice increase by 1.
Age. Anzellans are considered adults at ten years old. They are a short-lived species, however, that rarely lives longer than 60 years.
Alignment. Anzellans are a friendly and respectful people, which causes them to tend toward lawful light side, though there are exceptions.
Size. Anzellans stand between 1 and 2 feet tall and weigh around 10 lbs. Regardless of your position in that range, your size is Tiny.
Speed. Your base walking speed is 20 feet.
Crafters. You have proficiency in one tool of your choice.
Detail Oriented. You are practiced at scouring for details. You have advantage on Intelligence (Investigation) checks within 5 feet.
Pintsized. Your tiny stature makes it hard for you to wield bigger weapons. You can't use medium or heavy shields. Additionally, you can't wield weapons with the two-handed or versatile property, and you can only wield one-handed weapons in two hands unless they have the light property.
Puny. Anzellans are too small to pack much of a punch. You have disadvantage on Strength saving throws, and when determining your bonus to attack and damage rolls for weapon attacks using Strength, you can't add more than +3.
Small and Nimble. You are too small and fast to effectively target. You have a +1 bonus to AC, and you have advantage on Dexterity saving throws.
Tanned. You are naturally adapted to hot climates, as described in chapter 5 of the Dungeon Master's Guide.
Technician. You are proficient in the Technology skill.
Tinker. You have proficiency with tinker's tools. You can use these and spend 1 hour and 100 cr worth of materials to construct a Tiny Device (AC 5, 1 hp). You can take the Use an Object action to have your device cause one of the following effects: create a small explosion, create a repeating loud noise for 1 minute, create smoke for 1 minute, create a soothing melody for 1 minute. You can maintain a number of these devices up to your proficiency bonus at once, and a device stops functioning after 24 hours away from you. You can dismantle the device to reclaim the materials used to create it.
Languages. You can speak, read, and write Galactic Basic and Anzellan. Anzellan is characterized by its bouncy sound and emphasis on alternating syllables.
","source":"Expanded Content"},"skinColorOptions":{"value":"Brown, green, or tan"},"hairColorOptions":{"value":"Black, gray, or white"},"eyeColorOptions":{"value":"Black"},"distinctions":{"value":"Diminutive size, wispy eyebrows"},"heightAverage":{"value":"1'0\""},"heightRollMod":{"value":"+2d6\""},"weightAverage":{"value":"3 lb."},"weightRollMod":{"value":"x1 lb."},"homeworld":{"value":"Anzella"},"slanguage":{"value":"Anzellan"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"effects":[{"modSpecKey":"data.details.species","value":"Anzellan","mode":"=","targetSpecific":false,"id":1,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.int.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.traits.size","value":"tin","mode":"=","targetSpecific":false,"id":3,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"20","mode":"=","targetSpecific":false,"id":4,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.attributes.ac.min","value":"1","mode":"+","targetSpecific":false,"id":5,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Attributes Armor Class Min"},{"modSpecKey":"data.skills.tec.value","value":"1","mode":"+","targetSpecific":false,"id":6,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Skills Technology"},{"modSpecKey":"data.traits.toolProf.custom","value":"Tinker's tools","mode":"+","targetSpecific":false,"id":7,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Tool Prof Custom"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":8,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Language"},{"modSpecKey":"data.traits.languages.value","value":"anzellan","mode":"+","targetSpecific":false,"id":9,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[]}],"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Anzellan.webp","effects":[{"_id":"ZGdzAq1Gl4xaxDRD","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Anzellan","mode":5,"priority":5},{"key":"data.abilities.int.value","value":2,"mode":2,"priority":20},{"key":"data.traits.size","value":"tiny","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":20,"mode":5,"priority":5},{"key":"data.attributes.ac.value","value":1,"mode":2,"priority":20},{"key":"data.skills.tec.value","value":1,"mode":4,"priority":20},{"key":"data.traits.toolProf.custom","value":"Tinker's tools","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"anzellan","mode":0,"priority":0},{"key":"flags.sw5e.detailOriented","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.pintsized","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.puny","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.tinker","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Anzellan.webp","label":"Anzellan","tint":"","transfer":true}]}
+{"_id":"J7HJQkcvghtwMAdF","name":"Anzellan","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"Biology and Appearance
\nThe anzellans are a diminutive species hailing from the secluded planet Anzella. Their eyes have floating corneal micro-lenses that allow them to see microscopic details. Anzellans are a bubbly and receptive people. They are a jovial and trusting people that tend to welcome strangers with open arms. Due to their volcanic homeworld, anzellans are also adapted towards heat. This, coupled with their small size, make them well-suited to working in compact places.
\nSociety and Culture
\nAnzella is a tropical planet covered in thousands of small volcanic islands. Many of these islands are developed as small villages, with the largest islands designed to accommodate larger species. Anzellan culture is generally based around tourism and crafting; in fact, anzellans are renowned craftsmen due to their discerning eyesight and ability to fit into small spaces. Anzellan government is generally casual. Each village has its own governing council of rotating members; these villages act independently from one another unless their decisions would affect more than a single island. In that case, all of the councils work together to come to a planet-wide decision.
\nNames
\nAnzellan names are rarely longer than two syllables, with a bouncy intonation to them. Their surnames are familial.
\n Male Names. Babu, Gridel, Moru, Rano, Yodel
\n Female Names. Dibi, Fing, Nooni, Teena, Zazi
\n Surnames. E'ayoo, Frik, Meer, Tanni, Vrut
","chat":"","unidentified":""},"traits":{"value":"Ability Score Increase. Your Intelligence score increases by 2, and two other ability scores of your choice increase by 1.
Age. Anzellans are considered adults at ten years old. They are a short-lived species, however, that rarely lives longer than 60 years.
Alignment. Anzellans are a friendly and respectful people, which causes them to tend toward lawful light side, though there are exceptions.
Size. Anzellans stand between 1 and 2 feet tall and weigh around 10 lbs. Regardless of your position in that range, your size is Tiny.
Speed. Your base walking speed is 20 feet.
Crafters. You have proficiency in one tool of your choice.
Detail Oriented. You are practiced at scouring for details. You have advantage on Intelligence (Investigation) checks within 5 feet.
Pintsized. Your tiny stature makes it hard for you to wield bigger weapons. You can't use medium or heavy shields. Additionally, you can't wield weapons with the two-handed or versatile property, and you can only wield one-handed weapons in two hands unless they have the light property.
Puny. Anzellans are too small to pack much of a punch. You have disadvantage on Strength saving throws, and when determining your bonus to attack and damage rolls for weapon attacks using Strength, you can't add more than +3.
Small and Nimble. You are too small and fast to effectively target. You have a +1 bonus to AC, and you have advantage on Dexterity saving throws.
Tanned. You are naturally adapted to hot climates, as described in chapter 5 of the Dungeon Master's Guide.
Technician. You are proficient in the Technology skill.
Tinker. You have proficiency with tinker's tools. You can use these and spend 1 hour and 100 cr worth of materials to construct a Tiny Device (AC 5, 1 hp). You can take the Use an Object action to have your device cause one of the following effects: create a small explosion, create a repeating loud noise for 1 minute, create smoke for 1 minute, create a soothing melody for 1 minute. You can maintain a number of these devices up to your proficiency bonus at once, and a device stops functioning after 24 hours away from you. You can dismantle the device to reclaim the materials used to create it.
Languages. You can speak, read, and write Galactic Basic and Anzellan. Anzellan is characterized by its bouncy sound and emphasis on alternating syllables.
","source":"Expanded Content"},"skinColorOptions":{"value":"Brown, green, or tan"},"hairColorOptions":{"value":"Black, gray, or white"},"eyeColorOptions":{"value":"Black"},"distinctions":{"value":"Diminutive size, wispy eyebrows"},"heightAverage":{"value":"1'0\""},"heightRollMod":{"value":"+2d6\""},"weightAverage":{"value":"3 lb."},"weightRollMod":{"value":"x1 lb."},"homeworld":{"value":"Anzella"},"slanguage":{"value":"Anzellan"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"effects":[{"modSpecKey":"data.details.species","value":"Anzellan","mode":"=","targetSpecific":false,"id":1,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.int.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.traits.size","value":"tin","mode":"=","targetSpecific":false,"id":3,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"20","mode":"=","targetSpecific":false,"id":4,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.attributes.ac.min","value":"1","mode":"+","targetSpecific":false,"id":5,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Attributes Armor Class Min"},{"modSpecKey":"data.skills.tec.value","value":"1","mode":"+","targetSpecific":false,"id":6,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Skills Technology"},{"modSpecKey":"data.traits.toolProf.custom","value":"Tinker's tools","mode":"+","targetSpecific":false,"id":7,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Tool Prof Custom"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":8,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Language"},{"modSpecKey":"data.traits.languages.value","value":"anzellan","mode":"+","targetSpecific":false,"id":9,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[]}],"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Anzellan.webp","effects":[{"_id":"ZGdzAq1Gl4xaxDRD","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Anzellan","mode":5,"priority":5},{"key":"data.abilities.int.value","value":2,"mode":2,"priority":20},{"key":"data.traits.size","value":"tiny","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":20,"mode":5,"priority":5},{"key":"data.attributes.ac.value","value":1,"mode":2,"priority":20},{"key":"data.skills.tec.value","value":1,"mode":4,"priority":20},{"key":"data.traits.toolProf.custom","value":"Tinker's tools","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"anzellan","mode":0,"priority":0},{"key":"flags.sw5e.detailOriented","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.pintsized","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.puny","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.tinker","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Anzellan.webp","label":"Anzellan","tint":"","transfer":true}]}
diff --git a/packs/packs/starshiparmor.db b/packs/packs/starshiparmor.db
index 79733cd0..20efef0d 100644
--- a/packs/packs/starshiparmor.db
+++ b/packs/packs/starshiparmor.db
@@ -1,6 +1,6 @@
-{"_id":"AAA9PWi1rTiSUIIe","name":"Lightweight Armor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Lightweight armor offers a trade-off of a more maneuverable but less resilient ship. A ship with Lightweight Armor installed has a +2 bonus to armor class, but has one fewer maximum hull point per Hull Die.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":3100,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":10,"type":"ssarmor","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"dmgred":{"value":"0"},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""},"attributes":{"dr":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Lightweight%20Armor.webp","effects":[]}
-{"_id":"JhX8qXjrDL3pCRmF","name":"Reinforced Armor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Opposite of lightweight armor is reinforced armor. This armor improves a ship's resilience, but makes it less likely to avoid damage. A ship with Reinforced Armor installed has a -1 penalty to armor class, but has one additional maximum hull point per Hull Die.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":3700,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":10,"type":"ssarmor","dex":0},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"dmgred":{"value":"6"},"regrateco":{"value":""},"attributes":{"dr":"6"},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Reinforced%20Armor.webp","effects":[]}
-{"_id":"M7igMGsBIosGA4dS","name":"Quick-Charge Shield","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Quick-Charge Shields, opposite of Fortress Shields, offer a reduced capacity but rapidly replenish.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":4900,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":0,"type":"ssshield","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":"0.667"},"dmgred":{"value":""},"regrateco":{"value":"1.5"},"attributes":{"dr":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Quick-Charge%20Shield.webp","effects":[]}
-{"_id":"RvtLP3FgKLBYBHSf","name":"Directional Shield","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Directional Shields are the most commonly used and balanced shields on the market.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":4300,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":0,"type":"ssshield","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":"1"},"dmgred":{"value":""},"regrateco":{"value":"1"},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""},"attributes":{"dr":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Directional%20Shield.webp","effects":[]}
-{"_id":"Wj62TEtwKeG1P2DD","name":"Fortress Shield","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Fortress shields offer a higher maximum shield points, but regenerate slower than normal shields.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":4650,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":0,"type":"ssshield","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":"1.5"},"dmgred":{"value":""},"regrateco":{"value":"0.667"},"attributes":{"dr":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Fortress%20Shield.webp","effects":[]}
-{"_id":"aG6mKPerYCFmkI00","name":"Deflection Armor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Deflection armor is the most common type of armor aboard ships, and offers no benefit or penalty to armor class or hull points.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":3450,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":10,"type":"ssarmor","dex":2},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"dmgred":{"value":"3"},"regrateco":{"value":""},"attributes":{"dr":"3"},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Deflection%20Armor.webp","effects":[]}
+{"_id":"AAA9PWi1rTiSUIIe","name":"Lightweight Armor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Lightweight armor offers a trade-off of a more maneuverable but less resilient ship. A ship with Lightweight Armor installed has a +2 bonus to armor class, but has one fewer maximum hull point per Hull Die.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":3100,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":10,"type":"ssarmor","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":"(-1)"},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""},"attributes":{"dr":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Lightweight%20Armor.webp","effects":[]}
+{"_id":"JhX8qXjrDL3pCRmF","name":"Reinforced Armor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Opposite of lightweight armor is reinforced armor. This armor improves a ship's resilience, but makes it less likely to avoid damage. A ship with Reinforced Armor installed has a -1 penalty to armor class, but has one additional maximum hull point per Hull Die.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":3700,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":10,"type":"ssarmor","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":"1"},"regrateco":{"value":""},"attributes":{"dr":"6"},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Reinforced%20Armor.webp","effects":[]}
+{"_id":"M7igMGsBIosGA4dS","name":"Quick-Charge Shield","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Quick-Charge Shields, opposite of Fortress Shields, offer a reduced capacity but rapidly replenish.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":4900,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":0,"type":"ssshield","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":"(2/3)"},"hpperhd":{"value":""},"regrateco":{"value":"(3/2)"},"attributes":{"dr":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Quick-Charge%20Shield.webp","effects":[]}
+{"_id":"RvtLP3FgKLBYBHSf","name":"Directional Shield","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Directional Shields are the most commonly used and balanced shields on the market.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":4300,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":0,"type":"ssshield","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":"1"},"hpperhd":{"value":""},"regrateco":{"value":"1"},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""},"attributes":{"dr":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Directional%20Shield.webp","effects":[]}
+{"_id":"Wj62TEtwKeG1P2DD","name":"Fortress Shield","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Fortress shields offer a higher maximum shield points, but regenerate slower than normal shields.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":4650,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":0,"type":"ssshield","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":"(3/2)"},"hpperhd":{"value":""},"regrateco":{"value":"(2/3)"},"attributes":{"dr":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Fortress%20Shield.webp","effects":[]}
+{"_id":"aG6mKPerYCFmkI00","name":"Deflection Armor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Deflection armor is the most common type of armor aboard ships, and offers no benefit or penalty to armor class or hull points.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":0,"price":3450,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":10,"type":"ssarmor","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"attributes":{"dr":"3"},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Deflection%20Armor.webp","effects":[]}
diff --git a/packs/packs/starshipequipment.db b/packs/packs/starshipequipment.db
index 03f7dcbf..e6aa1ef7 100644
--- a/packs/packs/starshipequipment.db
+++ b/packs/packs/starshipequipment.db
@@ -5,10 +5,10 @@
{"_id":"MVXftcjJ1yzsCU3N","name":"Hyperdrive, Class 0.5","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"The hyperdrive is a propulsion system that allows a starship to reach hyperspeed and traverse the void between stars in the alternate dimension of hyperspace. For a starship to have a hyperdrive, it must have a vacant hyperdrive slot modification.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":50000,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":null,"type":"hyper","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":"0.5"}},"flags":{"core":{"sourceId":"Item.3CA76AXkU73nE53o"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Hyperdrive.webp","effects":[]}
{"name":"Hyperdrive, Class 8","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"The hyperdrive is a propulsion system that allows a starship to reach hyperspeed and traverse the void between stars in the alternate dimension of hyperspace. For a starship to have a hyperdrive, it must have a vacant hyperdrive slot modification.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":1000,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":null,"type":"hyper","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":"8"}},"flags":{"core":{"sourceId":"Item.pJASNAp63U6Y2Yx8"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Hyperdrive.webp","effects":[],"_id":"P84rgL4vBaWw0GJe"}
{"name":"Hyperdrive, Class 5","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"The hyperdrive is a propulsion system that allows a starship to reach hyperspeed and traverse the void between stars in the alternate dimension of hyperspace. For a starship to have a hyperdrive, it must have a vacant hyperdrive slot modification.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":2500,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":null,"type":"hyper","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":"5"}},"flags":{"core":{"sourceId":"Item.UgLbCq7OWL9G9BD7"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Hyperdrive.webp","effects":[],"_id":"U4BhpyMxJdbnNErJ"}
-{"_id":"UAiau5ZNXVJAJFUn","name":"Power Core Reactor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Power core reactors have highly variable power output capabilities, but sacrifice fuel economy and as a result.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":5750,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":null,"type":"reactor","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":"1.5"},"powdicerec":{"value":"1d2"},"hdclass":{"value":""}},"flags":{"core":{"sourceId":"Item.2MTQUv6r5ePNANyn"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Reactor.webp","effects":[]}
+{"_id":"UAiau5ZNXVJAJFUn","name":"Power Core Reactor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Power core reactors have highly variable power output capabilities, but sacrifice fuel economy and as a result.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":5750,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":null,"type":"reactor","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":"(3/2)"},"powdicerec":{"value":"1d2"},"hdclass":{"value":""}},"flags":{"core":{"sourceId":"Item.2MTQUv6r5ePNANyn"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Reactor.webp","effects":[]}
{"_id":"VzkRXuQx2sqN9nd0","name":"Distributed Power Coupling","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Distributed power coupling sacrifices flexibility by allocating power separately to each system.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":5100,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":0,"type":"powerc","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":"2"},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""}},"flags":{"core":{"sourceId":"Item.4zjcBtJhXgpFW2pb"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Power%20Coupling.webp","effects":[]}
-{"_id":"ZyEdKtLwSXuUQs0P","name":"Ionization Reactor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Ionization reactors are highly fuel-efficient reactors that trade power output for fuel economy.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":5100,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":null,"type":"reactor","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":"0.667"},"powdicerec":{"value":"(1d2)-1"},"hdclass":{"value":""}},"flags":{"core":{"sourceId":"Item.kXo8mNp6GFLYWokY"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Reactor.webp","effects":[]}
-{"name":"Fuel Cell Reactor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Fuel cell reactors are the most common and balanced reactors on the market.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":4500,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":null,"type":"reactor","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":"1"},"powdicerec":{"value":"1"},"hdclass":{"value":""}},"flags":{"core":{"sourceId":"Item.Qwu6WlJiIgFWq9VF"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Reactor.webp","effects":[],"_id":"jk7zL3cqhufDKsuh"}
+{"_id":"ZyEdKtLwSXuUQs0P","name":"Ionization Reactor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Ionization reactors are highly fuel-efficient reactors that trade power output for fuel economy.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":5100,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":null,"type":"reactor","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":"(2/3)"},"powdicerec":{"value":"(1d2)-1"},"hdclass":{"value":""}},"flags":{"core":{"sourceId":"Item.kXo8mNp6GFLYWokY"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Reactor.webp","effects":[]}
+{"name":"Fuel Cell Reactor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Fuel cell reactors are the most common and balanced reactors on the market.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":4500,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":null,"type":"reactor","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":"1"},"hdclass":{"value":""}},"flags":{"core":{"sourceId":"Item.Qwu6WlJiIgFWq9VF"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Reactor.webp","effects":[],"_id":"jk7zL3cqhufDKsuh"}
{"name":"Hyperdrive, Class 1.0","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"The hyperdrive is a propulsion system that allows a starship to reach hyperspeed and traverse the void between stars in the alternate dimension of hyperspace. For a starship to have a hyperdrive, it must have a vacant hyperdrive slot modification.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":15000,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":null,"type":"hyper","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":"1"}},"flags":{"core":{"sourceId":"Item.MrCZaUig1puXcEVy"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Hyperdrive.webp","effects":[],"_id":"o9DmeVhCJNezkjdI"}
{"_id":"oqB8RltTDjHnaS1Y","name":"Direct Power Coupling","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"Direct power coupling has a central power capacitor that feeds power directly to each system.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":4100,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":0,"type":"powerc","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":"4"},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":""}},"flags":{"core":{"sourceId":"Item.MEiHVZHModsp5w0b"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Power%20Coupling.webp","effects":[]}
{"name":"Hyperdrive, Class 3","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"equipment","data":{"description":{"value":"The hyperdrive is a propulsion system that allows a starship to reach hyperspeed and traverse the void between stars in the alternate dimension of hyperspace. For a starship to have a hyperdrive, it must have a vacant hyperdrive slot modification.
","chat":"","unidentified":""},"source":"SotG","quantity":1,"weight":null,"price":7500,"attuned":false,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null},"consume":{"type":"","target":null,"amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":null,"type":"hyper","dex":null},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"speed":{"value":null,"conditions":""},"strength":0,"stealth":false,"proficient":true,"properties":{"Absorptive":false,"Agile":false,"Anchor":false,"Avoidant":false,"Barbed":false,"Bulky":false,"Charging":false,"Concealing":false,"Cumbersome":false,"Gauntleted":false,"Imbalanced":false,"Impermeable":false,"Insulated":false,"Interlocking":false,"Lambent":false,"Lightweight":false,"Magnetic":false,"Obscured":false,"Obtrusive":false,"Powered":false,"Reactive":false,"Regulated":false,"Reinforced":false,"Responsive":false,"Rigid":false,"Silent":false,"Spiked":false,"Steadfast":false,"Strength":false,"Versatile":false},"capx":{"value":""},"hpperhd":{"value":""},"regrateco":{"value":""},"cscap":{"value":""},"sscap":{"value":""},"fuelcostsmod":{"value":""},"powdicerec":{"value":""},"hdclass":{"value":"3"}},"flags":{"core":{"sourceId":"Item.bzY549C3zaI3H6mt"}},"img":"systems/sw5e/packs/Icons/Starship%20Equipment/Hyperdrive.webp","effects":[],"_id":"rFm20P0THnzZRUxB"}
diff --git a/packs/packs/starships.db b/packs/packs/starships.db
deleted file mode 100644
index 32695c68..00000000
--- a/packs/packs/starships.db
+++ /dev/null
@@ -1,6 +0,0 @@
-{"_id":"6BN8l5E8QtYt103T","name":"Small Starship","permission":{"default":0,"yXqD5rPwgjXHtqeZ":3},"type":"starship","data":{"description":{"value":"As the fighters cover his approach, Zik Beskin activates his targeting computer and ignores the explosions surrounding him, instead Focusing on the Destroyer's shield generator. It had to come down soon, or this fight was lost. Arsix, behind him, beeps and whirs, preparing the ion pulse missiles for the attack run, prewarming their engines and arming the warheads.
\nTogether a long time now, Beskin and Arsix had spilled their share of blood and oil, respectively, for the Rebellion--usually just while improving their ancient Ywing. But today, the blood and oil spilt wouldn't be their own. As Zik let fly a pair of missiles, he knew they would find their target. Today wasn't over just yet. This was her fourth sortie of the day, and Sheena was tired. The terrorists just kept coming. Every time she was about to shut her eyes a new wave of the Rebels came. And every time they did, she rushed to her TIE Interceptor and joined the alert fighters to take the fighters down before they could blow a hole in the planet's defenses. Every time they retreated before suffering heavy losses. But every time they came back. This last time she had decided to just nap in the cramped cockpit, so when the claxon rang out, she and her ship were basically ready to fly. This time she was going to end them quickly. As she repeatedly squeezed her trigger, she executed Koiogran turns and snap rolls galore, her laser blasts striking true, and the debris of A-wings, X-wings, and B-Wings--along with some frozen traitor remains--floated in space the next few days. At night, she leaned back against her beau, sipping some wine and watch-ing the beautiful streaks of light cross the sky as, piece by piece, the wreckage burned up in the atmosphere during reentry.
\nR5-S1 locked down the loose stabilizer with his gripper arm as he angled the X-Wing's deflector shields. This ship took a firm gripper to get under control, but R5-S1 was up to the task. As his pilot, Veets, fired his last blast from the overheating cannons on the deployed s-foils, R5-S1 did the work of cooling off the guns, spooling up the hyperdrive, and running the calculations for lightspeed. It was time to go. Small ships have a tiny crew, often only a pilot and perhaps an astromech, but often strike above their weight class, a threat to small and large ships alike.
"},"size":"sm","tier":0,"hullDice":"d6","hullDiceStart":3,"hullDiceRolled":[6,4,4],"hullDiceUsed":0,"shldDice":"d6","shldDiceStart":3,"shldDiceRolled":[6,4,4],"shldDiceUsed":0,"pwrDice":"1","buildBaseCost":50000,"buildMinWorkforce":5,"upgrdCostMult":1,"upgrdMinWorkforce":1,"baseSpaceSpeed":300,"baseTurnSpeed":250,"crewMinWorkforce":1,"modBaseCap":20,"modMaxSuitesBase":-1,"modMaxSuitesMult":1,"modMaxSuiteCap":1,"modCostMult":1,"modMinWorkforce":2,"hardpointMult":1,"equipCostMult":1,"equipMinWorkforce":1,"cargoCap":2,"fuelCost":50,"fuelCap":10,"foodCap":10,"source":"SotG"},"folder":null,"sort":200001,"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Features/Small.webp","effects":[{"_id":"aVvrOFBux3t6WMEc","flags":{"dae":{"stackable":false,"transfer":true}},"changes":[{"key":"data.abilities.dex.value","value":2,"mode":2,"priority":1},{"key":"data.abilities.con.value","value":-2,"mode":2,"priority":1}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Starship%20Features/Small.webp","label":"Small Starship","origin":"Item.Kgo48vXNxSZkWp7H","tint":"","transfer":true}]}
-{"_id":"6liD1m4hqKSeS5sp","name":"Medium Starship","permission":{"default":0,"yXqD5rPwgjXHtqeZ":3},"type":"starship","data":{"description":{"value":"The Freighter shudders with the blasts of cannon fire. Despite its maneuvers, the pilot can't quite shake the pursuit. The technician's efforts to reinforce the shields are failing. The mechanic is pumping the reactor for every scrap of energy it can generate. The operator is frantically making the final few calculations for the jump to hyperspace. Finally, just as the ship's shields dissipate, the pilot makes the gut call, jettisoning the illicit cargo. As it distracts and hampers the followers, the freighter shifts power to the thrusters and quickly flies away.
\nAs the pirates activate their tractor beam to attempt to capture the weaponless frigate and its exotic wares, the gunboat escort intercedes. It flies in the line of the tractor, breaking the lock on the frigate, and unleashes a volley of cannon fire. The pirates, incapable of withstanding the salvo, drop the tractor beam and retreat.
\nAs the gunboat pursues to be sure the pirates don't come back for a second bite at the apple, the crew finally locks on target and unleashes a long-range night-stinger missile, putting a permanent end to the pirates' illicit and unwelcome activities.
\nThe captain invites his guests into his well-stocked cantina. He eyes the opposition as they take in his ship, assessing their reactions and noting their expressions. Fully aware of the effect the opulent room has on the unprepared, he easily stifles his grin and gestures for the starry-eyed vis-itors to sit across from him. He indicates for the server to bring drinks as he casually leans back and puts his feet on the table, confident this deal will go his way. He presses a button on the tiny remote in his hand, causing hidden panels to slide away and reveal his mostly-legal wares. \"So,\" he says, \"just how many of these do you need, and where will I deliver them?\"
\nMedium ships are the bread and butter of the closeknit group. They are large enough to accommodate all of the immediate needs of a crew, while at the same time being small enough to feel cozy.
"},"size":"med","tier":0,"hullDice":"d8","hullDiceStart":5,"hullDiceRolled":[8,5,5,5,5],"hullDiceUsed":0,"shldDice":"d8","shldDiceStart":5,"shldDiceRolled":[8,5,5,5,5],"shldDiceUsed":0,"pwrDice":"1","buildBaseCost":100000,"buildMinWorkforce":10,"upgrdCostMult":2,"upgrdMinWorkforce":5,"baseSpaceSpeed":300,"baseTurnSpeed":200,"crewMinWorkforce":1,"modBaseCap":30,"modMaxSuitesBase":3,"modMaxSuitesMult":1,"modMaxSuiteCap":4,"modCostMult":2,"modMinWorkforce":4,"hardpointMult":1.5,"equipCostMult":2,"equipMinWorkforce":2,"cargoCap":25,"fuelCost":100,"fuelCap":30,"foodCap":120,"source":"SotG"},"folder":null,"sort":300001,"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Features/Medium.webp","effects":[]}
-{"_id":"FH8iBT4uujRUR0j7","name":"Gargantuan Starship","permission":{"default":0,"yXqD5rPwgjXHtqeZ":3},"type":"starship","data":{"description":{"value":"The smaller ships retreat into the shadow of the blockade ship, fleeing an overwhelming foe. As the dreadnought's shields envelope them, they quickly turn and spring on their pursuers, utilizing the bulwark's shields as they unleash all of the firepower they have to bear.
\nMeanwhile, the blockade ship unleashes a storm of electromagnetic energy from its antenna array, cutting of communications between enemy ships, effectively isolating the incoming forces from their distant fleet and from each other.
\nIn the center of the fleet, the command ship surveys the battlefield. Wherever the line wavers, the command ship quickly directs ships to reinforce. Finally, the formations of the enemy flag, and the command ship directs the fleet to capitalize on their failure as it determines and uploads targeting coordinates to its torpedo ships.
\nThe warship looms ominously over the battlefield as the two opposing armies crash. Despite the efforts of the enemy line, the warship closes into firing range of the capital ships. Having already determined an ordered targeting precedence, the operating crew confirms final firing solutions for the gunners as they charge up the main super-weapon on the prow of the ship. It unleashes its first devastating blast as the rest of its arsenal begins to lance out at secondary targets nearby.
\nGargantuan ships are the dreadnoughts that strike fear into the hearts of the faithless. They are the embodiment of indomitable might: a symbol of total and complete control.
"},"size":"grg","tier":0,"hullDice":"d20","hullDiceStart":11,"hullDiceRolled":[20,11,11,11,11,11,11,11,11,11,11],"hullDiceUsed":0,"shldDice":"d20","shldDiceStart":11,"shldDiceRolled":[20,11,11,11,11,11,11,11,11,11,11],"shldDiceUsed":0,"pwrDice":"1","buildBaseCost":1000000000,"buildMinWorkforce":10000,"upgrdCostMult":1000,"upgrdMinWorkforce":5000,"baseSpaceSpeed":300,"baseTurnSpeed":50,"crewMinWorkforce":80000,"modBaseCap":70,"modMaxSuitesBase":10,"modMaxSuitesMult":4,"modMaxSuiteCap":40000,"modCostMult":500,"modMinWorkforce":1000,"hardpointMult":3,"equipCostMult":500,"equipMinWorkforce":500,"cargoCap":200000,"fuelCost":100000,"fuelCap":1800,"foodCap":576000000,"source":"SotG"},"folder":null,"sort":600001,"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Features/Gargantuan.webp","effects":[{"_id":"3erWl25IS1iaKUiv","flags":{"dae":{"stackable":false,"transfer":true}},"changes":[{"key":"data.abilities.dex.value","value":-6,"mode":2,"priority":1},{"key":"data.abilities.con.value","value":6,"mode":2,"priority":1}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Starship%20Features/Gargantuan.webp","label":"Gargantuan Starship","origin":"Item.KjK5001DYmUlFfPF","tint":"","transfer":true}]}
-{"_id":"RFKvLuqE13INBxqd","name":"Large Starship","permission":{"default":0,"yXqD5rPwgjXHtqeZ":3},"type":"starship","data":{"description":{"value":"Trapped in the capital ship's tractor beam, the ambassador frigate moves slowly towards the cruiser. The crew struggles to squeeze more power out of their reactor while the few marines on board take positions next to the hatches, wiping sweat from their brows as they check and re-check their weapons. Finally, bringing all the power the ship has to bare, the frigate is able to break the hold of the tractor beam and regain its trajectory, slowly but surely increasing the distance, before finally escaping the planet's moon and being able to jump to hyperspace. Shouts of joy echo down the ship's corridors and extra rations are ordered in celebration.
\nEngines burning brightly, the corvette sprints through the blockade, trying to minimize the amount of fire its meager shields will have to absorb. Top and bottom turrets swivel to port, unleashing return fire against inbound interceptors. The ground drops from under everyone's feet as the artificial gravity systems flicker for a second as a pulse weapon detonates nearby. The high-pitched, distant whine of the reactor is barely audible over commands issuing from the bridge. The visual readouts indicated that they were now past the picket line, and the interceptors appeared to be breaking off, unsure of their ability to take on the much larger ship without the support of their battle stations. They'd made it. Looking back at the scopes, the coordinator's head hung down. They'd been the only ones to do so.
\nAs the Pelta-Class Picket ship danced between the larger destroyers and dreadnaughts, it continued its near constant barrage of heavy laser cannon fire, interspersed with individual launches of concussion missiles and proton torpedoes directed at vulnerable parts of the opposing fleet. If too many of those enemy guns came to bear on the the Pelta, it would be in trouble, but it's speed and it's relatively limited firepower made it a less-than juicy target. For now. But that is exactly what it's captain needed. Just a few more clicks and they would be in a perfect flanking position, able to pound the engines of the flag ship as soon as it's shields were brought down by the bombing squad beginning their run now.
\nLarge ships occupy the pinnacle of size for most private owner/operators in the galaxy. Large ships require an extensive crew and are costly to maintain, but can pack quite a punch and may house various suites and operation centers that allow the ship to operate as an impressive and mobile base of operations for wealthy individuals and successful adventurers.
"},"size":"lg","tier":0,"hullDice":"d10","hullDiceStart":7,"hullDiceRolled":[10,6,6,6,6,6,6],"hullDiceUsed":0,"shldDice":"d10","shldDiceStart":7,"shldDiceRolled":[10,6,6,6,6,6,6],"shldDiceUsed":0,"pwrDice":"1","buildBaseCost":1000000,"buildMinWorkforce":100,"upgrdCostMult":10,"upgrdMinWorkforce":50,"baseSpaceSpeed":300,"baseTurnSpeed":150,"crewMinWorkforce":200,"modBaseCap":50,"modMaxSuitesBase":3,"modMaxSuitesMult":2,"modMaxSuiteCap":400,"modCostMult":5,"modMinWorkforce":10,"hardpointMult":2,"equipCostMult":5,"equipMinWorkforce":5,"cargoCap":500,"fuelCost":1000,"fuelCap":300,"foodCap":240000,"source":"SotG"},"folder":null,"sort":400001,"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Features/Large.webp","effects":[{"_id":"NwpCHKQsAOq16TMa","flags":{"dae":{"stackable":false,"transfer":true}},"changes":[{"key":"data.abilities.dex.value","value":-2,"mode":2,"priority":1},{"key":"data.abilities.con.value","value":2,"mode":2,"priority":1}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Starship%20Features/Large.webp","label":"Large Ship","origin":"Item.ywTvt1JEvDEoqG3A","tint":"","transfer":true}]}
-{"_id":"pgmf0rMYLt4LQtfN","name":"Huge Starship","permission":{"default":0,"yXqD5rPwgjXHtqeZ":3},"type":"starship","data":{"description":{"value":"The battleship's shields flicker as it absorbs the blows of the attacking fighters. It continues inexorably past them as it's point-defense system peppers it's vicinity with blaster fire to ward them off. As it a approaches the fragile medical frigate the fighters scramble to protect, its gunners lock on to the target before unleashing a fierce volley of turbolaser fire and snapping it in half.
\nAs the carrier leaves hyperspace, snubfighters deploy from its hangars in formations and move to intercept the space station's patrol fighters. Before the enemy craft have the opportunity to respond, the fighters fall upon them, quickly decimating their ranks. But before the snubfighters had even left the carrier, a second wave of small bombers had been prepping for takeoff. As they spew forth from the hangars, they quickly lock on to the space station and launch proton bombs, pulverizing the station in minutes.
\nWith the command given, the operator activates the interdictor's gravity well projectors. the lights inside dim almost imperceptibly as huge amounts of power is drawn from the reactor core and supplemental capacitors to the projectors. Accompanied by a lowpitched hum, the gravity well projectors power up.
\nMinutes pass for the ship uneventfully, until finally a frigate lurches unceremoniously out of hyperspace into realspace in front of them. The ship then activates its tractor beam, trapping its quarry.
\nHuge starships, regardless of their specific purpose, are the backbone of any military. They provide a mobile base of operations and function as a staging ground for the faction that controls them.
"},"size":"huge","tier":0,"hullDice":"d12","hullDiceStart":9,"hullDiceRolled":[12,7,7,7,7,7,7,7,7],"hullDiceUsed":0,"shldDice":"d12","shldDiceStart":9,"shldDiceRolled":[12,7,7,7,7,7,7,7,7],"shldDiceUsed":0,"pwrDice":"1","buildBaseCost":100000000,"buildMinWorkforce":1000,"upgrdCostMult":100,"upgrdMinWorkforce":500,"baseSpaceSpeed":300,"baseTurnSpeed":100,"crewMinWorkforce":4000,"modBaseCap":60,"modMaxSuitesBase":6,"modMaxSuitesMult":3,"modMaxSuiteCap":4000,"modCostMult":50,"modMinWorkforce":100,"hardpointMult":2,"equipCostMult":50,"equipMinWorkforce":50,"cargoCap":10000,"fuelCost":10000,"fuelCap":600,"foodCap":9600000,"source":"SotG"},"folder":null,"sort":500001,"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Features/Huge.webp","effects":[{"_id":"5dnyAxPsWqhRxR2v","flags":{"dae":{"stackable":false,"transfer":true}},"changes":[{"key":"data.abilities.dex.value","value":-4,"mode":2,"priority":1},{"key":"data.abilities.con.value","value":4,"mode":2,"priority":1}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Starship%20Features/Huge.webp","label":"Huge Starship","origin":"Item.h8l5MTU8C1pDIQGL","tint":"","transfer":true}]}
-{"_id":"zC4qM8JMmMzCjMJK","name":"Tiny Starship","permission":{"default":0,"yXqD5rPwgjXHtqeZ":3},"type":"starship","data":{"description":{"value":"As the droid fighter ducked and weaved through flying blaster bolts and dodged the occasional flak, its optical sensors continued to become more and more occluded as they accumulated a dark haze of dust and smoke. Switching to active radar systems, the droid continued to relentlessly pursue its target: the fleeing Jedi and its small padawn that was barely larger than a youngling. Not that it mattered. Whether either target continued to draw breath a few seconds from now didn't really matter to the droid. Of course, that cessation was its goal, but it didn't really care about that goal...it's just what it was doing. What it had to do. But not exactly what it wanted to do. The droid passed power from its fully charged weapon's capacitors into its guns, which blazed to life and spewed plasma towards the small child's back. It was a perfect shot. How could it not be. That's what it did. Then the Jedi's own plasma weapon flared as it darted across the youngling's back, deflecting the droid's blasts directly back at it. Of course, that is what Jedi's did. And as the bolts tore through the droid ship's hull, into its main computer banks, across its power banks and out its engines, the droid's final computations let it know that it was plummeting to the earth at terminal velocity. It's just what it was doing. What it now had to do. But not exactly what it wanted to do.
\nThe small drone slips silently past the blockade, scanning the defensive formations as it goes. The only chance to save the people on embattled Neth-Feeno was to coordinate a supply drop with them. This little, remote-controlled stealth ship was their only hope. It had to reach the surface to get the plan and maps through. Then it had to return with a full readout of the defenses. Only then could a distracting assault be planned to cover the air drop. As the tiny craft floated past the final sensor pod mounted right next to the final turret canon, the monitoring crew let out a sigh, and wiped sweat from their brows. As their screens, already more static than signal, winked out as the craft's transmissions were cut-off as it passed completely into the black-out zone, the team leader turned to his squad and said, \"May the force be with us today.\"
\nOne thing all Tiny starships have in common is that they are unmanned. Sometimes they are controlled remotely, but more often they are controlled by droids.
"},"size":"tiny","tier":0,"hullDice":"d4","hullDiceStart":1,"hullDiceRolled":[4],"hullDiceUsed":0,"shldDice":"d4","shldDiceStart":1,"shldDiceRolled":[4],"shldDiceUsed":0,"pwrDice":"1","buildBaseCost":10000,"buildMinWorkforce":3,"upgrdCostMult":0.5,"upgrdMinWorkforce":1,"baseSpaceSpeed":300,"baseTurnSpeed":300,"crewMinWorkforce":0,"modBaseCap":10,"modMaxSuitesBase":0,"modMaxSuitesMult":0,"modMaxSuiteCap":0,"modCostMult":0.5,"modMinWorkforce":1,"hardpointMult":1,"equipCostMult":0.5,"equipMinWorkforce":1,"cargoCap":0,"fuelCost":25,"fuelCap":5,"foodCap":0,"source":"SotG"},"folder":null,"sort":100001,"flags":{},"img":"systems/sw5e/packs/Icons/Starship%20Features/Tiny.webp","effects":[{"_id":"5BCYRjiFKUZY8ke9","flags":{"dae":{"stackable":false,"transfer":true}},"changes":[{"key":"data.abilities.dex.value","value":4,"mode":2,"priority":1},{"key":"data.abilities.con.value","value":-4,"mode":2,"priority":1}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Starship%20Features/Tiny.webp","label":"Tiny Starship","origin":"Item.k1Cxor0HkSEBpkuN","tint":"","transfer":true}]}
diff --git a/packs/packs/weapons.db b/packs/packs/weapons.db
index 708c8be2..39e87327 100644
--- a/packs/packs/weapons.db
+++ b/packs/packs/weapons.db
@@ -137,6 +137,7 @@
{"_id":"uQ2AXesizBRcTjRl","name":"Ion Carbine","permission":{"default":0,"vXYkFWX6qzvOu2jc":3,"5TZqObbCr9nKC79s":3},"type":"weapon","data":{"description":{"value":"Reload 16
","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":8,"price":300,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":1,"width":null,"units":"","type":"enemy"},"range":{"value":60,"long":240,"units":"ft"},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"ammo","target":"","amount":1},"ability":"","actionType":"rwak","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["1d3 + @mod","ion"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":10},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"weaponType":"simpleB","properties":{"amm":true,"aut":false,"bur":false,"def":false,"dex":false,"dir":false,"drm":false,"dgd":false,"dis":false,"dpt":false,"dou":false,"fin":false,"fix":false,"foc":false,"hvy":false,"hid":false,"ken":false,"lgt":false,"lum":false,"mig":false,"pic":false,"rap":false,"rch":false,"rel":true,"ret":false,"shk":false,"sil":false,"spc":false,"str":false,"thr":false,"two":true,"ver":false,"vic":false,"mgc":false,"nodam":false,"faulldam":false},"proficient":false},"folder":"7rtfHBtXhhiRSS8u","sort":2600001,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Simple%20Blasters/Ion%20Carbine.webp","effects":[]}
{"_id":"v55dQl0raOAucwgP","name":"Vibromace","permission":{"default":0,"vXYkFWX6qzvOu2jc":3,"5TZqObbCr9nKC79s":3},"type":"weapon","data":{"description":{"value":"","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":12,"price":80,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":1,"width":null,"units":"","type":"enemy"},"range":{"value":5,"long":null,"units":"ft"},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"mwak","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["1d8 + @mod","kinetic"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":10},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"weaponType":"simpleVW","properties":{"amm":false,"aut":false,"bur":false,"def":false,"dex":false,"dir":false,"drm":false,"dgd":false,"dis":false,"dpt":false,"dou":false,"fin":false,"fix":false,"foc":false,"hvy":true,"hid":false,"ken":false,"lgt":false,"lum":false,"mig":false,"pic":false,"rap":false,"rch":false,"rel":false,"ret":false,"shk":false,"sil":false,"spc":false,"str":false,"thr":false,"two":true,"ver":false,"vic":false,"mgc":false,"nodam":false,"faulldam":false},"proficient":false},"folder":"7rtfHBtXhhiRSS8u","sort":6400001,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Simple%20Vibroweapons/Vibromace.webp","effects":[]}
{"_id":"w62Yd7ahdYyTH61q","name":"Shatter cannon","permission":{"default":0,"MmfWtlBdw3ij5wl9":3},"type":"weapon","data":{"description":{"value":"Ammunition (range 80/320), Burst 4, Reload 8, Silent, Strength 15, Two-handed
","chat":"","unidentified":""},"source":"WH","quantity":1,"weight":24,"price":1300,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":1,"width":null,"units":"","type":"creature"},"range":{"value":80,"long":320,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"consume":{"type":"charges","target":"","amount":30},"ability":"","actionType":"rwak","attackBonus":"0","chatFlavor":"","critical":null,"damage":{"parts":[["1d10","kinetic"]],"versatile":""},"formula":"","save":{"ability":"dex","dc":null,"scaling":"dex"},"armor":{"value":10},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"weaponType":"martialB","properties":{"amm":true,"aut":false,"bur":true,"def":false,"dex":false,"dir":false,"drm":false,"dgd":false,"dis":false,"dpt":false,"dou":false,"fin":false,"fix":false,"foc":false,"hvy":false,"hid":false,"ken":false,"lgt":false,"lum":false,"mig":false,"pic":false,"rap":false,"rch":false,"rel":true,"ret":false,"shk":false,"sil":true,"spc":false,"str":true,"thr":false,"two":true,"ver":false,"vic":false,"nodam":false,"fulldam":false},"proficient":true},"folder":"7rtfHBtXhhiRSS8u","sort":6999220,"flags":{},"img":"systems/sw5e/packs/Icons/Martial%20Blasters/Shatter%20Cannon.webp","effects":[]}
+{"_id":"woDLArHK5OZHsTeU","name":"Disguised Blade","permission":{"default":0,"5TZqObbCr9nKC79s":3},"type":"weapon","data":{"description":{"value":"","chat":"","unidentified":""},"source":"EC","quantity":1,"weight":1,"price":200,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":1,"width":null,"units":"","type":"enemy"},"range":{"value":5,"long":null,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"mwak","attackBonus":"0","chatFlavor":"","critical":null,"damage":{"parts":[["1d4 + @mod","kinetic"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":10},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"weaponType":"martialVW","properties":{"amm":false,"aut":false,"bur":false,"def":false,"dex":false,"dir":false,"drm":true,"dgd":true,"dis":false,"dpt":false,"dou":false,"fin":true,"fix":false,"foc":false,"hvy":false,"hid":false,"ken":false,"lgt":true,"lum":false,"mig":false,"pic":false,"rap":false,"rch":false,"rel":false,"ret":false,"shk":false,"sil":false,"spc":false,"str":false,"thr":false,"two":false,"ver":false,"vic":false},"proficient":true},"folder":"7rtfHBtXhhiRSS8u","sort":7150001,"flags":{},"img":"systems/sw5e/packs/Icons/Disguised%20Blade,"effects":[]}
{"_id":"xfIWfVXfe5ZfD8S2","name":"IWS (Blaster)","permission":{"default":0,"MmfWtlBdw3ij5wl9":3},"type":"weapon","data":{"description":{"value":"\n
The IWS is a heavy weapon that can fire in three different modes. On your turn, you can use your object interaction to switch between modes, detailed below.
\n
Antiarmor. While in this mode, rather than traditional power cells, the IWS fires grenades. When firing a grenade at long range, creatures within the radius of the grenade’s explosion have advantage on the saving throw.
\n
Blaster. While in this mode, the weapon uses traditional power cells.
\n
Sniper. While in this mode, the weapon uses traditional power cells.
\n
\nAntiarmor: Special, Ammunition (range 60/240), reload 1, special
\nBlaster: 1d8 Energy, Ammunition (range 80/320), reload 12
\nSniper: 1d12 Energy, Ammunition (range 120/480), reload 4
\n
\nSpecial, Strength 13, Two-handed
","chat":"","unidentified":""},"source":"WH","quantity":1,"weight":12,"price":7200,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"width":null,"units":"","type":"space"},"range":{"value":80,"long":320,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"consume":{"type":"charges","target":"","amount":20},"ability":"","actionType":"rwak","attackBonus":"0","chatFlavor":"","critical":null,"damage":{"parts":[["1d8 + @mod","energy"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":10},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"weaponType":"martialB","properties":{"amm":true,"aut":false,"bur":false,"def":false,"dex":false,"dir":false,"drm":false,"dgd":false,"dis":false,"dpt":false,"dou":false,"fin":false,"fix":false,"foc":false,"hvy":false,"hid":false,"ken":false,"lgt":false,"lum":false,"mig":false,"pic":false,"rap":false,"rch":false,"rel":true,"ret":false,"shk":false,"sil":false,"spc":false,"str":true,"thr":false,"two":true,"ver":false,"vic":false,"nodam":false,"fulldam":false},"proficient":true},"folder":"7rtfHBtXhhiRSS8u","sort":6650001,"flags":{},"img":"systems/sw5e/packs/Icons/Martial%20Blasters/IWS.webp","effects":[]}
{"_id":"y6faozksI3Bhwnpq","name":"Bowcaster","permission":{"default":0,"vXYkFWX6qzvOu2jc":3,"5TZqObbCr9nKC79s":3},"type":"weapon","data":{"description":{"value":"Burst 4, Reload 4, Strength 11
","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":16,"price":400,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":1,"width":null,"units":"","type":"enemy"},"range":{"value":50,"long":200,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"consume":{"type":"charges","target":"","amount":1},"ability":"","actionType":"rwak","attackBonus":"0","chatFlavor":"","critical":null,"damage":{"parts":[["1d10 + @mod","energy"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"armor":{"value":10},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"weaponType":"simpleB","properties":{"amm":true,"aut":false,"bur":true,"def":false,"dex":false,"dir":false,"drm":false,"dgd":false,"dis":false,"dpt":false,"dou":false,"fin":false,"fix":false,"foc":false,"hvy":false,"hid":false,"ken":false,"lgt":false,"lum":false,"mig":false,"pic":false,"rap":false,"rch":false,"rel":true,"ret":false,"shk":false,"sil":false,"spc":false,"str":true,"thr":false,"two":true,"ver":false,"vic":false,"mgc":false,"nodam":false,"faulldam":false,"fulldam":false},"proficient":false},"folder":"7rtfHBtXhhiRSS8u","sort":800001,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Simple%20Blasters/Bowcaster.webp","effects":[]}
{"_id":"yVxRMON2OWIGeU4n","name":"Disruptorshiv","permission":{"default":0,"MmfWtlBdw3ij5wl9":3},"type":"weapon","data":{"description":{"value":"Disruptive, Finesse, Shocking 13
","chat":"","unidentified":""},"source":"WH","quantity":1,"weight":1,"price":900,"attunement":0,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":1,"width":null,"units":"","type":"creature"},"range":{"value":5,"long":null,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"mwak","attackBonus":"0","chatFlavor":"","critical":null,"damage":{"parts":[["1d4 + @mod","kinetic"]],"versatile":""},"formula":"1d4","save":{"ability":"dex","dc":13,"scaling":"flat"},"armor":{"value":10},"hp":{"value":0,"max":0,"dt":null,"conditions":""},"weaponType":"martialVW","properties":{"amm":false,"aut":false,"bur":false,"def":false,"dex":false,"dir":false,"drm":false,"dgd":false,"dis":false,"dpt":true,"dou":false,"fin":true,"fix":false,"foc":false,"hvy":false,"hid":false,"ken":false,"lgt":false,"lum":false,"mig":false,"pic":false,"rap":false,"rch":false,"rel":false,"ret":false,"shk":true,"sil":false,"spc":false,"str":false,"thr":false,"two":false,"ver":false,"vic":false,"nodam":false,"fulldam":false},"proficient":true},"folder":"7rtfHBtXhhiRSS8u","sort":6750001,"flags":{},"img":"systems/sw5e/packs/Icons/Martial%20Vibroweapons/Disruptorshiv.webp","effects":[]}
diff --git a/sw5e-dark.css b/sw5e-dark.css
index 5506c78c..424da398 100644
--- a/sw5e-dark.css
+++ b/sw5e-dark.css
@@ -797,14 +797,3 @@ body.dark-theme .sw5e.sheet.actor.npc .swalt-sheet header div.creature-type:hove
body.dark-theme .sw5e.sheet.actor.npc .swalt-sheet header .experience {
color: #4f4f4f;
}
-body.dark-theme .sw5e.sheet.actor .swalt-sheet .panel.resources .traits .fuel-wrapper .fuel-label {
- background: #D6D6D6;
- color: #1C1C1C;
- border: 1px solid #1C1C1C;
-}
-body.dark-theme .sw5e.sheet.actor .swalt-sheet .panel.resources .traits .fuel-wrapper .fuel {
- background: #c40f0f;
-}
-body.dark-theme .sw5e.sheet.actor .swalt-sheet .panel.resources .traits .fuel-wrapper .fuel .fuel-bar {
- background: #0dce0d;
-}
\ No newline at end of file
diff --git a/sw5e-global.css b/sw5e-global.css
index 9c5943a1..9f890ada 100644
--- a/sw5e-global.css
+++ b/sw5e-global.css
@@ -1757,78 +1757,3 @@ input[type="reset"]:disabled {
transform: rotate(360deg);
}
}
-.sw5e.sheet.actor .swalt-sheet .panel.resources .traits .fuel-wrapper {
- display: grid;
- grid-template-columns: 300px 100px;
- width: 400px;
- justify-self: end;
-}
-.sw5e.sheet.actor .swalt-sheet .panel.resources .traits .fuel-wrapper .fuel-label {
- font-size: 12px;
- line-height: 14px;
- width: 100%;
- text-shadow: none;
- padding: 0;
- margin: 0;
- height: auto;
- text-align: center;
- margin-left: -2px;
- border-radius: 0 4px 4px 0;
-}
-.sw5e.sheet.actor .swalt-sheet .panel.resources .traits .fuel-wrapper .fuel {
- position: relative;
- border-radius: 4px;
- height: 16px;
- margin: 0;
- width: 100%;
-}
-.sw5e.sheet.actor .swalt-sheet .panel.resources .traits .fuel-wrapper .fuel .fuel-bar {
- position: absolute;
- top: 0;
- left: 0;
- height: 100%;
- border-radius: 4px;
- border: none;
-}
-input[type=range][orient=vertical] {
- -webkit-appearance: slider-vertical;
- width: 10px;
- height: 60px !important;
- padding: 0 0 !important;
- background-color: #c40f0f !important;
- box-sizing: border-box;
-}
-input[type=range][orient=vertical]::-webkit-slider-runnable-track {
- -webkit-appearance: slider-vertical !important;
- height: 60px !important;
- width: 10px !important;
- line-height: 60px !important;
- padding-top: 0 !important;
- padding-bottom: 0 !important;
- margin-top: 0 0 !important;
- border-radius: 3px !important;
- background: linear-gradient(
- to top,
- #c40f0f 50%,
- #0dce0d 50%
- );
-}
-input[type=range][orient=vertical]::-webkit-slider-thumb {
- -webkit-appearance: none !important;
- background-color: #c40f0f !important;
- margin-right: -4px !important;
- margin-top: 0px !important;
- cursor: grab !important;
- border-radius: 0 0 0 0 !important;
- width: 10px !important;
- height: 5px !important;
- font-size: 10px;
-}
-output {
- display: block;
- margin: 5px auto;
- font-size:1.75em;
-}
-input .vertslider {
- height: 60px;
-}
\ No newline at end of file
diff --git a/sw5e-light.css b/sw5e-light.css
index d1635367..20f09b81 100644
--- a/sw5e-light.css
+++ b/sw5e-light.css
@@ -784,14 +784,3 @@ body.light-theme .sw5e.sheet.actor.npc .swalt-sheet header div.creature-type:hov
body.light-theme .sw5e.sheet.actor.npc .swalt-sheet header .experience {
color: #4f4f4f;
}
-body.light-theme .sw5e.sheet.actor .swalt-sheet .panel.resources .traits .fuel-wrapper .fuel-label {
- background: #D6D6D6;
- color: #1C1C1C;
- border: 1px solid #1C1C1C;
-}
-body.light-theme .sw5e.sheet.actor .swalt-sheet .panel.resources .traits .fuel-wrapper .fuel {
- background: #c40f0f;
-}
-body.light-theme .sw5e.sheet.actor .swalt-sheet .panel.resources .traits .fuel-wrapper .fuel .fuel-bar {
- background: #0dce0d;
-}
\ No newline at end of file
diff --git a/sw5e.css b/sw5e.css
index e41c90da..51b2e6f4 100644
--- a/sw5e.css
+++ b/sw5e.css
@@ -429,7 +429,6 @@
list-style: none;
margin: 0;
padding: 0;
- display: block;
}
.sw5e.sheet .items-list .item-name {
flex: 2;
diff --git a/sw5e.js b/sw5e.js
index 91c8e45a..3a1f6439 100644
--- a/sw5e.js
+++ b/sw5e.js
@@ -8,17 +8,17 @@
*/
// Import Modules
-import { SW5E } from "./module/config.js";
-import { registerSystemSettings } from "./module/settings.js";
-import { preloadHandlebarsTemplates } from "./module/templates.js";
-import { _getInitiativeFormula } from "./module/combat.js";
-import { measureDistances } from "./module/canvas.js";
+import {SW5E} from "./module/config.js";
+import {registerSystemSettings} from "./module/settings.js";
+import {preloadHandlebarsTemplates} from "./module/templates.js";
+import {_getInitiativeFormula} from "./module/combat.js";
+import {measureDistances} from "./module/canvas.js";
// Import Documents
import Actor5e from "./module/actor/entity.js";
import Item5e from "./module/item/entity.js";
import CharacterImporter from "./module/characterImporter.js";
-import { TokenDocument5e, Token5e } from "./module/token.js"
+import {TokenDocument5e, Token5e} from "./module/token.js";
// Import Applications
import AbilityTemplate from "./module/pixi/ability-template.js";
@@ -46,122 +46,137 @@ import * as migrations from "./module/migration.js";
/* Foundry VTT Initialization */
/* -------------------------------------------- */
-// Keep on while migrating to Foundry version 0.8
-CONFIG.debug.hooks = true;
+Hooks.once("init", function () {
+ console.log(`SW5e | Initializing SW5E System\n${SW5E.ASCII}`);
-Hooks.once("init", function() {
- console.log(`SW5e | Initializing SW5E System\n${SW5E.ASCII}`);
+ // Create a SW5E namespace within the game global
+ game.sw5e = {
+ applications: {
+ AbilityUseDialog,
+ ActorSheetFlags,
+ ActorSheet5eCharacter,
+ ActorSheet5eCharacterNew,
+ ActorSheet5eNPC,
+ ActorSheet5eNPCNew,
+ ActorSheet5eVehicle,
+ ItemSheet5e,
+ ShortRestDialog,
+ TraitSelector,
+ ActorMovementConfig,
+ ActorSensesConfig
+ },
+ canvas: {
+ AbilityTemplate
+ },
+ config: SW5E,
+ dice: dice,
+ entities: {
+ Actor5e,
+ Item5e,
+ TokenDocument5e,
+ Token5e
+ },
+ macros: macros,
+ migrations: migrations,
+ rollItemMacro: macros.rollItemMacro
+ };
- // Create a SW5E namespace within the game global
- game.sw5e = {
- applications: {
- AbilityUseDialog,
- ActorSheetFlags,
- ActorSheet5eCharacter,
- ActorSheet5eCharacterNew,
- ActorSheet5eNPC,
- ActorSheet5eNPCNew,
- ActorSheet5eVehicle,
- ItemSheet5e,
- ShortRestDialog,
- TraitSelector,
- ActorMovementConfig,
- ActorSensesConfig
- },
- canvas: {
- AbilityTemplate
- },
- config: SW5E,
- dice: dice,
- entities: {
- Actor5e,
- Item5e,
- TokenDocument5e,
- Token5e,
- },
- macros: macros,
- migrations: migrations,
- rollItemMacro: macros.rollItemMacro
- };
+ // Record Configuration Values
+ CONFIG.SW5E = SW5E;
+ CONFIG.Actor.documentClass = Actor5e;
+ CONFIG.Item.documentClass = Item5e;
+ CONFIG.Token.documentClass = TokenDocument5e;
+ CONFIG.Token.objectClass = Token5e;
+ CONFIG.time.roundTime = 6;
+ CONFIG.fontFamilies = ["Engli-Besh", "Open Sans", "Russo One"];
- // Record Configuration Values
- CONFIG.SW5E = SW5E;
- CONFIG.Actor.documentClass = Actor5e;
- CONFIG.Item.documentClass = Item5e;
- CONFIG.Token.documentClass = TokenDocument5e;
- CONFIG.Token.objectClass = Token5e;
- CONFIG.time.roundTime = 6;
- CONFIG.fontFamilies = [
- "Engli-Besh",
- "Open Sans",
- "Russo One"
- ];
+ CONFIG.Dice.DamageRoll = dice.DamageRoll;
+ CONFIG.Dice.D20Roll = dice.D20Roll;
- CONFIG.Dice.DamageRoll = dice.DamageRoll;
- CONFIG.Dice.D20Roll = dice.D20Roll;
+ // 5e cone RAW should be 53.13 degrees
+ CONFIG.MeasuredTemplate.defaults.angle = 53.13;
- // 5e cone RAW should be 53.13 degrees
- CONFIG.MeasuredTemplate.defaults.angle = 53.13;
+ // Add DND5e namespace for module compatability
+ game.dnd5e = game.sw5e;
+ CONFIG.DND5E = CONFIG.SW5E;
- // Add DND5e namespace for module compatability
- game.dnd5e = game.sw5e;
- CONFIG.DND5E = CONFIG.SW5E;
+ // Register System Settings
+ registerSystemSettings();
- // Register System Settings
- registerSystemSettings();
+ // Patch Core Functions
+ CONFIG.Combat.initiative.formula = "1d20 + @attributes.init.mod + @attributes.init.prof + @attributes.init.bonus";
+ Combatant.prototype._getInitiativeFormula = _getInitiativeFormula;
- // Patch Core Functions
- CONFIG.Combat.initiative.formula = "1d20 + @attributes.init.mod + @attributes.init.prof + @attributes.init.bonus";
- Combatant.prototype._getInitiativeFormula = _getInitiativeFormula;
+ // Register Roll Extensions
+ CONFIG.Dice.rolls.push(dice.D20Roll);
+ CONFIG.Dice.rolls.push(dice.DamageRoll);
- // Register Roll Extensions
- CONFIG.Dice.rolls.push(dice.D20Roll);
- CONFIG.Dice.rolls.push(dice.DamageRoll);
+ // Register sheet application classes
+ Actors.unregisterSheet("core", ActorSheet);
+ Actors.registerSheet("sw5e", ActorSheet5eCharacterNew, {
+ types: ["character"],
+ makeDefault: true,
+ label: "SW5E.SheetClassCharacter"
+ });
+ Actors.registerSheet("sw5e", ActorSheet5eCharacter, {
+ types: ["character"],
+ makeDefault: false,
+ label: "SW5E.SheetClassCharacterOld"
+ });
+ Actors.registerSheet("sw5e", ActorSheet5eNPCNew, {
+ types: ["npc"],
+ makeDefault: true,
+ label: "SW5E.SheetClassNPC"
+ });
+ Actors.registerSheet("sw5e", ActorSheet5eNPC, {
+ types: ["npc"],
+ makeDefault: false,
+ label: "SW5E.SheetClassNPCOld"
+ });
+ // Actors.registerSheet("sw5e", ActorSheet5eStarship, {
+ // types: ["starship"],
+ // makeDefault: true,
+ // label: "SW5E.SheetClassStarship"
+ // });
+ Actors.registerSheet("sw5e", ActorSheet5eVehicle, {
+ types: ["vehicle"],
+ makeDefault: true,
+ label: "SW5E.SheetClassVehicle"
+ });
+ Items.unregisterSheet("core", ItemSheet);
+ Items.registerSheet("sw5e", ItemSheet5e, {
+ types: [
+ "weapon",
+ "equipment",
+ "consumable",
+ "tool",
+ "loot",
+ "class",
+ "power",
+ "feat",
+ "species",
+ "backpack",
+ "archetype",
+ "classfeature",
+ "background",
+ "fightingmastery",
+ "fightingstyle",
+ "lightsaberform",
+ "deployment",
+ "deploymentfeature",
+ "starship",
+ "starshipfeature",
+ "starshipmod",
+ "venture"
+ ],
+ makeDefault: true,
+ label: "SW5E.SheetClassItem"
+ });
- // Register sheet application classes
- Actors.unregisterSheet("core", ActorSheet);
- Actors.registerSheet("sw5e", ActorSheet5eCharacterNew, {
- types: ["character"],
- makeDefault: true,
- label: "SW5E.SheetClassCharacter"
- });
- Actors.registerSheet("sw5e", ActorSheet5eCharacter, {
- types: ["character"],
- makeDefault: false,
- label: "SW5E.SheetClassCharacterOld"
- });
- Actors.registerSheet("sw5e", ActorSheet5eNPCNew, {
- types: ["npc"],
- makeDefault: true,
- label: "SW5E.SheetClassNPC"
- });
- Actors.registerSheet("sw5e", ActorSheet5eNPC, {
- types: ["npc"],
- makeDefault: false,
- label: "SW5E.SheetClassNPCOld"
- });
- Actors.registerSheet("sw5e", ActorSheet5eStarship, {
- types: ["starship"],
- makeDefault: true,
- label: "SW5E.SheetClassStarship"
- });
- Actors.registerSheet('sw5e', ActorSheet5eVehicle, {
- types: ['vehicle'],
- makeDefault: true,
- label: "SW5E.SheetClassVehicle"
- });
- Items.unregisterSheet("core", ItemSheet);
- Items.registerSheet("sw5e", ItemSheet5e, {
- types: ['weapon', 'equipment', 'consumable', 'tool', 'loot', 'class', 'power', 'feat', 'species', 'backpack', 'archetype', 'classfeature', 'background', 'fightingmastery', 'fightingstyle', 'lightsaberform', 'deployment', 'deploymentfeature', 'starship', 'starshipfeature', 'starshipmod', 'venture'],
- makeDefault: true,
- label: "SW5E.SheetClassItem"
- });
-
- // Preload Handlebars Templates
- return preloadHandlebarsTemplates();
+ // Preload Handlebars Templates
+ return preloadHandlebarsTemplates();
});
-
/* -------------------------------------------- */
/* Foundry VTT Setup */
/* -------------------------------------------- */
@@ -169,138 +184,175 @@ Hooks.once("init", function() {
/**
* This function runs after game data has been requested and loaded from the servers, so entities exist
*/
-Hooks.once("setup", function() {
+Hooks.once("setup", function () {
+ // Localize CONFIG objects once up-front
+ const toLocalize = [
+ "abilities",
+ "abilityAbbreviations",
+ "abilityActivationTypes",
+ "abilityConsumptionTypes",
+ "actorSizes",
+ "alignments",
+ "armorProficiencies",
+ "armorPropertiesTypes",
+ "conditionTypes",
+ "consumableTypes",
+ "cover",
+ "currencies",
+ "damageResistanceTypes",
+ "damageTypes",
+ "distanceUnits",
+ "equipmentTypes",
+ "healingTypes",
+ "itemActionTypes",
+ "languages",
+ "limitedUsePeriods",
+ "movementTypes",
+ "movementUnits",
+ "polymorphSettings",
+ "proficiencyLevels",
+ "senses",
+ "skills",
+ "starshipRolessm",
+ "starshipRolesmed",
+ "starshipRoleslg",
+ "starshipRoleshuge",
+ "starshipRolesgrg",
+ "starshipSkills",
+ "powerComponents",
+ "powerLevels",
+ "powerPreparationModes",
+ "powerScalingModes",
+ "powerSchools",
+ "targetTypes",
+ "timePeriods",
+ "toolProficiencies",
+ "weaponProficiencies",
+ "weaponProperties",
+ "weaponSizes",
+ "weaponTypes"
+ ];
- // Localize CONFIG objects once up-front
- const toLocalize = [
- "abilities", "abilityAbbreviations", "abilityActivationTypes", "abilityConsumptionTypes", "actorSizes", "alignments",
- "armorProficiencies", "armorPropertiesTypes", "conditionTypes", "consumableTypes", "cover", "currencies", "damageResistanceTypes",
- "damageTypes", "deploymentTypes", "distanceUnits", "equipmentTypes", "healingTypes", "itemActionTypes", "languages",
- "limitedUsePeriods", "movementTypes", "movementUnits", "polymorphSettings", "proficiencyLevels", "senses", "skills",
- "starshipSkills", "powerComponents", "powerLevels", "powerPreparationModes", "powerScalingModes", "powerSchools", "targetTypes",
- "timePeriods", "toolProficiencies", "weaponProficiencies", "weaponProperties", "weaponSizes", "weaponTypes"
- ];
+ // Exclude some from sorting where the default order matters
+ const noSort = [
+ "abilities",
+ "alignments",
+ "currencies",
+ "distanceUnits",
+ "movementUnits",
+ "itemActionTypes",
+ "proficiencyLevels",
+ "limitedUsePeriods",
+ "powerComponents",
+ "powerLevels",
+ "powerPreparationModes",
+ "weaponTypes"
+ ];
- // Exclude some from sorting where the default order matters
- const noSort = [
- "abilities", "alignments", "currencies", "deploymentTypes", "distanceUnits", "movementUnits", "itemActionTypes", "proficiencyLevels",
- "limitedUsePeriods", "powerComponents", "powerLevels", "powerPreparationModes", "weaponTypes"
- ];
-
- // Localize and sort CONFIG objects
- for ( let o of toLocalize ) {
- const localized = Object.entries(CONFIG.SW5E[o]).map(e => {
- return [e[0], game.i18n.localize(e[1])];
- });
- if ( !noSort.includes(o) ) localized.sort((a, b) => a[1].localeCompare(b[1]));
- CONFIG.SW5E[o] = localized.reduce((obj, e) => {
- obj[e[0]] = e[1];
- return obj;
- }, {});
- }
- // add DND5E translation for module compatability
- game.i18n.translations.DND5E = game.i18n.translations.SW5E;
- // console.log(game.settings.get("sw5e", "colorTheme"));
- let theme = game.settings.get("sw5e", "colorTheme") + '-theme';
- document.body.classList.add(theme);
+ // Localize and sort CONFIG objects
+ for (let o of toLocalize) {
+ const localized = Object.entries(CONFIG.SW5E[o]).map((e) => {
+ return [e[0], game.i18n.localize(e[1])];
+ });
+ if (!noSort.includes(o)) localized.sort((a, b) => a[1].localeCompare(b[1]));
+ CONFIG.SW5E[o] = localized.reduce((obj, e) => {
+ obj[e[0]] = e[1];
+ return obj;
+ }, {});
+ }
+ // add DND5E translation for module compatability
+ game.i18n.translations.DND5E = game.i18n.translations.SW5E;
+ // console.log(game.settings.get("sw5e", "colorTheme"));
+ let theme = game.settings.get("sw5e", "colorTheme") + "-theme";
+ document.body.classList.add(theme);
});
/* -------------------------------------------- */
/**
* Once the entire VTT framework is initialized, check to see if we should perform a data migration
*/
-Hooks.once("ready", function() {
+Hooks.once("ready", function () {
+ // Wait to register hotbar drop hook on ready so that modules could register earlier if they want to
+ Hooks.on("hotbarDrop", (bar, data, slot) => macros.create5eMacro(data, slot));
- // Wait to register hotbar drop hook on ready so that modules could register earlier if they want to
- Hooks.on("hotbarDrop", (bar, data, slot) => macros.create5eMacro(data, slot));
+ // Determine whether a system migration is required and feasible
+ if (!game.user.isGM) return;
+ const currentVersion = game.settings.get("sw5e", "systemMigrationVersion");
+ const NEEDS_MIGRATION_VERSION = "1.3.5.R1-A6";
+ // Check for R1 SW5E versions
+ const SW5E_NEEDS_MIGRATION_VERSION = "R1-A6";
+ const COMPATIBLE_MIGRATION_VERSION = 0.8;
+ const needsMigration =
+ currentVersion &&
+ (isNewerVersion(SW5E_NEEDS_MIGRATION_VERSION, currentVersion) ||
+ isNewerVersion(NEEDS_MIGRATION_VERSION, currentVersion));
+ if (!needsMigration && needsMigration !== "") return;
- // Determine whether a system migration is required and feasible
- if ( !game.user.isGM ) return;
- const currentVersion = game.settings.get("sw5e", "systemMigrationVersion");
- const NEEDS_MIGRATION_VERSION = "1.3.5.R1-A6";
- // Check for R1 SW5E versions
- const SW5E_NEEDS_MIGRATION_VERSION = "R1-A6";
- const COMPATIBLE_MIGRATION_VERSION = 0.80;
- const needsMigration = currentVersion && (isNewerVersion(SW5E_NEEDS_MIGRATION_VERSION, currentVersion) || isNewerVersion(NEEDS_MIGRATION_VERSION, currentVersion));
- if (!needsMigration && needsMigration !== "") return;
-
- // Perform the migration
- if ( currentVersion && isNewerVersion(COMPATIBLE_MIGRATION_VERSION, currentVersion) ) {
- const warning = `Your SW5e system data is from too old a Foundry version and cannot be reliably migrated to the latest version. The process will be attempted, but errors may occur.`;
- ui.notifications.error(warning, {permanent: true});
- }
- migrations.migrateWorld();
+ // Perform the migration
+ if (currentVersion && isNewerVersion(COMPATIBLE_MIGRATION_VERSION, currentVersion)) {
+ const warning = `Your SW5e system data is from too old a Foundry version and cannot be reliably migrated to the latest version. The process will be attempted, but errors may occur.`;
+ ui.notifications.error(warning, {permanent: true});
+ }
+ migrations.migrateWorld();
});
/* -------------------------------------------- */
/* Canvas Initialization */
/* -------------------------------------------- */
-Hooks.on("canvasInit", function() {
- // Extend Diagonal Measurement
- canvas.grid.diagonalRule = game.settings.get("sw5e", "diagonalMovement");
- SquareGrid.prototype.measureDistances = measureDistances;
+Hooks.on("canvasInit", function () {
+ // Extend Diagonal Measurement
+ canvas.grid.diagonalRule = game.settings.get("sw5e", "diagonalMovement");
+ SquareGrid.prototype.measureDistances = measureDistances;
});
-
/* -------------------------------------------- */
/* Other Hooks */
/* -------------------------------------------- */
Hooks.on("renderChatMessage", (app, html, data) => {
+ // Display action buttons
+ chat.displayChatActionButtons(app, html, data);
- // Display action buttons
- chat.displayChatActionButtons(app, html, data);
+ // Highlight critical success or failure die
+ chat.highlightCriticalSuccessFailure(app, html, data);
- // Highlight critical success or failure die
- chat.highlightCriticalSuccessFailure(app, html, data);
-
- // Optionally collapse the content
- if (game.settings.get("sw5e", "autoCollapseItemCards")) html.find(".card-content").hide();
+ // Optionally collapse the content
+ if (game.settings.get("sw5e", "autoCollapseItemCards")) html.find(".card-content").hide();
});
Hooks.on("getChatLogEntryContext", chat.addChatMessageContextOptions);
Hooks.on("renderChatLog", (app, html, data) => Item5e.chatListeners(html));
Hooks.on("renderChatPopout", (app, html, data) => Item5e.chatListeners(html));
-Hooks.on('getActorDirectoryEntryContext', Actor5e.addDirectoryContextOptions);
-Hooks.on("renderSceneDirectory", (app, html, data)=> {
- //console.log(html.find("header.folder-header"));
- setFolderBackground(html);
+Hooks.on("getActorDirectoryEntryContext", Actor5e.addDirectoryContextOptions);
+Hooks.on("renderSceneDirectory", (app, html, data) => {
+ //console.log(html.find("header.folder-header"));
+ setFolderBackground(html);
});
-Hooks.on("renderActorDirectory", (app, html, data)=> {
- setFolderBackground(html);
- CharacterImporter.addImportButton(html);
+Hooks.on("renderActorDirectory", (app, html, data) => {
+ setFolderBackground(html);
+ CharacterImporter.addImportButton(html);
});
-Hooks.on("renderItemDirectory", (app, html, data)=> {
- setFolderBackground(html);
+Hooks.on("renderItemDirectory", (app, html, data) => {
+ setFolderBackground(html);
});
-Hooks.on("renderJournalDirectory", (app, html, data)=> {
- setFolderBackground(html);
+Hooks.on("renderJournalDirectory", (app, html, data) => {
+ setFolderBackground(html);
});
-Hooks.on("renderRollTableDirectory", (app, html, data)=> {
- setFolderBackground(html);
+Hooks.on("renderRollTableDirectory", (app, html, data) => {
+ setFolderBackground(html);
});
Hooks.on("ActorSheet5eCharacterNew", (app, html, data) => {
- console.log("renderSwaltSheet");
+ console.log("renderSwaltSheet");
});
// FIXME: This helper is needed for the vehicle sheet. It should probably be refactored.
-Handlebars.registerHelper('getProperty', function (data, property) {
- return getProperty(data, property);
+Handlebars.registerHelper("getProperty", function (data, property) {
+ return getProperty(data, property);
});
-Handlebars.registerHelper('round', function(value) {
- return Math.floor(value);
-});
-
-Handlebars.registerHelper('debug', function(value) {
- console.log(value)
- return value;
-})
-
function setFolderBackground(html) {
- html.find("header.folder-header").each(function() {
- let bgColor = $(this).css("background-color");
- if(bgColor == undefined)
- bgColor = "rgb(255,255,255)";
- $(this).closest('li').css("background-color", bgColor);
- })
-}
\ No newline at end of file
+ html.find("header.folder-header").each(function () {
+ let bgColor = $(this).css("background-color");
+ if (bgColor == undefined) bgColor = "rgb(255,255,255)";
+ $(this).closest("li").css("background-color", bgColor);
+ });
+}
diff --git a/system.json b/system.json
index ca98cd25..3a0a82ca 100644
--- a/system.json
+++ b/system.json
@@ -109,42 +109,6 @@
"label": "Species Traits",
"path": "./packs/packs/speciestraits.db",
"entity": "Item"
- },
- {
- "name": "starshiparmor",
- "label": "Starship Armor",
- "path": "./packs/packs/starshiparmor.db",
- "entity": "Item"
- },
- {
- "name": "starshipequipment",
- "label": "Starship Equipment",
- "path": "./packs/packs/starshipequipment.db",
- "entity": "Item"
- },
- {
- "name": "starshipfeatures",
- "label": "Starship Features",
- "path": "./packs/packs/starshipfeatures.db",
- "entity": "Item"
- },
- {
- "name": "starshipmodifications",
- "label": "Starship Modifications",
- "path": "./packs/packs/starshipmodifications.db",
- "entity": "Item"
- },
- {
- "name": "starships",
- "label": "Starship Types",
- "path": "./packs/packs/starships.db",
- "entity": "Item"
- },
- {
- "name": "starshipweapons",
- "label": "Starship Weapons",
- "path": "./packs/packs/starshipweapons.db",
- "entity": "Item"
},
{
"name": "tables",
diff --git a/template.json b/template.json
index 2eb68c9a..1681d52e 100644
--- a/template.json
+++ b/template.json
@@ -1,6 +1,6 @@
{
"Actor": {
- "types": ["character", "npc", "starship", "vehicle"],
+ "types": ["character", "npc", "vehicle"],
"templates": {
"common": {
"abilities": {
@@ -37,8 +37,8 @@
"value": 10,
"min": 0,
"max": 10,
- "temp": null,
- "tempmax": null
+ "temp": 0,
+ "tempmax": 0
},
"init": {
"value": 0,
@@ -89,15 +89,6 @@
},
"creature": {
"attributes": {
- "rank": {
- "total": 0,
- "coord": 0,
- "gunner": 0,
- "mechanic": 0,
- "operator": 0,
- "pilot": 0,
- "technician": 0
- },
"senses": {
"darkvision": 0,
"blindsight": 0,
@@ -425,119 +416,31 @@
"starship": {
"templates": ["common"],
"attributes": {
- "cost": {
- "baseBuild": 0,
- "baseUpgrade": 0,
- "multEquip": 0,
- "multModification": 0,
- "multUpgrade": 0
- },
+ "cargcap": 0,
+ "crewcap": 0,
+ "cscap": 0,
"death": {
"failure": 0,
"success": 0
},
- "deployment": {
- "coord": {
- "uuid": null,
- "name": null,
- "rank": null,
- "prof": null
- },
- "gunner": {
- "uuid": null,
- "name": null,
- "rank": null,
- "prof": null
- },
- "mechanic": {
- "uuid": null,
- "name": null,
- "rank": null,
- "prof": null
- },
- "operator": {
- "uuid": null,
- "name": null,
- "rank": null,
- "prof": null
- },
- "pilot": {
- "uuid": null,
- "name": null,
- "rank": null,
- "prof": null
- },
- "technician": {
- "uuid": null,
- "name": null,
- "rank": null,
- "prof": null
- },
- "crew": [],
- "passenger": []
- },
- "equip": {
- "armor": {
- "dr": 0,
- "maxDex": 99,
- "stealthDisadv": false
- },
- "hyperdrive": {
- "class": null
- },
- "powerCoupling": {
- "centralCap": 0,
- "systemCap": 0
- },
- "reactor": {
- "fuelMult": 1,
- "powerRecDie": "1"
- },
- "size": {
- "cargoCap": 0,
- "crewMinWorkforce": 0,
- "foodCap": 0
- },
- "shields": {
- "capMult": 1,
- "regenRateMult": 1
- }
- },
- "systemDamage": 0,
- "fuel": {
- "cap": 0,
- "cost": 0,
- "value": 0
- },
+ "dr": 0,
+ "engpow": 1,
+ "exhaustion": 0,
+ "hsm": 1,
"hull": {
"die": "",
"dice": 0,
- "dicemax": 0,
"formula":"",
"value": null,
"max": null
},
"mods": {
- "capUsed": 0,
- "capLimit": 10,
- "hardpoints":{
- "open": 0,
- "max": 0
- },
- "installed": 0,
- "suites": {
- "open": 0,
- "max": 0,
- "cap": 0
- }
+ "open": 10,
+ "max": 10
},
- "power": {
- "die": "",
- "routing":{
- "engines": 1,
- "shields": 1,
- "weapons": 1
- },
+ "pwrdice": {
+ "pwrdie": "",
+ "recovery": 1,
"central": {
"value": 0,
"max": 0
@@ -566,24 +469,21 @@
"shld": {
"die": "",
"dice": 0,
- "dicemax": 0,
- "depleted": false,
"formula":"",
"value": null,
"max": null
},
- "used": false,
- "workforce": {
- "max": 0,
- "minBuild": 0,
- "minEquip": 0,
- "minModification": 0,
- "minUpgrade": 0
- }
+ "shieldpow": 1,
+ "sscap": 0,
+ "suites": {
+ "open": 0,
+ "max": 0
+ },
+ "weaponpow": 1
},
"details": {
"tier": 0,
- "role": [],
+ "role": "",
"source": ""
},
"skills": {
@@ -607,7 +507,7 @@
"value": 0,
"ability": "cha"
},
- "inf": {
+ "int": {
"value": 0,
"ability": "cha"
},
@@ -645,7 +545,7 @@
}
},
"traits": {
- "size": null
+ "size": "med"
}
},
"vehicle": {
@@ -932,7 +832,7 @@
"capx": {
"value": null
},
- "dmgred": {
+ "hpperhd": {
"value": null
},
"regrateco": {
@@ -1115,34 +1015,12 @@
"size": "",
"tier": 0,
"hullDice": "d6",
- "hullDiceStart": 3,
- "hullDiceRolled":[6,4,4],
+ "hullDiceStart": 1,
"hullDiceUsed": 0,
"shldDice": "d6",
- "shldDiceStart": 3,
- "shldDiceRolled":[6,4,4],
+ "shldDiceStart": 1,
"shldDiceUsed": 0,
"pwrDice": "1",
- "buildBaseCost": 50000,
- "buildMinWorkforce": 5,
- "upgrdCostMult": 1,
- "upgrdMinWorkforce": 1,
- "baseSpaceSpeed": 300,
- "baseTurnSpeed": 250,
- "crewMinWorkforce": 1,
- "modBaseCap": 20,
- "modMaxSuitesBase": 0,
- "modMaxSuitesMult": 1,
- "modMaxSuiteCap": 1,
- "modCostMult": 1,
- "modMinWorkforce": 2,
- "hardpointMult": 2,
- "equipCostMult": 1,
- "equipMinWorkforce": 1,
- "cargoCap": 2,
- "fuelCost": 50,
- "fuelCap": 10,
- "foodCap": 10,
"source": "SotG"
},
"starshipfeature": {
diff --git a/templates/actors/newActor/parts/swalt-crew.html b/templates/actors/newActor/parts/swalt-crew.html
index 423f7cc4..16c50787 100644
--- a/templates/actors/newActor/parts/swalt-crew.html
+++ b/templates/actors/newActor/parts/swalt-crew.html
@@ -8,26 +8,6 @@
{{localize "SW5E.Reaction"}}
-
- - Coordinator: {{data.attributes.deployment.coord.name}}
- - Rank: {{data.attributes.deployment.coord.rank}}
- - Prof: {{data.attributes.deployment.coord.prof}}
- - Gunner: {{data.attributes.deployment.gunner.name}}
- - Rank: {{data.attributes.deployment.gunner.rank}}
- - Prof: {{data.attributes.deployment.gunner.prof}}
- - Mechanic: {{data.attributes.deployment.mechanic.name}}
- - Rank: {{data.attributes.deployment.mechanic.rank}}
- - Prof: {{data.attributes.deployment.mechanic.prof}}
- - Operator: {{data.attributes.deployment.operator.name}}
- - Rank: {{data.attributes.deployment.operator.rank}}
- - Prof: {{data.attributes.deployment.operator.prof}}
- - Pilot: {{data.attributes.deployment.pilot.name}}
- - Rank: {{data.attributes.deployment.pilot.rank}}
- - Prof: {{data.attributes.deployment.pilot.prof}}
- - Technician: {{data.attributes.deployment.technician.name}}
- - Rank: {{data.attributes.deployment.technician.rank}}
- - Prof: {{data.attributes.deployment.technician.prof}}
-
{{#each sections as |section sid|}}
diff --git a/templates/actors/newActor/starship.html b/templates/actors/newActor/starship.html
index 3a5b9d32..5738742c 100644
--- a/templates/actors/newActor/starship.html
+++ b/templates/actors/newActor/starship.html
@@ -14,8 +14,14 @@
+
{{lookup config.actorSizes data.traits.size}}
-
+
+ {{lookup config.starshipRolessm data.details.role}}
+
{{!-- ARMOR CLASS --}}
@@ -25,11 +31,10 @@
-
+
{{!-- HULL POINTS --}}
@@ -37,15 +42,14 @@
{{ localize "SW5E.HullPoints" }}
+ data-dtype="Number" placeholder="0" class="value-number" />
/
+ data-dtype="Number" placeholder="0" class="value-number" />
-