Merge pull request #258 from unrealkakeman89/Develop

Develop
This commit is contained in:
CK 2021-08-19 16:21:33 -04:00 committed by GitHub
commit 9719740291
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
120 changed files with 5806 additions and 3893 deletions

View file

@ -41,6 +41,8 @@
"SETTINGS.5eDiagPHB": "PHB: Equidistant (5/5/5)",
"SETTINGS.5eInitTBL": "Append the raw Dexterity ability score to break ties in Initiative.",
"SETTINGS.5eInitTBN": "Initiative Dexterity Tiebreaker",
"SETTINGS.5eMetricN": "Use Metric Weight Units",
"SETTINGS.5eMetricL": "Replaces all reference to lbs with kgs and updates the encumberance calculations to use metric weight units.",
"SETTINGS.5eNoExpL": "Remove experience bars from character sheets.",
"SETTINGS.5eNoExpN": "Disable Experience Tracking",
"SETTINGS.5eReset": "Reset",
@ -58,6 +60,7 @@
"SW5E.AbbreviationConc": "Conc.",
"SW5E.AbbreviationCR": "CR",
"SW5E.AbbreviationDC": "DC",
"SW5E.AbbreviationKgs": "kgs",
"SW5E.AbbreviationLbs": "lbs.",
"SW5E.AbbreviationLevel": "Lvl.",
"SW5E.AbbreviationLR": "LR",
@ -127,6 +130,19 @@
"SW5E.ArchetypeName": "Archetype Name",
"SW5E.Archetypes": "Archetypes",
"SW5E.ArmorClass": "Armor Class",
"SW5E.ArmorClassEquipment": "Equipped Armor",
"SW5E.ArmorClassFlat": "Flat",
"SW5E.ArmorClassUnarmored": "Unarmored",
"SW5E.ArmorClassNatural": "Natural Armor",
"SW5E.ArmorClassMage": "Mage Armor",
"SW5E.ArmorClassDraconic": "Draconic Resilience",
"SW5E.ArmorClassUnarmoredMonk": "Unarmored Defense (Monk)",
"SW5E.ArmorClassUnarmoredBarbarian": "Unarmored Defense (Barbarian)",
"SW5E.ArmorClassCustom": "Custom Formula",
"SW5E.ArmorConfig": "Configure Armor",
"SW5E.ArmorConfigHint": "Fill in the above box to override automatically calculated armor class.",
"SW5E.ArmorClassCalculation": "Calculation",
"SW5E.ArmorClassFormula": "Formula",
"SW5E.ArmorProperAbsorptive": "Absorptive",
"SW5E.ArmorProperAgile": "Agile",
"SW5E.ArmorProperAnchor": "Anchor",
@ -171,6 +187,7 @@
"SW5E.Background": "Background",
"SW5E.Biography": "Biography",
"SW5E.Bonds": "Bonds",
"SW5E.Bonus": "Bonus",
"SW5E.BonusAbilityCheck": "Global Ability Check Bonus",
"SW5E.BonusAbilitySave": "Global Saving Throw Bonus",
"SW5E.BonusAbilitySkill": "Global Skill Check Bonus",
@ -211,6 +228,7 @@
"SW5E.ClassOriginal": "Original Class",
"SW5E.ClassSaves": "Saving Throws",
"SW5E.ClassSkillsChosen": "Chosen Class Skills",
"SW5E.ClassSkillsEligible": "Eligible Class Skills",
"SW5E.ClassSkillsNumber": "Number of Starting Skills",
"SW5E.Collapse": "Collapse/Expand",
"SW5E.ComponentMaterial": "Material",
@ -340,6 +358,8 @@
"SW5E.Disadvantage": "Disadvantage",
"SW5E.DistAny": "Any",
"SW5E.DistFt": "Feet",
"SW5E.DistKm": "Kilometers",
"SW5E.DistM": "Meters",
"SW5E.DistMi": "Miles",
"SW5E.DistSelf": "Self",
"SW5E.DistTouch": "Touch",
@ -351,6 +371,8 @@
"SW5E.EffectInactive": "Inactive Effects",
"SW5E.EffectNew": "New Effect",
"SW5E.EffectPassive": "Passive Effects",
"SW5E.EffectUnavailable": "Unavailable Effects",
"SW5E.EffectUnavailableInfo": "Source item must be equipped or attuned to activate these",
"SW5E.Effects": "Effects",
"SW5E.EffectTemporary": "Temporary Effects",
"SW5E.EffectsCategoryInactive": "Inactive Effects",
@ -581,11 +603,18 @@
"SW5E.ItemName": "Item Name",
"SW5E.ItemNew": "New {type}",
"SW5E.ItemNoUses": "{name} has no available uses remaining.",
"SW5E.ItemRarityCommon": "common",
"SW5E.ItemRarityUncommon": "uncommon",
"SW5E.ItemRarityRare": "rare",
"SW5E.ItemRarityVeryRare": "very rare",
"SW5E.ItemRarityLegendary": "legendary",
"SW5E.ItemRarityArtifact": "artifact",
"SW5E.ItemRechargeCheck": "{name} recharge check",
"SW5E.ItemRechargeFailure": "failure!",
"SW5E.ItemRechargeSuccess": "success!",
"SW5E.ItemRequiredStr": "Required Strength",
"SW5E.ItemToolProficiency": "Tool Proficiency",
"SW5E.ItemToolType": "Tool Type",
"SW5E.ItemTypeArchetype": "Archetype",
"SW5E.ItemTypeBackground": "Background",
"Sw5E.ItemTypeBackgroundPl": "Backgrounds",
@ -892,6 +921,8 @@
"SW5E.Price": "Price",
"SW5E.Proficiency": "Proficiency",
"SW5E.Proficient": "Proficient",
"SW5E.PropertyBase": "Base",
"SW5E.PropertyTotal": "Total",
"SW5E.Quantity": "Quantity",
"SW5E.Range": "Range",
"SW5E.Rank": "Rank",
@ -1121,7 +1152,7 @@
"SW5E.ToolSurveyor": "Surveyor's Tools",
"SW5E.ToolSynthweaver": "Synthweavers's Tools",
"SW5E.ToolTinker": "Tinker's Tools",
"SW5E.ToolVehicle": "Vehicle (Land or Water)",
"SW5E.ToolVehicle": "Vehicles",
"SW5E.TraitArmorProf": "Armor Proficiencies",
"SW5E.TraitSave": "Update",
"SW5E.TraitSelectorSpecial": "Special (Split with Semi-Colon)",
@ -1148,10 +1179,16 @@
"SW5E.VehicleEquipment": "Vehicle Equipment",
"SW5E.VehicleMishap": "Mishap",
"SW5E.VehiclePassengers": "Passengers",
"SW5E.VehicleTypeAir": "Air Vehicle",
"SW5E.VehicleTypeLand": "Land Vehicle",
"SW5E.VehicleTypeWater": "Water Vehicle",
"SW5E.VehicleUncrewed": "Uncrewed",
"SW5E.Versatile": "Versatile",
"SW5E.VersatileDamage": "Versatile Damage",
"SW5E.VsDC": "vs DC.",
"SW5E.WarnBadACFormula": "The provided AC formula could not be evaluated.",
"SW5E.WarnMultipleArmor": "More than one suit of armor equipped, AC calculation may be incorrect.",
"SW5E.WarnMultipleShields": "More than one shield equipped, AC calculation may be incorrect.",
"SW5E.WeaponAmmo": "Ammunition",
"SW5E.WeaponBlasterPistolProficiency": "Blaster Pistol",
"SW5E.WeaponChakramProficiency": "Chakrams",
@ -1234,4 +1271,4 @@
"SW5E.WeaponVibrorapierProficiency": "Vibrorapier",
"SW5E.WeaponVibrowhipProficiency": "Vibrowhip",
"SW5E.Weight": "Weight"
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -4,54 +4,58 @@
/* Basic Structure */
/* ----------------------------------------- */
.sw5e.sheet.actor.npc {
min-width: 872px;
min-height: 680px;
min-width: 872px;
min-height: 680px;
.header-exp {
flex: 0 0 80px;
justify-content: center;
.cr {
flex: 0 0 32px;
line-height: 28px;
margin-bottom: -5px;
font-size: 24px;
input {
width: 32px;
padding: 0;
text-align: center;
}
.header-exp {
flex: 0 0 80px;
justify-content: center;
.cr {
flex: 0 0 32px;
line-height: 28px;
margin-bottom: -5px;
font-size: 24px;
input {
width: 32px;
padding: 0;
text-align: center;
}
}
.experience,
.proficiency {
flex: 0 0 18px;
color: @colorTan;
font-size: 16px;
}
.proficiency {
margin-top: -0.3em;
}
}
.experience {
flex: 0 0 18px;
color: @colorTan;
font-size: 16px;
.summary {
font-size: 18px;
li.creature-type {
display: flex;
justify-content: space-between;
width: 1em;
padding: 0 3px;
span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.config-button {
display: none;
font-size: 12px;
font-weight: normal;
line-height: 2em;
}
&:hover .config-button {
display: block;
}
}
}
}
.summary {
font-size: 18px;
li.creature-type {
display: flex;
justify-content: space-between;
width: 1em;
padding: 0 3px;
span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.config-button {
display: none;
font-size: 12px;
font-weight: normal;
line-height: 2em;
}
&:hover .config-button {
display: block;
}
}
}
}
}

View file

@ -1,32 +1,35 @@
.sw5e.sheet.actor.vehicle {
.features {
.item-controls {
flex: 0 0 68px;
.item-toggle {
color: #b5b3a4;
&.active {
color: #4b4a44;
min-width: 720px;
min-height: 680px;
.features {
.item-controls {
flex: 0 0 68px;
.item-toggle {
color: #b5b3a4;
&.active {
color: #4b4a44;
}
}
}
}
}
}
.counters {
.counter.creature-cap {
.counter-value {
flex: 1;
}
.counters {
.counter.creature-cap {
.counter-value {
flex: 1;
}
input {
max-width: none;
text-align: right;
}
}
input {
max-width: none;
text-align: right;
}
}
.counter.cargo-cap {
input {
max-width: 40px;
text-align: right;
}
.counter.cargo-cap {
input {
max-width: 40px;
text-align: right;
}
}
}
}
}

File diff suppressed because it is too large Load diff

113
module/active-effect.js Normal file
View file

@ -0,0 +1,113 @@
/**
* Extend the base ActiveEffect class to implement system-specific logic.
* @extends {ActiveEffect}
*/
export default class ActiveEffect5e extends ActiveEffect {
/**
* Is this active effect currently suppressed?
* @type {boolean}
*/
isSuppressed = false;
/* --------------------------------------------- */
/** @inheritdoc */
apply(actor, change) {
if ( this.isSuppressed ) return null;
return super.apply(actor, change);
}
/* --------------------------------------------- */
/**
* Determine whether this Active Effect is suppressed or not.
*/
determineSuppression() {
this.isSuppressed = false;
if ( this.data.disabled || (this.parent.documentName !== "Actor") ) return;
const [parentType, parentId, documentType, documentId] = this.data.origin?.split(".") ?? [];
if ( (parentType !== "Actor") || (parentId !== this.parent.id) || (documentType !== "Item") ) return;
const item = this.parent.items.get(documentId);
if ( !item ) return;
const itemData = item.data.data;
// If an item is not equipped, or it is equipped but it requires attunement and is not attuned, then disable any
// Active Effects that might have originated from it.
this.isSuppressed = itemData.equipped === false || (itemData.attunement === CONFIG.SW5E.attunementTypes.REQUIRED);
}
/* --------------------------------------------- */
/**
* Manage Active Effect instances through the Actor Sheet via effect control buttons.
* @param {MouseEvent} event The left-click event on the effect control
* @param {Actor|Item} owner The owning entity which manages this effect
*/
static onManageActiveEffect(event, owner) {
event.preventDefault();
const a = event.currentTarget;
const li = a.closest("li");
const effect = li.dataset.effectId ? owner.effects.get(li.dataset.effectId) : null;
switch ( a.dataset.action ) {
case "create":
return owner.createEmbeddedDocuments("ActiveEffect", [{
label: game.i18n.localize("SW5E.EffectNew"),
icon: "icons/svg/aura.svg",
origin: owner.uuid,
"duration.rounds": li.dataset.effectType === "temporary" ? 1 : undefined,
disabled: li.dataset.effectType === "inactive"
}]);
case "edit":
return effect.sheet.render(true);
case "delete":
return effect.delete();
case "toggle":
return effect.update({disabled: !effect.data.disabled});
}
}
/* --------------------------------------------- */
/**
* Prepare the data structure for Active Effects which are currently applied to an Actor or Item.
* @param {ActiveEffect[]} effects The array of Active Effect instances to prepare sheet data for
* @return {object} Data for rendering
*/
static prepareActiveEffectCategories(effects) {
// Define effect header categories
const categories = {
temporary: {
type: "temporary",
label: game.i18n.localize("SW5E.EffectTemporary"),
effects: []
},
passive: {
type: "passive",
label: game.i18n.localize("SW5E.EffectPassive"),
effects: []
},
inactive: {
type: "inactive",
label: game.i18n.localize("SW5E.EffectInactive"),
effects: []
},
suppressed: {
type: "suppressed",
label: game.i18n.localize("SW5E.EffectUnavailable"),
effects: [],
info: [game.i18n.localize("SW5E.EffectUnavailableInfo")]
}
};
// Iterate over active effects, classifying them into categories
for ( let e of effects ) {
e._getSourceName(); // Trigger a lookup for the source name
if ( e.isSuppressed ) categories.suppressed.effects.push(e);
else if ( e.data.disabled ) categories.inactive.effects.push(e);
else if ( e.isTemporary ) categories.temporary.effects.push(e);
else categories.passive.effects.push(e);
}
categories.suppressed.hidden = !categories.suppressed.effects.length;
return categories;
}
}

View file

@ -27,7 +27,7 @@ export default class Actor5e extends Actor {
*/
get classes() {
if (this._classes !== undefined) return this._classes;
if (this.data.type !== "character") return (this._classes = {});
if (!["character", "npc"].includes(this.data.type)) return (this._classes = {});
return (this._classes = this.items
.filter((item) => item.type === "class")
.reduce((obj, cls) => {
@ -52,6 +52,7 @@ export default class Actor5e extends Actor {
/** @override */
prepareData() {
this._preparationWarnings = [];
super.prepareData();
// iterate over owned items and recompute attributes that depend on prepared actor data
@ -62,6 +63,7 @@ export default class Actor5e extends Actor {
/** @override */
prepareBaseData() {
this._prepareBaseArmorClass(this.data);
switch (this.data.type) {
case "character":
return this._prepareCharacterData(this.data);
@ -74,6 +76,16 @@ export default class Actor5e extends Actor {
}
}
/* --------------------------------------------- */
/** @override */
applyActiveEffects() {
// The Active Effects do not have access to their parent at preparation time so we wait until this stage to
// determine whether they are suppressed or not.
this.effects.forEach((e) => e.determineSuppression());
return super.applyActiveEffects();
}
/* -------------------------------------------- */
/** @override */
@ -146,6 +158,12 @@ export default class Actor5e extends Actor {
// Prepare power-casting data
this._computeDerivedPowercasting(this.data);
// Prepare armor class data
const ac = this._computeArmorClass(data);
this.armor = ac.equippedArmor || null;
this.shield = ac.equippedShield || null;
if (ac.warnings) this._preparationWarnings.push(...ac.warnings);
}
/* -------------------------------------------- */
@ -425,6 +443,21 @@ export default class Actor5e extends Actor {
/* -------------------------------------------- */
/**
* Initialize derived AC fields for Active Effects to target.
* @param actorData
* @private
*/
_prepareBaseArmorClass(actorData) {
const ac = actorData.data.attributes.ac;
ac.base = 10;
ac.shield = ac.bonus = ac.cover = 0;
this.armor = null;
this.shield = null;
}
/* -------------------------------------------- */
/**
* Prepare data related to the power-casting capabilities of the Actor
* @private
@ -658,6 +691,103 @@ export default class Actor5e extends Actor {
/* -------------------------------------------- */
/**
* Determine a character's AC value from their equipped armor and shield.
* @param {object} data Note that this object will be mutated.
* @return {{
* calc: string,
* value: number,
* base: number,
* shield: number,
* bonus: number,
* cover: number,
* flat: number,
* equippedArmor: Item5e,
* equippedShield: Item5e,
* warnings: string[]
* }}
* @private
*/
_computeArmorClass(data) {
// Get AC configuration and apply automatic migrations for older data structures
const ac = data.attributes.ac;
ac.warnings = [];
let cfg = CONFIG.SW5E.armorClasses[ac.calc];
if (!cfg) {
ac.calc = "flat";
if (Number.isNumeric(ac.value)) ac.flat = Number(ac.value);
cfg = CONFIG.SW5E.armorClasses.flat;
}
// Identify Equipped Items
const armorTypes = new Set(Object.keys(CONFIG.SW5E.armorTypes));
const {armors, shields} = this.itemTypes.equipment.reduce(
(obj, equip) => {
const armor = equip.data.data.armor;
if (!equip.data.data.equipped || !armorTypes.has(armor?.type)) return obj;
if (armor.type === "shield") obj.shields.push(equip);
else obj.armors.push(equip);
return obj;
},
{armors: [], shields: []}
);
// Determine base AC
switch (ac.calc) {
// Flat AC (no additional bonuses)
case "flat":
ac.value = ac.flat;
return ac;
// Natural AC (includes bonuses)
case "natural":
ac.base = ac.flat;
break;
// Equipment-based AC
case "default":
if (armors.length) {
if (armors.length > 1) ac.warnings.push("SW5E.WarnMultipleArmor");
const armorData = armors[0].data.data.armor;
const isHeavy = armorData.type === "heavy";
ac.dex = isHeavy ? 0 : Math.min(armorData.dex ?? Infinity, data.abilities.dex.mod);
ac.base = (armorData.value ?? 0) + ac.dex;
ac.equippedArmor = armors[0];
} else {
ac.dex = data.abilities.dex.mod;
ac.base = 10 + ac.dex;
}
break;
// Formula-based AC
default:
let formula = ac.calc === "custom" ? ac.formula : cfg.formula;
const rollData = this.getRollData();
try {
const replaced = Roll.replaceFormulaData(formula, rollData);
ac.base = Roll.safeEval(replaced);
} catch (err) {
ac.warnings.push("SW5E.WarnBadACFormula");
const replaced = Roll.replaceFormulaData(CONFIG.SW5E.armorClasses.default.formula, rollData);
ac.base = Roll.safeEval(replaced);
}
break;
}
// Equipped Shield
if (shields.length) {
if (shields.length > 1) ac.warnings.push("SW5E.WarnMultipleShields");
ac.shield = shields[0].data.data.armor.value ?? 0;
ac.equippedShield = shields[0];
}
// Compute total AC and return
ac.value = ac.base + ac.shield + ac.bonus + ac.cover;
return ac;
}
/* -------------------------------------------- */
/**
* Prepare data related to the power-casting capabilities of the Actor
* @private
@ -712,7 +842,12 @@ export default class Actor5e extends Actor {
if (game.settings.get("sw5e", "currencyWeight") && actorData.data.currency) {
const currency = actorData.data.currency;
const numCoins = Object.values(currency).reduce((val, denom) => (val += Math.max(denom, 0)), 0);
weight += numCoins / CONFIG.SW5E.encumbrance.currencyPerWeight;
const currencyPerWeight = game.settings.get("sw5e", "metricWeightUnits")
? CONFIG.SW5E.encumbrance.currencyPerWeight.metric
: CONFIG.SW5E.encumbrance.currencyPerWeight.imperial;
weight += numCoins / currencyPerWeight;
}
// Determine the encumbrance size class
@ -729,9 +864,14 @@ export default class Actor5e extends Actor {
// Compute Encumbrance percentage
weight = weight.toNearest(0.1);
const max = actorData.data.abilities.str.value * CONFIG.SW5E.encumbrance.strMultiplier * mod;
const strengthMultiplier = game.settings.get("sw5e", "metricWeightUnits")
? CONFIG.SW5E.encumbrance.strMultiplier.metric
: CONFIG.SW5E.encumbrance.strMultiplier.imperial;
const max = (actorData.data.abilities.str.value * strengthMultiplier * mod).toNearest(0.1);
const pct = Math.clamped((weight * 100) / max, 0, 100);
return {value: weight.toNearest(0.1), max, pct, encumbered: pct > 2 / 3};
return {value: weight.toNearest(0.1), max, pct, encumbered: pct > 200 / 3};
}
/* -------------------------------------------- */
@ -741,7 +881,10 @@ export default class Actor5e extends Actor {
/** @inheritdoc */
async _preCreate(data, options, user) {
await super._preCreate(data, options, user);
const sourceId = this.getFlag("core", "sourceId");
if (sourceId?.startsWith("Compendium.")) return;
// Some sensible defaults for convenience
// Token size category
const s = CONFIG.SW5E.tokenSizes[this.data.data.traits.size || "med"];
this.data.token.update({width: s, height: s});
@ -1044,6 +1187,7 @@ export default class Actor5e extends Actor {
// Evaluate a global saving throw bonus
const parts = [];
const data = {};
const speaker = options.speaker || ChatMessage.getSpeaker({actor: this});
// Include a global actor ability save bonus
const bonuses = foundry.utils.getProperty(this.data.data, "bonuses.abilities") || {};
@ -1060,7 +1204,7 @@ export default class Actor5e extends Actor {
halflingLucky: this.getFlag("sw5e", "halflingLucky"),
targetValue: 10,
messageData: {
"speaker": options.speaker || ChatMessage.getSpeaker({actor: this}),
"speaker": speaker,
"flags.sw5e.roll": {type: "death"}
}
});
@ -1192,6 +1336,7 @@ export default class Actor5e extends Actor {
* @property {number} dhd Hit dice recovered or spent during the rest.
* @property {object} updateData Updates applied to the actor.
* @property {Array.<object>} updateItems Updates applied to actor's items.
* @property {boolean} longRest Whether the rest type was a long rest.
* @property {boolean} newDay Whether a new day occurred during the rest.
*/
@ -1316,7 +1461,8 @@ export default class Actor5e extends Actor {
...hitDiceUpdates,
...this._getRestItemUsesRecovery({recoverLongRestUses: longRest, recoverDailyUses: newDay})
],
newDay: newDay
longRest,
newDay
};
// Perform updates
@ -1326,6 +1472,9 @@ export default class Actor5e extends Actor {
// Display a Chat Message summarizing the rest effects
if (chat) await this._displayRestResultMessage(result, longRest);
// Call restCompleted hook so that modules can easily perform actions when actors finish a rest
Hooks.callAll("restCompleted", this, result);
// Return data summarizing the rest effects
return result;
}
@ -1364,13 +1513,13 @@ export default class Actor5e extends Actor {
// Determine the chat message to display
if (longRest) {
message = "SW5E.LongRestResult";
if (dhp !== 0) message += "HP";
if (healthRestored) message += "HP";
if (dfp !== 0) message += "FP";
if (dtp !== 0) message += "TP";
if (dhd !== 0) message += "HD";
if (diceRestored) message += "HD";
} else {
message = "SW5E.ShortRestResultShort";
if (dhd !== 0 && dhp !== 0) {
if (diceRestored && healthRestored) {
if (dtp !== 0) {
message = "SW5E.ShortRestResultWithTech";
} else {
@ -1581,19 +1730,19 @@ export default class Actor5e extends Actor {
/**
* Transform this Actor into another one.
*
* @param {Actor} target The target Actor.
* @param {boolean} [keepPhysical] Keep physical abilities (str, dex, con)
* @param {boolean} [keepMental] Keep mental abilities (int, wis, cha)
* @param {boolean} [keepSaves] Keep saving throw proficiencies
* @param {boolean} [keepSkills] Keep skill proficiencies
* @param {boolean} [mergeSaves] Take the maximum of the save proficiencies
* @param {boolean} [mergeSkills] Take the maximum of the skill proficiencies
* @param {boolean} [keepClass] Keep proficiency bonus
* @param {boolean} [keepFeats] Keep features
* @param {boolean} [keepPowers] Keep powers
* @param {boolean} [keepItems] Keep items
* @param {boolean} [keepBio] Keep biography
* @param {boolean} [keepVision] Keep vision
* @param {Actor5e} target The target Actor.
* @param {boolean} [keepPhysical] Keep physical abilities (str, dex, con)
* @param {boolean} [keepMental] Keep mental abilities (int, wis, cha)
* @param {boolean} [keepSaves] Keep saving throw proficiencies
* @param {boolean} [keepSkills] Keep skill proficiencies
* @param {boolean} [mergeSaves] Take the maximum of the save proficiencies
* @param {boolean} [mergeSkills] Take the maximum of the skill proficiencies
* @param {boolean} [keepClass] Keep proficiency bonus
* @param {boolean} [keepFeats] Keep features
* @param {boolean} [keepPowers] Keep powers
* @param {boolean} [keepItems] Keep items
* @param {boolean} [keepBio] Keep biography
* @param {boolean} [keepVision] Keep vision
* @param {boolean} [transformTokens] Transform linked tokens too
*/
async transformInto(
@ -1649,16 +1798,16 @@ export default class Actor5e extends Actor {
d.data.attributes.exhaustion = o.data.attributes.exhaustion; // Keep your prior exhaustion level
d.data.attributes.inspiration = o.data.attributes.inspiration; // Keep inspiration
d.data.powers = o.data.powers; // Keep power slots
d.data.attributes.ac.flat = target.data.data.attributes.ac.value; // Override AC
// Token appearance updates
d.token = {name: d.name};
for (let k of ["width", "height", "scale", "img", "mirrorX", "mirrorY", "tint", "alpha", "lockRotation"]) {
d.token[k] = source.token[k];
}
if (!keepVision) {
for (let k of ["dimSight", "brightSight", "dimLight", "brightLight", "vision", "sightAngle"]) {
d.token[k] = source.token[k];
}
const vision = keepVision ? o.token : source.token;
for (let k of ["dimSight", "brightSight", "dimLight", "brightLight", "vision", "sightAngle"]) {
d.token[k] = vision[k];
}
if (source.token.randomImg) {
const images = await target.getTokenImages();
@ -1745,9 +1894,9 @@ export default class Actor5e extends Actor {
const tokens = this.getActiveTokens(true);
const updates = tokens.map((t) => {
const newTokenData = foundry.utils.deepClone(d.token);
if (!t.data.actorLink) newTokenData.actorData = newActor.data;
newTokenData._id = t.data._id;
newTokenData.actorId = newActor.id;
newTokenData.actorLink = true;
return newTokenData;
});
return canvas.scene?.updateEmbeddedDocuments("Token", updates);
@ -1771,10 +1920,25 @@ export default class Actor5e extends Actor {
const baseActor = game.actors.get(this.token.data.actorId);
const prototypeTokenData = await baseActor.getTokenData();
const tokenUpdate = {actorData: {}};
for (let k of ["width", "height", "scale", "img", "mirrorX", "mirrorY", "tint", "alpha", "lockRotation"]) {
for (let k of [
"width",
"height",
"scale",
"img",
"mirrorX",
"mirrorY",
"tint",
"alpha",
"lockRotation",
"name"
]) {
tokenUpdate[k] = prototypeTokenData[k];
}
return this.token.update(tokenUpdate, {recursive: false});
await this.token.update(tokenUpdate, {recursive: false});
await this.sheet.close();
const actor = this.token.getActor();
actor.sheet.render(true);
return actor;
}
// Obtain a reference to the original actor
@ -1854,6 +2018,45 @@ export default class Actor5e extends Actor {
return type;
}
/* -------------------------------------------- */
/**
* Populate a proficiency object with a `selected` field containing a combination of
* localizable group & individual proficiencies from `value` and the contents of `custom`.
*
* @param {object} data Object containing proficiency data
* @param {Array.<string>} data.value Array of standard proficiency keys
* @param {string} data.custom Semicolon-separated string of custom proficiencies
* @param {string} type "armor", "weapon", or "tool"
*/
static prepareProficiencies(data, type) {
const profs = CONFIG.SW5E[`${type}Proficiencies`];
const itemTypes = CONFIG.SW5E[`${type}Ids`];
let values = [];
if (data.value) {
values = data.value instanceof Array ? data.value : [data.value];
}
data.selected = {};
const pack = game.packs.get(CONFIG.SW5E.sourcePacks.ITEMS);
for (const key of values) {
if (profs[key]) {
data.selected[key] = profs[key];
} else if (itemTypes && itemTypes[key]) {
const item = pack.index.get(itemTypes[key]);
data.selected[key] = item.name;
} else if (type === "tool" && CONFIG.SW5E.vehicleTypes[key]) {
data.selected[key] = CONFIG.SW5E.vehicleTypes[key];
}
}
// Add custom entries
if (data.custom) {
data.custom.split(";").forEach((c, i) => (data.selected[`custom${i + 1}`] = c.trim()));
}
}
/* -------------------------------------------- */
/* DEPRECATED METHODS */
/* -------------------------------------------- */

View file

@ -1,12 +1,16 @@
import Actor5e from "../../entity.js";
import Item5e from "../../../item/entity.js";
import ProficiencySelector from "../../../apps/proficiency-selector.js";
import PropertyAttribution from "../../../apps/property-attribution.js";
import TraitSelector from "../../../apps/trait-selector.js";
import ActorArmorConfig from "../../../apps/actor-armor.js";
import ActorSheetFlags from "../../../apps/actor-flags.js";
import ActorHitDiceConfig from "../../../apps/hit-dice-config.js";
import ActorMovementConfig from "../../../apps/movement-config.js";
import ActorSensesConfig from "../../../apps/senses-config.js";
import ActorTypeConfig from "../../../apps/actor-type.js";
import {SW5E} from "../../../config.js";
import {onManageActiveEffect, prepareActiveEffectCategories} from "../../../effects.js";
import ActiveEffect5e from "../../../active-effect.js";
/**
* Extend the basic ActorSheet class to suppose SW5e-specific logic and functionality.
@ -85,6 +89,7 @@ export default class ActorSheet5e extends ActorSheet {
// The Actor's data
const actorData = this.actor.data.toObject(false);
const source = this.actor.data._source.data;
data.actor = actorData;
data.data = actorData.data;
@ -105,6 +110,7 @@ export default class ActorSheet5e extends ActorSheet {
abl.icon = this._getProficiencyIcon(abl.proficient);
abl.hover = CONFIG.SW5E.proficiencyLevels[abl.proficient];
abl.label = CONFIG.SW5E.abilities[a];
abl.baseProf = source.abilities[a].proficient;
}
// Skills
@ -117,6 +123,7 @@ export default class ActorSheet5e extends ActorSheet {
skl.label = CONFIG.SW5E.starshipSkills[s];
} else {
skl.label = CONFIG.SW5E.skills[s];
skl.baseValue = source.skills[s].value;
}
}
}
@ -134,7 +141,10 @@ export default class ActorSheet5e extends ActorSheet {
this._prepareItems(data);
// Prepare active effects
data.effects = prepareActiveEffectCategories(this.actor.effects);
data.effects = ActiveEffect5e.prepareActiveEffectCategories(this.actor.effects);
// Prepare warnings
data.warnings = this.actor._preparationWarnings;
// Return data to the sheet
return data;
@ -202,6 +212,124 @@ export default class ActorSheet5e extends ActorSheet {
return tags;
}
/* --------------------------------------------- */
/**
* Break down all of the Active Effects affecting a given target property.
* @param {string} target The data property being targeted.
* @return {AttributionDescription[]}
* @protected
*/
_prepareActiveEffectAttributions(target) {
return this.actor.effects.reduce((arr, e) => {
let source = e.sourceName;
if (e.data.origin === this.actor.uuid) source = e.data.label;
if (!source) return arr;
const value = e.data.changes.reduce((n, change) => {
if (change.key !== target || !Number.isNumeric(change.value)) return n;
if (change.mode !== CONST.ACTIVE_EFFECT_MODES.ADD) return n;
return n + Number(change.value);
}, 0);
if (!value) return arr;
arr.push({value, label: source, mode: CONST.ACTIVE_EFFECT_MODES.ADD});
return arr;
}, []);
}
/* -------------------------------------------- */
/**
* Produce a list of armor class attribution objects.
* @param {object} data Actor data to determine the attributions from.
* @return {AttributionDescription[]} List of attribution descriptions.
*/
_prepareArmorClassAttribution(data) {
const ac = data.attributes.ac;
const cfg = CONFIG.SW5E.armorClasses[ac.calc];
const attribution = [];
// Base AC Attribution
switch (ac.calc) {
// Flat AC
case "flat":
return [
{
label: game.i18n.localize("SW5E.ArmorClassFlat"),
mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
value: ac.flat
}
];
// Natural armor
case "natural":
attribution.push({
label: game.i18n.localize("SW5E.ArmorClassNatural"),
mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
value: ac.flat
});
break;
// Equipment-based AC
case "default":
const hasArmor = !!this.actor.armor;
attribution.push({
label: hasArmor ? this.actor.armor.name : game.i18n.localize("SW5E.ArmorClassUnarmored"),
mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
value: hasArmor ? this.actor.armor.data.data.armor.value : 10
});
if (ac.dex !== 0) {
attribution.push({
label: game.i18n.localize("SW5E.AbilityDex"),
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: ac.dex
});
}
break;
// Other AC formula
default:
const formula = ac.calc === "custom" ? ac.formula : cfg.formula;
let base = ac.base;
const dataRgx = new RegExp(/@([a-z.0-9_\-]+)/gi);
for (const [match, term] of formula.matchAll(dataRgx)) {
const value = foundry.utils.getProperty(data, term);
if (term === "attributes.ac.base" || value === 0) continue;
if (Number.isNumeric(value)) base -= Number(value);
attribution.push({
label: match,
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: foundry.utils.getProperty(data, term)
});
}
attribution.unshift({
label: game.i18n.localize("SW5E.PropertyBase"),
mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
value: base
});
break;
}
// Shield
if (ac.shield !== 0)
attribution.push({
label: this.actor.shield?.name ?? game.i18n.localize("SW5E.EquipmentShield"),
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: ac.shield
});
// Bonus
if (ac.bonus !== 0) attribution.push(...this._prepareActiveEffectAttributions("data.attributes.ac.bonus"));
// Cover
if (ac.cover !== 0)
attribution.push({
label: game.i18n.localize("SW5E.Cover"),
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: ac.cover
});
return attribution;
}
/* -------------------------------------------- */
/**
@ -215,10 +343,7 @@ export default class ActorSheet5e extends ActorSheet {
di: CONFIG.SW5E.damageResistanceTypes,
dv: CONFIG.SW5E.damageResistanceTypes,
ci: CONFIG.SW5E.conditionTypes,
languages: CONFIG.SW5E.languages,
armorProf: CONFIG.SW5E.armorProficiencies,
weaponProf: CONFIG.SW5E.weaponProficiencies,
toolProf: CONFIG.SW5E.toolProficiencies
languages: CONFIG.SW5E.languages
};
for (let [t, choices] of Object.entries(map)) {
const trait = traits[t];
@ -238,6 +363,14 @@ export default class ActorSheet5e extends ActorSheet {
}
trait.cssClass = !isObjectEmpty(trait.selected) ? "" : "inactive";
}
// Populate and localize proficiencies
for (const t of ["armor", "weapon", "tool"]) {
const trait = traits[`${t}Prof`];
if (!trait) continue;
Actor5e.prepareProficiencies(trait, t);
trait.cssClass = !isObjectEmpty(trait.selected) ? "" : "inactive";
}
}
/* -------------------------------------------- */
@ -414,6 +547,8 @@ export default class ActorSheet5e extends ActorSheet {
// View Item Sheets
html.find(".item-edit").click(this._onItemEdit.bind(this));
// Property attributions
html.find(".attributable").mouseover(this._onPropertyAttribution.bind(this));
// Editable Only Listeners
if (this.isEditable) {
@ -429,6 +564,7 @@ export default class ActorSheet5e extends ActorSheet {
html.find(".skill-proficiency").on("click contextmenu", this._onCycleSkillProficiency.bind(this));
// Trait Selector
html.find(".proficiency-selector").click(this._onProficiencySelector.bind(this));
html.find(".trait-selector").click(this._onTraitSelector.bind(this));
// Configure Special Flags
@ -446,7 +582,7 @@ export default class ActorSheet5e extends ActorSheet {
html.find(".decrement-class-level").click(this._onDecrementClassLevel.bind(this));
// Active Effect management
html.find(".effect-control").click((ev) => onManageActiveEffect(ev, this.actor));
html.find(".effect-control").click((ev) => ActiveEffect5e.onManageActiveEffect(ev, this.actor));
}
// Owner Only Listeners
@ -474,7 +610,7 @@ export default class ActorSheet5e extends ActorSheet {
/* -------------------------------------------- */
/**
* Iinitialize Item list filters by activating the set of filters which are currently applied
* Initialize Item list filters by activating the set of filters which are currently applied
* @private
*/
_initializeFilterItemList(i, ul) {
@ -517,6 +653,9 @@ export default class ActorSheet5e extends ActorSheet {
const button = event.currentTarget;
let app;
switch (button.dataset.action) {
case "armor":
app = new ActorArmorConfig(this.object);
break;
case "hit-dice":
app = new ActorHitDiceConfig(this.object);
break;
@ -530,7 +669,7 @@ export default class ActorSheet5e extends ActorSheet {
app = new ActorSensesConfig(this.object);
break;
case "type":
new ActorTypeConfig(this.object).render(true);
app = new ActorTypeConfig(this.object);
break;
}
app?.render(true);
@ -545,22 +684,19 @@ export default class ActorSheet5e extends ActorSheet {
*/
_onCycleSkillProficiency(event) {
event.preventDefault();
const field = $(event.currentTarget).siblings('input[type="hidden"]');
const field = event.currentTarget.previousElementSibling;
const skillName = field.parentElement.dataset.skill;
const source = this.actor.data._source.data.skills[skillName];
if (!source) return;
// Get the current level and the array of levels
const level = parseFloat(field.val());
// Cycle to the next or previous skill level
const levels = [0, 1, 0.5, 2];
let idx = levels.indexOf(level);
// Toggle next level - forward on click, backwards on right
if (event.type === "click") {
field.val(levels[idx === levels.length - 1 ? 0 : idx + 1]);
} else if (event.type === "contextmenu") {
field.val(levels[idx === 0 ? levels.length - 1 : idx - 1]);
}
let idx = levels.indexOf(source.value);
const next = idx + (event.type === "click" ? 1 : 3);
field.value = levels[next % 4];
// Update the field value and save the form
this._onSubmit(event);
return this._onSubmit(event);
}
/* -------------------------------------------- */
@ -674,7 +810,12 @@ export default class ActorSheet5e extends ActorSheet {
if (itemData.type === "consumable" && itemData.flags.core?.sourceId) {
const similarItem = this.actor.items.find((i) => {
const sourceId = i.getFlag("core", "sourceId");
return sourceId && sourceId === itemData.flags.core?.sourceId && i.type === "consumable";
return (
sourceId &&
sourceId === itemData.flags.core?.sourceId &&
i.type === "consumable" &&
i.name === itemData.name
);
});
if (similarItem && itemData.name !== "Power Cell") {
// Always create a new powercell instead of increasing quantity
@ -901,6 +1042,29 @@ export default class ActorSheet5e extends ActorSheet {
/* -------------------------------------------- */
/**
* Handle displaying the property attribution tooltip when a property is hovered over.
* @param {Event} event The originating mouse event.
* @private
*/
async _onPropertyAttribution(event) {
const existingTooltip = event.currentTarget.querySelector("div.tooltip");
const property = event.currentTarget.dataset.property;
if (existingTooltip || !property) return;
const data = this.actor.data.data;
let attributions;
switch (property) {
case "attributes.ac":
attributions = this._prepareArmorClassAttribution(data);
break;
}
if (!attributions) return;
const html = await new PropertyAttribution(this.actor, attributions, property).renderTooltip();
event.currentTarget.insertAdjacentElement("beforeend", html[0]);
}
/* -------------------------------------------- */
/**
* Handle rolling an Ability check, either a test or a saving throw
* @param {Event} event The originating click event
@ -957,6 +1121,22 @@ export default class ActorSheet5e extends ActorSheet {
/* -------------------------------------------- */
/**
* Handle spawning the ProficiencySelector application to configure armor, weapon, and tool proficiencies.
* @param {Event} event The click event which originated the selection
* @private
*/
_onProficiencySelector(event) {
event.preventDefault();
const a = event.currentTarget;
const label = a.parentElement.querySelector("label");
const options = {name: a.dataset.target, title: label.innerText, type: a.dataset.type};
if (options.type === "tool") options.sortCategories = true;
return new ProficiencySelector(this.actor, options).render(true);
}
/* -------------------------------------------- */
/**
* Handle spawning the TraitSelector application which allows a checkbox of multiple trait options
* @param {Event} event The click event which originated the selection

View file

@ -62,6 +62,10 @@ export default class ActorSheet5eCharacterNew extends ActorSheet5e {
return [c.data.data.archetype, c.name, c.data.data.levels].filterJoin(" ");
})
.join(", ");
// Weight unit
sheetData["weightUnit"] = game.settings.get("sw5e", "metricWeightUnits")
? game.i18n.localize("SW5E.AbbreviationKgs")
: game.i18n.localize("SW5E.AbbreviationLbs");
// Return data for rendering
return sheetData;

View file

@ -111,9 +111,28 @@ export default class ActorSheet5eNPCNew extends ActorSheet5e {
// Creature Type
data.labels["type"] = this.actor.labels.creatureType;
// Armor Type
data.labels["armorType"] = this.getArmorLabel();
return data;
}
/* -------------------------------------------- */
/**
* Format NPC armor information into a localized string.
* @return {string} Formatted armor label.
*/
getArmorLabel() {
const ac = this.actor.data.data.attributes.ac;
const label = [];
if (ac.calc === "default") label.push(this.actor.armor?.name || game.i18n.localize("SW5E.ArmorClassUnarmored"));
else label.push(game.i18n.localize(CONFIG.SW5E.armorClasses[ac.calc].label));
if (this.actor.shield) label.push(this.actor.shield.name);
return label.filterJoin(", ");
}
/* -------------------------------------------- */
/* Object Updates */
/* -------------------------------------------- */

View file

@ -13,7 +13,7 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
classes: ["sw5e", "sheet", "actor", "vehicle"],
width: 605,
width: 720,
height: 680
});
}
@ -47,10 +47,17 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
_computeEncumbrance(totalWeight, actorData) {
// Compute currency weight
const totalCoins = Object.values(actorData.data.currency).reduce((acc, denom) => acc + denom, 0);
totalWeight += totalCoins / CONFIG.SW5E.encumbrance.currencyPerWeight;
const currencyPerWeight = game.settings.get("sw5e", "metricWeightUnits")
? CONFIG.SW5E.encumbrance.currencyPerWeight.metric
: CONFIG.SW5E.encumbrance.currencyPerWeight.imperial;
totalWeight += totalCoins / currencyPerWeight;
// Vehicle weights are an order of magnitude greater.
totalWeight /= CONFIG.SW5E.encumbrance.vehicleWeightMultiplier;
totalWeight /= game.settings.get("sw5e", "metricWeightUnits")
? CONFIG.SW5E.encumbrance.vehicleWeightMultiplier.metric
: CONFIG.SW5E.encumbrance.vehicleWeightMultiplier.imperial;
// Compute overall encumbrance
const max = actorData.data.attributes.capacity.cargo;
@ -80,12 +87,10 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
// Handle crew actions
if (item.type === "feat" && item.data.activation.type === "crew") {
item.crew = item.data.activation.cost;
item.cover = game.i18n.localize(`SW5E.${item.data.cover ? "CoverTotal" : "None"}`);
if (item.data.cover === 0.5) item.cover = "½";
else if (item.data.cover === 0.75) item.cover = "¾";
else if (item.data.cover === null) item.cover = "—";
if (item.crew < 1 || item.crew === null) item.crew = "—";
}
// Prepare vehicle weapons
@ -114,7 +119,8 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
{
label: game.i18n.localize("SW5E.Quantity"),
css: "item-qty",
property: "data.quantity"
property: "data.quantity",
editable: "Number"
},
{
label: game.i18n.localize("SW5E.AC"),
@ -138,14 +144,10 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
actions: {
label: game.i18n.localize("SW5E.ActionPl"),
items: [],
hasActions: true,
crewable: true,
dataset: {"type": "feat", "activation.type": "crew"},
columns: [
{
label: game.i18n.localize("SW5E.VehicleCrew"),
css: "item-crew",
property: "crew"
},
{
label: game.i18n.localize("SW5E.Cover"),
css: "item-cover",
@ -179,6 +181,13 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
}
};
data.items.forEach((item) => {
item.hasUses = item.data.uses && item.data.uses.max > 0;
item.isOnCooldown =
item.data.recharge && !!item.data.recharge.value && item.data.recharge.charged === false;
item.isDepleted = item.isOnCooldown && item.data.uses.per && item.data.uses.value > 0;
});
const cargo = {
crew: {
label: game.i18n.localize("SW5E.VehicleCrew"),
@ -284,6 +293,10 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
.click((evt) => evt.target.select())
.change(this._onCargoRowChange.bind(this));
html.find(".item-qty:not(.cargo) input")
.click((evt) => evt.target.select())
.change(this._onQtyChange.bind(this));
if (this.actor.data.data.attributes.actions.stations) {
html.find(".counter.actions, .counter.action-thresholds").hide();
}
@ -416,6 +429,24 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
/* -------------------------------------------- */
/**
* Special handling for editing quantity value of equipment and weapons inside the features tab.
* @param event {Event}
* @returns {Promise<Item>}
* @private
*/
_onQtyChange(event) {
event.preventDefault();
const itemID = event.currentTarget.closest(".item").dataset.itemId;
const item = this.actor.items.get(itemID);
const qty = parseInt(event.currentTarget.value);
event.currentTarget.value = qty;
return item.update({"data.quantity": qty});
}
/* -------------------------------------------- */
/**
* Handle toggling an item's crewed status.
* @param event {Event}

View file

@ -1,4 +1,7 @@
import Actor5e from "../../entity.js";
import Item5e from "../../../item/entity.js";
import ProficiencySelector from "../../../apps/proficiency-selector.js";
import PropertyAttribution from "../../../apps/property-attribution.js";
import TraitSelector from "../../../apps/trait-selector.js";
import ActorSheetFlags from "../../../apps/actor-flags.js";
import ActorHitDiceConfig from "../../../apps/hit-dice-config.js";
@ -6,7 +9,7 @@ import ActorMovementConfig from "../../../apps/movement-config.js";
import ActorSensesConfig from "../../../apps/senses-config.js";
import ActorTypeConfig from "../../../apps/actor-type.js";
import {SW5E} from "../../../config.js";
import {onManageActiveEffect, prepareActiveEffectCategories} from "../../../effects.js";
import ActiveEffect5e from "../../../active-effect.js";
/**
* Extend the basic ActorSheet class to suppose SW5e-specific logic and functionality.
@ -82,6 +85,7 @@ export default class ActorSheet5e extends ActorSheet {
// The Actor's data
const actorData = this.actor.data.toObject(false);
const source = this.actor.data._source.data;
data.actor = actorData;
data.data = actorData.data;
@ -102,6 +106,7 @@ export default class ActorSheet5e extends ActorSheet {
abl.icon = this._getProficiencyIcon(abl.proficient);
abl.hover = CONFIG.SW5E.proficiencyLevels[abl.proficient];
abl.label = CONFIG.SW5E.abilities[a];
abl.baseProf = source.abilities[a].proficient;
}
// Skills
@ -111,6 +116,7 @@ export default class ActorSheet5e extends ActorSheet {
skl.icon = this._getProficiencyIcon(skl.value);
skl.hover = CONFIG.SW5E.proficiencyLevels[skl.value];
skl.label = CONFIG.SW5E.skills[s];
skl.baseValue = source.skills[s].value;
}
}
@ -127,7 +133,10 @@ export default class ActorSheet5e extends ActorSheet {
this._prepareItems(data);
// Prepare active effects
data.effects = prepareActiveEffectCategories(this.actor.effects);
data.effects = ActiveEffect5e.prepareActiveEffectCategories(this.actor.effects);
// Prepare warnings
data.warnings = this.actor._preparationWarnings;
// Return data to the sheet
return data;
@ -195,6 +204,124 @@ export default class ActorSheet5e extends ActorSheet {
return tags;
}
/* --------------------------------------------- */
/**
* Break down all of the Active Effects affecting a given target property.
* @param {string} target The data property being targeted.
* @return {AttributionDescription[]}
* @protected
*/
_prepareActiveEffectAttributions(target) {
return this.actor.effects.reduce((arr, e) => {
let source = e.sourceName;
if (e.data.origin === this.actor.uuid) source = e.data.label;
if (!source) return arr;
const value = e.data.changes.reduce((n, change) => {
if (change.key !== target || !Number.isNumeric(change.value)) return n;
if (change.mode !== CONST.ACTIVE_EFFECT_MODES.ADD) return n;
return n + Number(change.value);
}, 0);
if (!value) return arr;
arr.push({value, label: source, mode: CONST.ACTIVE_EFFECT_MODES.ADD});
return arr;
}, []);
}
/* -------------------------------------------- */
/**
* Produce a list of armor class attribution objects.
* @param {object} data Actor data to determine the attributions from.
* @return {AttributionDescription[]} List of attribution descriptions.
*/
_prepareArmorClassAttribution(data) {
const ac = data.attributes.ac;
const cfg = CONFIG.SW5E.armorClasses[ac.calc];
const attribution = [];
// Base AC Attribution
switch (ac.calc) {
// Flat AC
case "flat":
return [
{
label: game.i18n.localize("SW5E.ArmorClassFlat"),
mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
value: ac.flat
}
];
// Natural armor
case "natural":
attribution.push({
label: game.i18n.localize("SW5E.ArmorClassNatural"),
mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
value: ac.flat
});
break;
// Equipment-based AC
case "default":
const hasArmor = !!this.actor.armor;
attribution.push({
label: hasArmor ? this.actor.armor.name : game.i18n.localize("SW5E.ArmorClassUnarmored"),
mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
value: hasArmor ? this.actor.armor.data.data.armor.value : 10
});
if (ac.dex !== 0) {
attribution.push({
label: game.i18n.localize("SW5E.AbilityDex"),
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: ac.dex
});
}
break;
// Other AC formula
default:
const formula = ac.calc === "custom" ? ac.formula : cfg.formula;
let base = ac.base;
const dataRgx = new RegExp(/@([a-z.0-9_\-]+)/gi);
for (const [match, term] of formula.matchAll(dataRgx)) {
const value = foundry.utils.getProperty(data, term);
if (term === "attributes.ac.base" || value === 0) continue;
if (Number.isNumeric(value)) base -= Number(value);
attribution.push({
label: match,
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: foundry.utils.getProperty(data, term)
});
}
attribution.unshift({
label: game.i18n.localize("SW5E.PropertyBase"),
mode: CONST.ACTIVE_EFFECT_MODES.OVERRIDE,
value: base
});
break;
}
// Shield
if (ac.shield !== 0)
attribution.push({
label: this.actor.shield?.name ?? game.i18n.localize("SW5E.EquipmentShield"),
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: ac.shield
});
// Bonus
if (ac.bonus !== 0) attribution.push(...this._prepareActiveEffectAttributions("data.attributes.ac.bonus"));
// Cover
if (ac.cover !== 0)
attribution.push({
label: game.i18n.localize("SW5E.Cover"),
mode: CONST.ACTIVE_EFFECT_MODES.ADD,
value: ac.cover
});
return attribution;
}
/* -------------------------------------------- */
/**
@ -208,10 +335,7 @@ export default class ActorSheet5e extends ActorSheet {
di: CONFIG.SW5E.damageResistanceTypes,
dv: CONFIG.SW5E.damageResistanceTypes,
ci: CONFIG.SW5E.conditionTypes,
languages: CONFIG.SW5E.languages,
armorProf: CONFIG.SW5E.armorProficiencies,
weaponProf: CONFIG.SW5E.weaponProficiencies,
toolProf: CONFIG.SW5E.toolProficiencies
languages: CONFIG.SW5E.languages
};
for (let [t, choices] of Object.entries(map)) {
const trait = traits[t];
@ -231,6 +355,14 @@ export default class ActorSheet5e extends ActorSheet {
}
trait.cssClass = !isObjectEmpty(trait.selected) ? "" : "inactive";
}
// Populate and localize proficiencies
for (const t of ["armor", "weapon", "tool"]) {
const trait = traits[`${t}Prof`];
if (!trait) continue;
Actor5e.prepareProficiencies(trait, t);
trait.cssClass = !isObjectEmpty(trait.selected) ? "" : "inactive";
}
}
/* -------------------------------------------- */
@ -418,6 +550,9 @@ export default class ActorSheet5e extends ActorSheet {
// View Item Sheets
html.find(".item-edit").click(this._onItemEdit.bind(this));
// Property attributions
html.find(".attributable").mouseover(this._onPropertyAttribution.bind(this));
// Editable Only Listeners
if (this.isEditable) {
// Input focus and update
@ -432,6 +567,7 @@ export default class ActorSheet5e extends ActorSheet {
html.find(".skill-proficiency").on("click contextmenu", this._onCycleSkillProficiency.bind(this));
// Trait Selector
html.find(".proficiency-selector").click(this._onProficiencySelector.bind(this));
html.find(".trait-selector").click(this._onTraitSelector.bind(this));
// Configure Special Flags
@ -446,7 +582,7 @@ export default class ActorSheet5e extends ActorSheet {
html.find(".slot-max-override").click(this._onPowerSlotOverride.bind(this));
// Active Effect management
html.find(".effect-control").click((ev) => onManageActiveEffect(ev, this.actor));
html.find(".effect-control").click((ev) => ActiveEffect5e.onManageActiveEffect(ev, this.actor));
}
// Owner Only Listeners
@ -474,7 +610,7 @@ export default class ActorSheet5e extends ActorSheet {
/* -------------------------------------------- */
/**
* Iinitialize Item list filters by activating the set of filters which are currently applied
* Initialize Item list filters by activating the set of filters which are currently applied
* @private
*/
_initializeFilterItemList(i, ul) {
@ -517,6 +653,9 @@ export default class ActorSheet5e extends ActorSheet {
const button = event.currentTarget;
let app;
switch (button.dataset.action) {
case "armor":
app = new ActorArmorConfig(this.object);
break;
case "hit-dice":
app = new ActorHitDiceConfig(this.object);
break;
@ -530,7 +669,7 @@ export default class ActorSheet5e extends ActorSheet {
app = new ActorSensesConfig(this.object);
break;
case "type":
new ActorTypeConfig(this.object).render(true);
app = new ActorTypeConfig(this.object);
break;
}
app?.render(true);
@ -545,22 +684,19 @@ export default class ActorSheet5e extends ActorSheet {
*/
_onCycleSkillProficiency(event) {
event.preventDefault();
const field = $(event.currentTarget).siblings('input[type="hidden"]');
const field = event.currentTarget.previousElementSibling;
const skillName = field.parentElement.dataset.skill;
const source = this.actor.data._source.data.skills[skillName];
if (!source) return;
// Get the current level and the array of levels
const level = parseFloat(field.val());
// Cycle to the next or previous skill level
const levels = [0, 1, 0.5, 2];
let idx = levels.indexOf(level);
// Toggle next level - forward on click, backwards on right
if (event.type === "click") {
field.val(levels[idx === levels.length - 1 ? 0 : idx + 1]);
} else if (event.type === "contextmenu") {
field.val(levels[idx === 0 ? levels.length - 1 : idx - 1]);
}
let idx = levels.indexOf(source.value);
const next = idx + (event.type === "click" ? 1 : 3);
field.value = levels[next % 4];
// Update the field value and save the form
this._onSubmit(event);
return this._onSubmit(event);
}
/* -------------------------------------------- */
@ -675,7 +811,12 @@ export default class ActorSheet5e extends ActorSheet {
if (itemData.type === "consumable" && itemData.flags.core?.sourceId) {
const similarItem = this.actor.items.find((i) => {
const sourceId = i.getFlag("core", "sourceId");
return sourceId && sourceId === itemData.flags.core?.sourceId && i.type === "consumable";
return (
sourceId &&
sourceId === itemData.flags.core?.sourceId &&
i.type === "consumable" &&
i.name === itemData.name
);
});
if (similarItem) {
return similarItem.update({
@ -832,6 +973,29 @@ export default class ActorSheet5e extends ActorSheet {
/* -------------------------------------------- */
/**
* Handle displaying the property attribution tooltip when a property is hovered over.
* @param {Event} event The originating mouse event.
* @private
*/
async _onPropertyAttribution(event) {
const existingTooltip = event.currentTarget.querySelector("div.tooltip");
const property = event.currentTarget.dataset.property;
if (existingTooltip || !property) return;
const data = this.actor.data.data;
let attributions;
switch (property) {
case "attributes.ac":
attributions = this._prepareArmorClassAttribution(data);
break;
}
if (!attributions) return;
const html = await new PropertyAttribution(this.actor, attributions, property).renderTooltip();
event.currentTarget.insertAdjacentElement("beforeend", html[0]);
}
/* -------------------------------------------- */
/**
* Handle rolling an Ability check, either a test or a saving throw
* @param {Event} event The originating click event
@ -888,6 +1052,22 @@ export default class ActorSheet5e extends ActorSheet {
/* -------------------------------------------- */
/**
* Handle spawning the ProficiencySelector application to configure armor, weapon, and tool proficiencies.
* @param {Event} event The click event which originated the selection
* @private
*/
_onProficiencySelector(event) {
event.preventDefault();
const a = event.currentTarget;
const label = a.parentElement.querySelector("label");
const options = {name: a.dataset.target, title: label.innerText, type: a.dataset.type};
if (options.type === "tool") options.sortCategories = true;
return new ProficiencySelector(this.actor, options).render(true);
}
/* -------------------------------------------- */
/**
* Handle spawning the TraitSelector application which allows a checkbox of multiple trait options
* @param {Event} event The click event which originated the selection

View file

@ -51,6 +51,11 @@ export default class ActorSheet5eCharacter extends ActorSheet5e {
})
.join(", ");
// Weight unit
sheetData["weightUnit"] = game.settings.get("sw5e", "metricWeightUnits")
? game.i18n.localize("SW5E.AbbreviationKgs")
: game.i18n.localize("SW5E.AbbreviationLbs");
// Return data for rendering
return sheetData;
}

View file

@ -96,9 +96,28 @@ export default class ActorSheet5eNPC extends ActorSheet5e {
// Creature Type
data.labels["type"] = this.actor.labels.creatureType;
// Armor Type
data.labels["armorType"] = this.getArmorLabel();
return data;
}
/* -------------------------------------------- */
/**
* Format NPC armor information into a localized string.
* @return {string} Formatted armor label.
*/
getArmorLabel() {
const ac = this.actor.data.data.attributes.ac;
const label = [];
if (ac.calc === "default") label.push(this.actor.armor?.name || game.i18n.localize("SW5E.ArmorClassUnarmored"));
else label.push(game.i18n.localize(CONFIG.SW5E.armorClasses[ac.calc].label));
if (this.actor.shield) label.push(this.actor.shield.name);
return label.filterJoin(", ");
}
/* -------------------------------------------- */
/* Object Updates */
/* -------------------------------------------- */

View file

@ -13,7 +13,7 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
classes: ["sw5e", "sheet", "actor", "vehicle"],
width: 605,
width: 720,
height: 680
});
}
@ -47,10 +47,17 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
_computeEncumbrance(totalWeight, actorData) {
// Compute currency weight
const totalCoins = Object.values(actorData.data.currency).reduce((acc, denom) => acc + denom, 0);
totalWeight += totalCoins / CONFIG.SW5E.encumbrance.currencyPerWeight;
const currencyPerWeight = game.settings.get("sw5e", "metricWeightUnits")
? CONFIG.SW5E.encumbrance.currencyPerWeight.metric
: CONFIG.SW5E.encumbrance.currencyPerWeight.imperial;
totalWeight += totalCoins / currencyPerWeight;
// Vehicle weights are an order of magnitude greater.
totalWeight /= CONFIG.SW5E.encumbrance.vehicleWeightMultiplier;
totalWeight /= game.settings.get("sw5e", "metricWeightUnits")
? CONFIG.SW5E.encumbrance.vehicleWeightMultiplier.metric
: CONFIG.SW5E.encumbrance.vehicleWeightMultiplier.imperial;
// Compute overall encumbrance
const max = actorData.data.attributes.capacity.cargo;
@ -80,12 +87,10 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
// Handle crew actions
if (item.type === "feat" && item.data.activation.type === "crew") {
item.crew = item.data.activation.cost;
item.cover = game.i18n.localize(`SW5E.${item.data.cover ? "CoverTotal" : "None"}`);
if (item.data.cover === 0.5) item.cover = "½";
else if (item.data.cover === 0.75) item.cover = "¾";
else if (item.data.cover === null) item.cover = "—";
if (item.crew < 1 || item.crew === null) item.crew = "—";
}
// Prepare vehicle weapons
@ -114,7 +119,8 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
{
label: game.i18n.localize("SW5E.Quantity"),
css: "item-qty",
property: "data.quantity"
property: "data.quantity",
editable: "Number"
},
{
label: game.i18n.localize("SW5E.AC"),
@ -138,14 +144,10 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
actions: {
label: game.i18n.localize("SW5E.ActionPl"),
items: [],
hasActions: true,
crewable: true,
dataset: {"type": "feat", "activation.type": "crew"},
columns: [
{
label: game.i18n.localize("SW5E.VehicleCrew"),
css: "item-crew",
property: "crew"
},
{
label: game.i18n.localize("SW5E.Cover"),
css: "item-cover",
@ -179,6 +181,13 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
}
};
data.items.forEach((item) => {
item.hasUses = item.data.uses && item.data.uses.max > 0;
item.isOnCooldown =
item.data.recharge && !!item.data.recharge.value && item.data.recharge.charged === false;
item.isDepleted = item.isOnCooldown && item.data.uses.per && item.data.uses.value > 0;
});
const cargo = {
crew: {
label: game.i18n.localize("SW5E.VehicleCrew"),
@ -284,6 +293,10 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
.click((evt) => evt.target.select())
.change(this._onCargoRowChange.bind(this));
html.find(".item-qty:not(.cargo) input")
.click((evt) => evt.target.select())
.change(this._onQtyChange.bind(this));
if (this.actor.data.data.attributes.actions.stations) {
html.find(".counter.actions, .counter.action-thresholds").hide();
}
@ -416,6 +429,24 @@ export default class ActorSheet5eVehicle extends ActorSheet5e {
/* -------------------------------------------- */
/**
* Special handling for editing quantity value of equipment and weapons inside the features tab.
* @param event {Event}
* @returns {Promise<Item>}
* @private
*/
_onQtyChange(event) {
event.preventDefault();
const itemID = event.currentTarget.closest(".item").dataset.itemId;
const item = this.actor.items.get(itemID);
const qty = parseInt(event.currentTarget.value);
event.currentTarget.value = qty;
return item.update({"data.quantity": qty});
}
/* -------------------------------------------- */
/**
* Handle toggling an item's crewed status.
* @param event {Event}

View file

@ -0,0 +1,94 @@
/**
* Interface for managing a character's armor calculation.
* @extends {DocumentSheet}
*/
export default class ActorArmorConfig extends DocumentSheet {
/** @inheritdoc */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
id: "actor-armor-config",
classes: ["sw5e", "actor-armor-config"],
template: "systems/sw5e/templates/apps/actor-armor.html",
width: 320,
height: "auto"
});
}
/* -------------------------------------------- */
/** @inheritdoc */
get title() {
return `${game.i18n.localize("SW5E.ArmorConfig")}: ${this.document.name}`;
}
/* -------------------------------------------- */
/** @inheritdoc */
async getData() {
// Get actor AC data
const actorData = foundry.utils.deepClone(this.object.data.data);
const ac = foundry.utils.getProperty(actorData, "attributes.ac");
// Get configuration data for the calculation mode
let cfg = CONFIG.SW5E.armorClasses[ac.calc];
if (!cfg) {
ac.calc = "flat";
cfg = CONFIG.SW5E.armorClasses.flat;
}
// Return context data
return {
ac: ac,
calculations: CONFIG.SW5E.armorClasses,
value: this.object._computeArmorClass(actorData).value,
valueDisabled: !["flat", "natural"].includes(ac.calc),
formula: ac.calc === "custom" ? ac.formula : cfg.formula,
formulaDisabled: ac.calc !== "custom"
};
}
/* -------------------------------------------- */
/** @inheritdoc */
async _updateObject(event, formData) {
const ac = foundry.utils.expandObject(formData).ac;
return this.object.update({"data.attributes.ac": ac});
}
/* -------------------------------------------- */
/* Event Listeners and Handlers */
/* -------------------------------------------- */
/** @inheritdoc */
async _onChangeInput(event) {
await super._onChangeInput(event);
// Reference actor data
let actorData = this.object.toObject(false);
let ac = actorData.data.attributes.ac;
// Reference form data
const calc = this.form["ac.calc"].value;
const cfg = CONFIG.SW5E.armorClasses[calc];
const enableFlat = ["flat", "natural"].includes(calc);
// Handle changes to the calculation mode specifically
let formula = this.form["ac.formula"].value;
let flat = this.form["ac.flat"].value;
if (event.currentTarget.name === "ac.calc") {
formula = calc === "custom" ? ac.formula : cfg.formula;
if (enableFlat) flat = ac.flat;
}
// Recompute effective AC
actorData = foundry.utils.mergeObject(actorData, {"data.attributes.ac": {calc, formula}});
if (enableFlat) actorData.data.attributes.ac.flat = flat;
ac = this.object._computeArmorClass(actorData.data);
// Update fields
this.form["ac.formula"].value = ac.formula;
this.form["ac.formula"].disabled = calc !== "custom";
this.form["ac.flat"].value = enableFlat ? ac.flat : ac.value;
this.form["ac.flat"].disabled = !enableFlat;
}
}

View file

@ -99,7 +99,7 @@ export default class ActorSheetFlags extends DocumentSheet {
{name: "data.bonuses.power.techDC", label: "SW5E.BonusTechPowerDC"}
];
for (let b of bonuses) {
b.value = getProperty(this.object._data, b.name) || "";
b.value = getProperty(this.object.data._source, b.name) || "";
}
return bonuses;
}
@ -119,7 +119,7 @@ export default class ActorSheetFlags extends DocumentSheet {
for (let [k, v] of Object.entries(flags)) {
if ([undefined, null, "", false, 0].includes(v)) {
delete flags[k];
if (hasProperty(actor._data.flags, `sw5e.${k}`)) {
if (hasProperty(actor.data._source.flags, `sw5e.${k}`)) {
unset = true;
flags[`-=${k}`] = null;
}

View file

@ -0,0 +1,120 @@
import TraitSelector from "./trait-selector.js";
/**
* An application for selecting proficiencies with categories that can contain children.
*
* @extends {TraitSelector}
*/
export default class ProficiencySelector extends TraitSelector {
/** @inheritdoc */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
title: "Actor Proficiency Selection",
type: "",
sortCategories: false
});
}
/* -------------------------------------------- */
/** @inheritdoc */
async getData() {
const attr = foundry.utils.getProperty(this.object.data, this.attribute);
const value = this.options.valueKey ? foundry.utils.getProperty(attr, this.options.valueKey) ?? [] : attr;
this.options.choices = CONFIG.SW5E[`${this.options.type}Proficiencies`];
const data = super.getData();
const pack = game.packs.get(CONFIG.SW5E.sourcePacks.ITEMS);
const ids = CONFIG.SW5E[`${this.options.type}Ids`];
const map = CONFIG.SW5E[`${this.options.type}ProficienciesMap`];
if (ids !== undefined) {
const typeProperty = this.options.type !== "armor" ? `${this.options.type}Type` : `armor.type`;
for (const [key, id] of Object.entries(ids)) {
const item = await pack.getDocument(id);
let type = foundry.utils.getProperty(item.data.data, typeProperty);
if (map && map[type]) type = map[type];
const entry = {
label: item.name,
chosen: attr ? value.includes(key) : false
};
if (data.choices[type] === undefined) {
data.choices[key] = entry;
} else {
if (data.choices[type].children === undefined) {
data.choices[type].children = {};
}
data.choices[type].children[key] = entry;
}
}
}
if (this.options.type === "tool") {
data.choices["vehicle"].children = Object.entries(CONFIG.SW5E.vehicleTypes).reduce((obj, [key, label]) => {
obj[key] = {
label: label,
chosen: attr ? value.includes(key) : false
};
return obj;
}, {});
}
if (this.options.sortCategories) data.choices = this._sortObject(data.choices);
for (const category of Object.values(data.choices)) {
if (!category.children) continue;
category.children = this._sortObject(category.children);
}
return data;
}
/* -------------------------------------------- */
/**
* Take the provided object and sort by the "label" property.
*
* @param {object} object Object to be sorted.
* @return {object} Sorted object.
* @private
*/
_sortObject(object) {
return Object.fromEntries(Object.entries(object).sort((lhs, rhs) => lhs[1].label.localeCompare(rhs[1].label)));
}
/* -------------------------------------------- */
/** @inheritdoc */
activateListeners(html) {
super.activateListeners(html);
for (const checkbox of html[0].querySelectorAll("input[type='checkbox']")) {
if (checkbox.checked) this._onToggleCategory(checkbox);
}
}
/* -------------------------------------------- */
/** @inheritdoc */
async _onChangeInput(event) {
super._onChangeInput(event);
if (event.target.tagName === "INPUT") this._onToggleCategory(event.target);
}
/* -------------------------------------------- */
/**
* Enable/disable all children when a category is checked.
*
* @param {HTMLElement} checkbox Checkbox that was changed.
* @private
*/
_onToggleCategory(checkbox) {
const children = checkbox.closest("li")?.querySelector("ol");
if (!children) return;
for (const child of children.querySelectorAll("input[type='checkbox']")) {
child.checked = child.disabled = checkbox.checked;
}
}
}

View file

@ -0,0 +1,92 @@
/**
* Description for a single part of a property attribution.
*
* @typedef {object} AttributionDescription
* @property {string} label Descriptive label that will be displayed. If the label is in the form
* of an @ property, the system will try to turn it into a human-readable label.
* @property {number} mode Application mode for this step as defined in
* [CONST.ACTIVE_EFFECT_MODES](https://foundryvtt.com/api/module-constants.html#.ACTIVE_EFFECT_MODES).
* @property {number} value Value of this step.
*/
/**
* Interface for viewing what factors went into determining a specific property.
*
* @extends {DocumentSheet}
*/
export default class PropertyAttribution extends Application {
/**
* @param {Document} object The Document that owns the property being attributed.
* @param {AttributionDescription[]} attributions An array of all the attribution data.
* @param {string} property Dot separated path to the property.
*/
constructor(object, attributions, property, options = {}) {
super(options);
this.object = object;
this.attributions = attributions;
this.property = property;
}
/* -------------------------------------------- */
/** @inheritdoc */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
id: "property-attribution",
classes: ["sw5e", "property-attribution"],
template: "systems/sw5e/templates/apps/property-attribution.html",
width: 320,
height: "auto"
});
}
/* -------------------------------------------- */
/**
* Render this view as a tooltip rather than a whole window.
* @return {jQuery} HTML of the rendered tooltip.
*/
async renderTooltip() {
const data = this.getData(this.options);
let html = await this._renderInner(data);
html[0].classList.add("tooltip");
return html;
}
/* -------------------------------------------- */
getData() {
const property = foundry.utils.getProperty(this.object.data.data, this.property);
let total;
if (Number.isNumeric(property)) {
total = property;
} else if (typeof property === "object" && Number.isNumeric(property.value)) {
total = property.value;
}
const sources = foundry.utils.duplicate(this.attributions);
return {
sources: sources.map((entry) => {
if (entry.label.startsWith("@")) {
entry.label = this.getPropertyLabel(entry.label.slice(1));
}
if (entry.mode === CONST.ACTIVE_EFFECT_MODES.ADD && entry.value < 0) {
entry.negative = true;
entry.value = entry.value * -1;
}
return entry;
}),
total: total
};
}
/* -------------------------------------------- */
getPropertyLabel(property) {
const parts = property.split(".");
if (parts[0] === "abilities" && parts[1]) {
return CONFIG.SW5E.abilities[parts[1]];
}
return property;
}
}

View file

@ -23,6 +23,13 @@ export default class TraitSelector extends DocumentSheet {
/* -------------------------------------------- */
/** @inheritdoc */
get title() {
return this.options.title || super.title;
}
/* -------------------------------------------- */
/**
* Return a reference to the target attribute
* @type {string}
@ -37,8 +44,8 @@ export default class TraitSelector extends DocumentSheet {
getData() {
const attr = foundry.utils.getProperty(this.object.data, this.attribute);
const o = this.options;
const value = o.valueKey ? attr[o.valueKey] ?? [] : attr;
const custom = o.customKey ? attr[o.customKey] ?? "" : "";
const value = o.valueKey ? foundry.utils.getProperty(attr, o.valueKey) ?? [] : attr;
const custom = o.customKey ? foundry.utils.getProperty(attr, o.customKey) ?? "" : "";
// Populate choices
const choices = Object.entries(o.choices).reduce((obj, e) => {

View file

@ -166,11 +166,14 @@ SW5E.weaponIds = {
"whip": "QKTyxoO0YDnAsbYe"
};
*/
/* -------------------------------------------- */
SW5E.toolProficiencies = {
/**
* The categories into which Tool items can be grouped.
*
* @enum {string}
*/
SW5E.toolTypes = {
armor: "SW5E.ToolArmormech",
arms: "SW5E.ToolArmstech",
arti: "SW5E.ToolArtificer",
@ -199,7 +202,16 @@ SW5E.toolProficiencies = {
secur: "SW5E.ToolSecurityKit",
slic: "SW5E.ToolSlicerKit",
spice: "SW5E.ToolSpiceKit",
music: "SW5E.ToolMusicalInstrument",
music: "SW5E.ToolMusicalInstrument"
};
/**
* The categories of tool proficiencies that a character can gain.
*
* @enum {string}
*/
SW5E.toolProficiencies = {
...SW5E.toolTypes,
vehicle: "SW5E.ToolVehicle"
};
@ -211,41 +223,7 @@ SW5E.toolProficiencies = {
*
* @enum {string}
SW5E.toolIds = {
"alchemist": "SztwZhbhZeCqyAes",
"bagpipes": "yxHi57T5mmVt0oDr",
"brewer": "Y9S75go1hLMXUD48",
"calligrapher": "jhjo20QoiD5exf09",
"card": "YwlHI3BVJapz4a3E",
"carpenter": "8NS6MSOdXtUqD7Ib",
"cartographer": "fC0lFK8P4RuhpfaU",
"cobbler": "hM84pZnpCqKfi8XH",
"cook": "Gflnp29aEv5Lc1ZM",
"dice": "iBuTM09KD9IoM5L8",
"disg": "IBhDAr7WkhWPYLVn",
"drum": "69Dpr25pf4BjkHKb",
"dulcimer": "NtdDkjmpdIMiX7I2",
"flute": "eJOrPcAz9EcquyRQ",
"forg": "cG3m4YlHfbQlLEOx",
"glassblower": "rTbVrNcwApnuTz5E",
"herb": "i89okN7GFTWHsvPy",
"horn": "aa9KuBy4dst7WIW9",
"jeweler": "YfBwELTgPFHmQdHh",
"leatherworker": "PUMfwyVUbtyxgYbD",
"lute": "qBydtUUIkv520DT7",
"lyre": "EwG1EtmbgR3bM68U",
"mason": "skUih6tBvcBbORzA",
"navg": "YHCmjsiXxZ9UdUhU",
"painter": "ccm5xlWhx74d6lsK",
"panflute": "G5m5gYIx9VAUWC3J",
"pois": "il2GNi8C0DvGLL9P",
"potter": "hJS8yEVkqgJjwfWa",
"shawm": "G3cqbejJpfB91VhP",
"smith": "KndVe2insuctjIaj",
"thief": "woWZ1sO5IUVGzo58",
"tinker": "0d08g1i5WXnNrCNA",
"viol": "baoe3U5BfMMMxhCU",
"weaver": "ap9prThUB2y9lDyj",
"woodcarver": "xKErqkLo4ASYr5EP",
};
*/
@ -372,6 +350,21 @@ SW5E.itemCapacityTypes = {
/* -------------------------------------------- */
/**
* List of various item rarities.
* @enum {String}
*/
SW5E.itemRarity = {
common: "SW5E.ItemRarityCommon",
uncommon: "SW5E.ItemRarityUncommon",
rare: "SW5E.ItemRarityRare",
veryRare: "SW5E.ItemRarityVeryRare",
legendary: "SW5E.ItemRarityLegendary",
artifact: "SW5E.ItemRarityArtifact"
};
/* -------------------------------------------- */
/**
* Enumerate the lengths of time over which an item can have limited use ability
* @type {Object}
@ -387,25 +380,46 @@ SW5E.limitedUsePeriods = {
/* -------------------------------------------- */
/**
* Specific equipment types that modify base AC
* @type {object}
*/
SW5E.armorTypes = {
light: "SW5E.EquipmentLight",
medium: "SW5E.EquipmentMedium",
heavy: "SW5E.EquipmentHeavy",
natural: "SW5E.EquipmentNatural",
shield: "SW5E.EquipmentShield"
};
/* -------------------------------------------- */
/**
* The set of equipment types for armor, clothing, and other objects which can be worn by the character
* @type {Object}
*/
SW5E.equipmentTypes = {
light: "SW5E.EquipmentLight",
medium: "SW5E.EquipmentMedium",
heavy: "SW5E.EquipmentHeavy",
hyper: "SW5E.EquipmentHyperdrive",
bonus: "SW5E.EquipmentBonus",
natural: "SW5E.EquipmentNatural",
powerc: "SW5E.EquipmentPowerCoupling",
reactor: "SW5E.EquipmentReactor",
shield: "SW5E.EquipmentShield",
clothing: "SW5E.EquipmentClothing",
trinket: "SW5E.EquipmentTrinket",
ssarmor: "SW5E.EquipmentStarshipArmor",
ssshield: "SW5E.EquipmentStarshipShield",
vehicle: "SW5E.EquipmentVehicle"
vehicle: "SW5E.EquipmentVehicle",
...SW5E.armorTypes
};
/* -------------------------------------------- */
/**
* The various types of vehicles in which characters can be proficient.
* @enum {string}
*/
SW5E.vehicleTypes = {
air: "SW5E.VehicleTypeAir",
land: "SW5E.VehicleTypeLand",
water: "SW5E.VehicleTypeWater"
};
/* -------------------------------------------- */
@ -435,6 +449,61 @@ SW5E.armorProficienciesMap = {
shield: "shl"
};
// TODO: Same as weapon IDs
/**
* The basic armor types in 5e. This enables specific armor proficiencies,
* automated AC calculation in NPCs, and starting equipment.
*
* @enum {string}
*/
SW5E.armorIds = {};
// TODO: Same as weapon IDs
/**
* The basic shield in 5e.
*
* @enum {string}
*/
SW5E.shieldIds = {};
/**
* Common armor class calculations.
* @enum {object}
*/
SW5E.armorClasses = {
flat: {
label: "SW5E.ArmorClassFlat",
formula: "@attributes.ac.flat"
},
natural: {
label: "SW5E.ArmorClassNatural",
formula: "@attributes.ac.flat"
},
default: {
label: "SW5E.ArmorClassEquipment",
formula: "@attributes.ac.base + @abilities.dex.mod"
},
mage: {
label: "SW5E.ArmorClassMage",
formula: "13 + @abilities.dex.mod"
},
draconic: {
label: "SW5E.ArmorClassDraconic",
formula: "13 + @abilities.dex.mod"
},
unarmoredMonk: {
label: "SW5E.ArmorClassUnarmoredMonk",
formula: "10 + @abilities.dex.mod + @abilities.wis.mod"
},
unarmoredBarb: {
label: "SW5E.ArmorClassUnarmoredBarbarian",
formula: "10 + @abilities.dex.mod + @abilities.con.mod"
},
custom: {
label: "SW5E.ArmorClassCustom"
}
};
/* -------------------------------------------- */
/**
@ -545,7 +614,9 @@ SW5E.movementTypes = {
*/
SW5E.movementUnits = {
ft: "SW5E.DistFt",
mi: "SW5E.DistMi"
mi: "SW5E.DistMi",
m: "SW5E.DistM",
km: "SW5E.DistKm"
};
/**
@ -571,9 +642,18 @@ for (let [k, v] of Object.entries(SW5E.movementUnits)) {
* @type {Object}
*/
SW5E.encumbrance = {
currencyPerWeight: 50,
strMultiplier: 15,
vehicleWeightMultiplier: 2000 // 2000 lbs in a ton
currencyPerWeight: {
imperial: 50,
metric: 110
},
strMultiplier: {
imperial: 15,
metric: 6.8
},
vehicleWeightMultiplier: {
imperial: 2000, // 2000 lbs in an imperial ton
metric: 1000 // 1000 kg in a metric ton
}
};
/* -------------------------------------------- */

View file

@ -494,6 +494,7 @@ export default class Item5e extends Item {
// Reference aspects of the item data necessary for usage
const hasArea = this.hasAreaTarget; // Is the ability usage an AoE?
const resource = id.consume || {}; // Resource consumption
const resourceTarget = actor.items.get(resource.target);
const recharge = id.recharge || {}; // Recharge mechanic
const uses = id?.uses ?? {}; // Limited uses
const isPower = this.type === "power"; // Does the item require a power slot?
@ -504,7 +505,10 @@ export default class Item5e extends Item {
// Define follow-up actions resulting from the item usage
let createMeasuredTemplate = hasArea; // Trigger a template creation
let consumeRecharge = !!recharge.value; // Consume recharge
let consumeResource = !!resource.target && resource.type !== "ammo"; // Consume a linked (non-ammo) resource
let consumeResource =
!!resource.target &&
resource.type !== "ammo" &&
!(resource.type === "charges" && resourceTarget?.data.data.consumableType === "ammo"); // Consume a linked (non-ammo) resource
let consumePowerSlot = requirePowerSlot; // Consume a power slot
let consumeUsage = !!uses.per; // Consume limited uses
let consumeQuantity = uses.autoDestroy; // Consume quantity of the item in lieu of uses
@ -615,7 +619,7 @@ export default class Item5e extends Item {
const level = this.actor?.data.data.powers[consumePowerLevel];
const fp = this.actor.data.data.attributes.force.points;
const tp = this.actor.data.data.attributes.tech.points;
const powerCost = id.level + 1;
const powerCost = parseInt(id.level, 10) + 1;
const innatePower = this.actor.data.data.attributes.powercasting === "innate";
if (!innatePower) {
switch (id.school) {
@ -747,7 +751,7 @@ export default class Item5e extends Item {
}
// Verify that a consumed resource is available
if (!resource) {
if (resource === undefined) {
ui.notifications.warn(game.i18n.format("SW5E.ConsumeWarningNoSource", {name: this.name, type: typeLabel}));
return false;
}
@ -792,7 +796,7 @@ export default class Item5e extends Item {
// Render the chat card template
const token = this.actor.token;
const templateData = {
actor: this.actor,
actor: this.actor.data,
tokenId: token?.uuid || null,
item: this.data,
data: this.getChatData(),
@ -1000,27 +1004,43 @@ export default class Item5e extends Item {
const usage = this._getUsageUpdates({consumeResource: true});
if (usage === false) return null;
ammoUpdate = usage.resourceUpdates || {};
} else if (consume?.type === "charges") {
ammo = this.actor.items.get(consume.target);
if (ammo?.data?.data?.consumableType === "ammo") {
const uses = ammo.data.data.uses;
if (uses.per && uses.max) {
const q = ammo.data.data.uses.value;
const consumeAmount = consume.amount ?? 0;
if (q && q - consumeAmount >= 0) {
this._ammo = ammo;
title += ` [${ammo.name}]`;
}
}
// Get pending ammunition update
const usage = this._getUsageUpdates({consumeResource: true});
if (usage === false) return null;
ammoUpdate = usage.resourceUpdates || {};
}
}
// Compose roll options
const rollConfig = mergeObject(
{
parts: parts,
actor: this.actor,
data: rollData,
title: title,
flavor: title,
speaker: ChatMessage.getSpeaker({actor: this.actor}),
dialogOptions: {
width: 400,
top: options.event ? options.event.clientY - 80 : null,
left: window.innerWidth - 710
},
messageData: {"flags.sw5e.roll": {type: "attack", itemId: this.id}}
let rollConfig = {
parts: parts,
actor: this.actor,
data: rollData,
title: title,
flavor: title,
dialogOptions: {
width: 400,
top: options.event ? options.event.clientY - 80 : null,
left: window.innerWidth - 710
},
options
);
rollConfig.event = options.event;
messageData: {
"flags.sw5e.roll": {type: "attack", itemId: this.id},
"speaker": ChatMessage.getSpeaker({actor: this.actor})
}
};
// Expanded critical hit thresholds
if (this.data.type === "weapon" && flags.weaponCriticalThreshold) {
@ -1037,9 +1057,12 @@ export default class Item5e extends Item {
// Apply Halfling Lucky
if (flags.halflingLucky) rollConfig.halflingLucky = true;
// Compose calculated roll options with passed-in roll options
rollConfig = mergeObject(rollConfig, options);
// Invoke the d20 roll helper
const roll = await d20Roll(rollConfig);
if (roll === false) return null;
if (!roll) return null;
// Commit ammunition consumption on attack rolls resource consumption if the attack roll was made
if (ammo && !isObjectEmpty(ammoUpdate)) await ammo.update(ammoUpdate);
@ -1099,8 +1122,10 @@ export default class Item5e extends Item {
// Scale damage from up-casting powers
if (this.data.type === "power") {
if (itemData.scaling.mode === "atwill") {
const level =
this.actor.data.type === "character" ? actorData.details.level : actorData.details.powerLevel;
let level;
if (this.actor.type === "character") level = actorData.details.level;
else if (itemData.preparation.mode === "innate") level = Math.ceil(actorData.details.cr);
else level = actorData.details.powerLevel;
this._scaleAtWillDamage(parts, itemData.scaling.formula, level, rollData);
} else if (powerLevel && itemData.scaling.mode === "level" && itemData.scaling.formula) {
const scaling = itemData.scaling.formula;
@ -1629,7 +1654,7 @@ export default class Item5e extends Item {
*/
static async createScrollFromPower(power) {
// Get power data
const itemData = power instanceof Item5e ? power.data : power;
const itemData = power instanceof Item5e ? power.toObject() : power;
const {actionType, description, source, activation, duration, target, range, damage, save, level} =
itemData.data;
@ -1650,7 +1675,7 @@ export default class Item5e extends Item {
const desc = `${scrollIntro}<hr/><h3>${itemData.name} (Level ${level})</h3><hr/>${description.value}<hr/><h3>Scroll Details</h3><hr/>${scrollDetails}`;
// Create the power scroll data
const powerScrollData = mergeObject(scrollData, {
const powerScrollData = foundry.utils.mergeObject(scrollData, {
name: `${game.i18n.localize("SW5E.PowerScroll")}: ${itemData.name}`,
img: itemData.img,
data: {

View file

@ -1,5 +1,5 @@
import TraitSelector from "../apps/trait-selector.js";
import {onManageActiveEffect, prepareActiveEffectCategories} from "../effects.js";
import ActiveEffect5e from "../active-effect.js";
/**
* Override and extend the core ItemSheet implementation to handle specific item types
@ -70,8 +70,12 @@ export default class ItemSheet5e extends ItemSheet {
data.isCrewed = itemData.data.activation?.type === "crew";
data.isMountable = this._isItemMountable(itemData);
// Armor Class
data.isArmor = itemData.data.armor?.type in data.config.armorTypes;
data.hasAC = data.isArmor || data.isMountable;
// Prepare Active Effects
data.effects = prepareActiveEffectCategories(this.item.effects);
data.effects = ActiveEffect5e.prepareActiveEffectCategories(this.item.effects);
// Re-define the template data references (backwards compatible)
data.item = itemData;
@ -347,12 +351,15 @@ export default class ItemSheet5e extends ItemSheet {
options.choices = CONFIG.SW5E.abilities;
options.valueKey = null;
break;
case "skills.choices":
options.choices = CONFIG.SW5E.skills;
options.valueKey = null;
break;
case "skills":
const skills = this.item.data.data.skills;
const choiceSet =
skills.choices && skills.choices.length ? skills.choices : Object.keys(CONFIG.SW5E.skills);
const choiceSet = skills.choices?.length ? skills.choices : Object.keys(CONFIG.SW5E.skills);
options.choices = Object.fromEntries(
Object.entries(CONFIG.SW5E.skills).filter((skill) => choiceSet.includes(skill[0]))
Object.entries(CONFIG.SW5E.skills).filter(([skill]) => choiceSet.includes(skill))
);
options.maximum = skills.number;
break;

View file

@ -9,10 +9,10 @@ export const migrateWorld = async function () {
);
// Migrate World Actors
for await (let a of game.actors.contents) {
for await (let a of game.actors) {
try {
console.log(`Checking Actor entity ${a.name} for migration needs`);
const updateData = await migrateActorData(a.data);
const updateData = await migrateActorData(a.toObject());
if (!foundry.utils.isObjectEmpty(updateData)) {
console.log(`Migrating Actor entity ${a.name}`);
await a.update(updateData, {enforceTypes: false});
@ -24,7 +24,7 @@ export const migrateWorld = async function () {
}
// Migrate World Items
for (let i of game.items.contents) {
for (let i of game.items) {
try {
const updateData = migrateItemData(i.toObject());
if (!foundry.utils.isObjectEmpty(updateData)) {
@ -38,7 +38,7 @@ export const migrateWorld = async function () {
}
// Migrate Actor Override Tokens
for (let s of game.scenes.contents) {
for (let s of game.scenes) {
try {
const updateData = await migrateSceneData(s.data);
if (!foundry.utils.isObjectEmpty(updateData)) {
@ -46,7 +46,7 @@ export const migrateWorld = async function () {
await s.update(updateData, {enforceTypes: false});
// If we do not do this, then synthetic token actors remain in cache
// with the un-updated actorData.
s.tokens.contents.forEach((t) => (t._actor = null));
s.tokens.forEach((t) => (t._actor = null));
}
} catch (err) {
err.message = `Failed sw5e system migration for Scene ${s.name}: ${err.message}`;
@ -91,7 +91,7 @@ export const migrateCompendium = async function (pack) {
try {
switch (entity) {
case "Actor":
updateData = await migrateActorData(doc.data);
updateData = await migrateActorData(doc.toObject());
break;
case "Item":
updateData = migrateItemData(doc.toObject());
@ -117,6 +117,49 @@ export const migrateCompendium = async function (pack) {
console.log(`Migrated all ${entity} entities from Compendium ${pack.collection}`);
};
/**
* Apply 'smart' AC migration to a given Actor compendium. This will perform the normal AC migration but additionally
* check to see if the actor has armor already equipped, and opt to use that instead.
* @param pack
* @return {Promise}
*/
export const migrateArmorClass = async function (pack) {
if (typeof pack === "string") pack = game.packs.get(pack);
if (pack.metadata.entity !== "Actor") return;
const wasLocked = pack.locked;
await pack.configure({locked: false});
const actors = await pack.getDocuments();
const updates = [];
const armor = new Set(Object.keys(CONFIG.SW5E.armorTypes));
for (const actor of actors) {
try {
console.log(`Migrating ${actor.name}...`);
const src = actor.toObject();
const update = {_id: actor.id};
// Perform the normal migration.
_migrateActorAC(src, update);
updates.push(update);
// CASE 1: Armor is equipped
const hasArmorEquipped = actor.itemTypes.equipment.some((e) => {
return armor.has(e.data.data.armor?.type) && e.data.data.equipped;
});
if (hasArmorEquipped) update["data.attributes.ac.calc"] = "default";
// CASE 2: NPC Natural Armor
else if (src.type === "npc") update["data.attributes.ac.calc"] = "natural";
} catch (e) {
console.warn(`Failed to migrate armor class for Actor ${actor.name}`, e);
}
}
await Actor.implementation.updateDocuments(updates, {pack: pack.collection});
await pack.getDocuments(); // Force a re-prepare of all actors.
await pack.configure({locked: wasLocked});
console.log(`Migrated the AC of all Actors from Compendium ${pack.collection}`);
};
/* -------------------------------------------- */
/* Entity Type Migration Helpers */
/* -------------------------------------------- */
@ -135,6 +178,7 @@ export const migrateActorData = async function (actor) {
_migrateActorMovement(actor, updateData);
_migrateActorSenses(actor, updateData);
_migrateActorType(actor, updateData);
_migrateActorAC(actor, updateData);
}
// Migrate Owned Items
@ -215,6 +259,8 @@ export const migrateItemData = function (item) {
const updateData = {};
_migrateItemClassPowerCasting(item, updateData);
_migrateItemAttunement(item, updateData);
_migrateItemRarity(item, updateData);
_migrateArmorType(item, updateData);
return updateData;
};
@ -229,7 +275,9 @@ export const migrateActorItemData = async function (item, actor) {
const updateData = {};
_migrateItemClassPowerCasting(item, updateData);
_migrateItemAttunement(item, updateData);
_migrateItemRarity(item, updateData);
await _migrateItemPower(item, actor, updateData);
_migrateArmorType(item, updateData);
return updateData;
};
@ -555,6 +603,7 @@ function _migrateActorType(actor, updateData) {
/* -------------------------------------------- */
/**
* Migrate the Class item powercasting field to allow powercasting to properly calculate
* @private
*/
function _migrateItemClassPowerCasting(item, updateData) {
@ -597,6 +646,29 @@ function _migrateItemClassPowerCasting(item, updateData) {
/* -------------------------------------------- */
/**
* Migrate the actor attributes.ac.value to the new ac.flat override field.
* @private
*/
function _migrateActorAC(actorData, updateData) {
const ac = actorData.data?.attributes?.ac;
// If the actor has a numeric ac.value, then their AC has not been migrated to the auto-calculation schema yet.
if (Number.isNumeric(ac?.value)) {
updateData["data.attributes.ac.flat"] = ac.value;
updateData["data.attributes.ac.calc"] = actorData.type === "npc" ? "natural" : "flat";
updateData["data.attributes.ac.-=value"] = null;
return updateData;
}
// If the actor is already on the AC auto-calculation schema, but is using a flat value, they must now have their
// calculation updated to an appropriate value.
if (!Number.isNumeric(ac?.flat)) return updateData;
updateData["data.attributes.ac.calc"] = actorData.type === "npc" ? "natural" : "flat";
return updateData;
}
/* -------------------------------------------- */
/**
* Update an Power Item's data based on compendium
* @param {Object} item The data object for an item
@ -664,6 +736,42 @@ function _migrateItemAttunement(item, updateData) {
/* -------------------------------------------- */
/**
* Attempt to migrate item rarity from freeform string to enum value.
*
* @param {object} item Item data to migrate
* @param {object} updateData Existing update to expand upon
* @return {object} The updateData to apply
* @private
*/
function _migrateItemRarity(item, updateData) {
if (item.data?.rarity === undefined) return updateData;
const rarity = Object.keys(CONFIG.SW5E.itemRarity).find(
(key) =>
CONFIG.SW5E.itemRarity[key].toLowerCase() === item.data.rarity.toLowerCase() || key === item.data.rarity
);
updateData["data.rarity"] = rarity ?? "";
return updateData;
}
/* --------------------------------------------- */
/**
* Convert equipment items of type 'bonus' to 'trinket'.
*
* @param {object} item Item data to migrate
* @param {object} updateData Existing update to expand upon
* @return {object} The updateData to apply
* @private
*/
function _migrateArmorType(item, updateData) {
if (item.type !== "equipment") return updateData;
if (item.data?.armor?.type === "bonus") updateData["data.armor.type"] = "trinket";
return updateData;
}
/* -------------------------------------------- */
/**
* A general tool to purge flags from all entities in a Compendium pack.
* @param {Compendium} pack The compendium pack to clean

View file

@ -18,7 +18,7 @@ export default class AbilityTemplate extends MeasuredTemplate {
// Prepare template data
const templateData = {
t: templateShape,
user: game.user.data._id,
user: game.user.id,
distance: target.value,
direction: 0,
x: 0,
@ -96,7 +96,7 @@ export default class AbilityTemplate extends MeasuredTemplate {
// Cancel the workflow (right-click)
handlers.rc = (event) => {
this.layer.preview.removeChildren();
this.layer._onDragLeftCancel(event);
canvas.stage.off("mousemove", handlers.mm);
canvas.stage.off("mousedown", handlers.lc);
canvas.app.view.oncontextmenu = null;

View file

@ -141,4 +141,16 @@ export const registerSystemSettings = function () {
dark: "SETTINGS.SWColorDark"
}
});
/**
* Option to replace imperial weight units with metric weight units.
*/
game.settings.register("sw5e", "metricWeightUnits", {
name: "SETTINGS.5eMetricN",
hint: "SETTINGS.5eMetricL",
scope: "world",
config: true,
type: Boolean,
default: false
});
};

View file

@ -14,6 +14,7 @@ export const preloadHandlebarsTemplates = async function () {
"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/oldActor/parts/actor-warnings.html",
"systems/sw5e/templates/actors/newActor/parts/swalt-biography.html",
"systems/sw5e/templates/actors/newActor/parts/swalt-core.html",
@ -25,6 +26,7 @@ export const preloadHandlebarsTemplates = async function () {
"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-warnings.html",
// Item Sheet Partials
"systems/sw5e/templates/items/parts/item-action.html",

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

View file

@ -52,7 +52,6 @@
{"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":"<p>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.</p>","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":"<p>Power cells fuel blaster weapons that deal energy or ion damage. Additionally, power cells are used to energize certain tools.</p>","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":"<p>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.</p>","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":"<p>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.</p>","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":"<p>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.</p>","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"}
@ -96,7 +95,7 @@
{"name":"Thermal Detonator","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"weapon","data":{"description":{"value":"<p>Thermal detonators are palm-sized, spherical, and extremely deadly explosive weapons. In addition to being surprisingly powerful for their size, they can only be turned off by whoever turned them on. Thermal detonators have a range equal to 30 feet + your Strength modifier x 5. As an action, you can throw a grenade at a point you can see within range. Each creature within 10 feet must make a DC 13 Dexterity saving throw. A creature takes 2d6 fire and 2d6 kinetic damage on a failed save, or half as much as on a successful one. Additionally, on a failed save, the creature is knocked prone.</p>","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":1,"price":750,"attuned":false,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":""},"target":{"value":10,"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":[["2d6","fire"],["2d6","bludgeoning"]],"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/Thermal%20Detonator.webp","_id":"qiLWpJa33pythE4J"}
{"name":"Hydrospanner","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"tool","data":{"description":{"value":"","chat":"","unidentified":""},"source":"","quantity":1,"weight":2,"price":10,"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/Utility/Hydrospanner.webp","_id":"rL1D14LmLu43gUDj"}
{"name":"Kloo Horn","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"tool","data":{"description":{"value":"","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":2,"price":330,"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/Kloo%20Horn.webp","_id":"txKO9MDEwindPjME"}
{"name":"Slug Cartridge","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"consumable","data":{"description":{"value":"<p>Slug cartridges are ammunition for blaster weapons that deal kinetic damage. When you reload a weapon that uses cartridges, you can reload any number of cartridges up to the weapons reload number as a part of the same action.</p>","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":0,"price":2,"attuned":false,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"condition":""},"duration":{"value":null,"units":""},"target":{"value":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":null,"autoDestroy":false},"consume":{"type":"","target":null,"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/Slug%20Cartridge.webp","_id":"u4xaL0xLRJobIj30"}
{"name":"Slug Cartridge","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"consumable","data":{"description":{"value":"<p>Slug cartridges are ammunition for blaster weapons that deal kinetic damage. When you reload a weapon that uses cartridges, you can reload any number of cartridges up to the weapons reload number as a part of the same action.</p>","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":0,"price":2,"attuned":false,"equipped":false,"rarity":"","identified":true,"activation":{"type":"","cost":0,"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":null,"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/Slug%20Cartridge.webp","_id":"u4xaL0xLRJobIj30"}
{"name":"Yarrock","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"consumable","data":{"description":{"value":"<p>Yarrock is a strong hallucinogen which is said to instill a creature with a clear vision of “the meaning of life”, granting a boost to confidence. As an action, you can apply this substance to a creature within 5 feet. For the next minute, the creature experiences a high that allows them to roll an additional d4 when making an ability check, attack roll, or saving throw using Charisma. At the end of the high, the creature must succeed on a DC 13 Wisdom saving throw or experience a low that lasts 10 minutes, during which they must roll a d4 and subtract the result when making an ability check, attack roll, or saving throw using Charisma. At the end of the low, the creature must make a DC 13 Constitution saving throw to resist addiction.</p>","chat":"","unidentified":""},"source":"WH","quantity":1,"weight":0.16,"price":85,"attuned":false,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":1,"units":"minute"},"target":{"value":1,"units":"","type":"creature"},"range":{"value":5,"long":null,"units":"ft"},"uses":{"value":1,"max":1,"per":"charges","autoDestroy":true},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"other","attackBonus":0,"chatFlavor":"Add to ability check, attack roll, or saving throw using Charisma.","critical":null,"damage":{"parts":[],"versatile":""},"formula":"1d4","save":{"ability":"wis","dc":13,"scaling":"flat"},"consumableType":"potion","attributes":{"spelldc":10}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"systems/sw5e/packs/Icons/Spice/Yarrock.webp","_id":"uSzMnQlBpw5rhDcF"}
{"name":"Glitterstim","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"consumable","data":{"description":{"value":"<p>A silvery-green webbing sharp to the touch, yet when liquidized causes a heightened mental state and pleasurable boost. As an action, you can apply this substance to a creature within 5 feet. For the next minute, the creature experiences a high that allows them to roll an additional d4 when making an ability check, attack roll, or saving throw using Intelligence. At the end of the high, the creature must succeed on a DC 13 Wisdom saving throw or experience a low that lasts 10 minutes, during which they must roll a d4 and subtract the result when making an ability check, attack</p>\n<p>roll, or saving throw using Intelligence. At the end of the low, the creature must make a DC 13 Constitution saving throw to resist addiction.</p>","chat":"","unidentified":""},"source":"WH","quantity":1,"weight":0.16,"price":95,"attuned":false,"equipped":false,"rarity":"","identified":true,"activation":{"type":"action","cost":1,"condition":""},"duration":{"value":1,"units":"minute"},"target":{"value":1,"units":"","type":"creature"},"range":{"value":5,"long":null,"units":"ft"},"uses":{"value":1,"max":1,"per":"charges","autoDestroy":true},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"other","attackBonus":0,"chatFlavor":"Add to ability check, attack roll, or saving throw using Intelligence.","critical":null,"damage":{"parts":[],"versatile":""},"formula":"d4","save":{"ability":"con","dc":13,"scaling":"flat"},"consumableType":"potion","attributes":{"spelldc":10}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"systems/sw5e/packs/Icons/Spice/Glitterstim.webp","_id":"uUjV9Ay7TxLOtXVw"}
{"name":"Forgery Kit","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"tool","data":{"description":{"value":"<p>This small box contains a variety of papers and parchments, pens and inks, seals and sealing wax, gold and silver leaf, and other supplies necessary to create convincing forgeries of physical documents. Proficiency with this kit lets you add your proficiency bonus to any ability checks you make to create a physical forgery of a document.</p>","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":5,"price":150,"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/Forgery%20Kit.webp","_id":"uoNaJRSb7ocwldUu"}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,41 +1,65 @@
{"_id":"07AXhaucBRvRQyFf","name":"Fighter Technique","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in fighter and at least 3 levels in scout</em></p>\n<p>You've learned to blend the prowess of your fighter specialty with the knack of your scout technique. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scout levels to your fighter levels when determining the number of hit points you regain from your Second Wind feature.</li>\n<li>You can add your fighter levels to your scout levels when determining the size of your Ranger's Quarry die and the duration of your Ranger's Quarry feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Fighter 3, Scout 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.1TC1nWvs2VR16bm0"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Fighter%20Technique.webp","effects":[]}
{"_id":"10KjUfHaOKAiOw6T","name":"Survivalist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You master wilderness lore, gaining the following benefits:</p>\n<ul>\n<li>Increase your Wisdom score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Survival skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>You learn the <em>alarm</em> tech power. You can cast it once, using supplies scavenged around you, without the use of a wristpad and without spending tech points, and you regain the ability to do so when you finish a long rest.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5025000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.wis.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"10KjUfHaOKAiOw6T","active":false,"_targets":[],"label":"Abilities Wisdom"},{"modSpecKey":"data.skills.sur.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"10KjUfHaOKAiOw6T","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Survivalist.webp","effects":[{"_id":"7jAtDWIhdreAiR2Q","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.wis.value","value":1,"mode":2,"priority":20},{"key":"data.skills.sur.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Survivalist.webp","label":"Survivalist","tint":"","transfer":true}]}
{"_id":"148eHo06z3ddp7fy","name":"Guardian Technique","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in guardian and at least 3 levels in scout</em></p>\n<p>You've learned to blend the expertise of your guardian focus with the knack of your scout technique. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scout levels to your guardian levels when determining the your amount of Focused Strikes dice.</li>\n<li>You can add your guardian levels to your scout levels when determining the size of your Ranger's Quarry die and the duration of your Ranger's Quarry feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Guardian 3, Scout 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.rKTwYSGpvHGLPHzt"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Guardian%20Technique.webp","effects":[]}
{"_id":"1DSm47d3mNU1rgya","name":"Empathic","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You possess keen insight into how other people think and feel. You gain the following benefits:</p>\n<ul>\n<li>Increase your Wisdom score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Insight skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>You can use your action to try to get uncanny insight about one humanoid you can see within 30 feet of you. Make a Wisdom (Insight) check contested by the target's Charisma (Deception) check. On a success, you have advantage on attack rolls and ability checks against the target until the end of your next turn.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":3800000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.wis.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"1DSm47d3mNU1rgya","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Empathic.webp","effects":[{"_id":"m7wHmXbaSkAOeoIr","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.wis.value","value":1,"mode":2,"priority":20},{"key":"data.skills.ins.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Empathic.webp","label":"Empathic","tint":"","transfer":true}]}
{"_id":"1ZAghZJQflkZUVuG","name":"Martial Adept","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have martial training that allows you to perform special combat maneuvers. You gain the following benefits:</p>\n<ul>\n<li>You learn two maneuvers of your choice from among those available to the fighter class. If a maneuver you use requires your target to make a saving throw to resist the maneuvers effects, the saving throw DC equals 8 + your proficiency bonus + your Strength or Dexterity modifier (your choice).</li>\n<li>If you already have superiority dice, you gain one more; otherwise, you have two superiority dice, which are d4s. These dice are used to fuel your maneuvers. A superiority die is expended when you use it. You regain all of your expended superiority dice when you finish a short or long rest.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":6800000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Martial%20Adept.webp","effects":[]}
{"_id":"26Yxgr0B017MT3KN","name":"Berserker Practice","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in berserker and at least 3 levels in operative</em></p>\n<p>You've learned to blend the fury of your berserker approach with the deftness of your operative practice. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your operative levels to your berserker levels when determining the number of times you can enter a rage and the bonus to weapon damage rolls while raging.</li>\n<li>You can add your berserker levels to your operative levels when determining the your amount of Sneak Attack dice.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Berserker 3, Operative 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.kFf5PAAYBxgLmZJi"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Berserker%20Practice.webp","effects":[]}
{"_id":"32xXZ9VyqvvuqX2O","name":"Observant","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Quick to notice details of your environment, you gain the following benefits:</p>\n<ul>\n<li>Increase your Intelligence or Wisdom score by 1, to a maximum of 20.</li>\n<li>If you can see a creature's mouth while it is speaking a language you understand, you can interpret what it's saying by reading its lips.</li>\n<li>You are considered to have advantage when determining your passive Wisdom (Perception) and passive Intelligence (Investigation) scores.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":6200000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Observant.webp","effects":[]}
{"_id":"3408cU2S1U1yuyB3","name":"Consular Calling","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in consular and at least 3 levels in sentinel</em></p>\n<p>You've learned to blend the diligence of your consular tradition with the focus of your sentinel calling. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add half your sentinel levels (rounded down) to half your consular levels (rounded down) when determining the force points you regain through your Force Recovery feature.</li>\n<li>You can add your consular levels to your sentinel levels when determining the size of your Kinetic Combat die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Consular 3, Sentinel 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.Jv085MxgHmyfdJji"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Consular%20Calling.webp","effects":[]}
{"_id":"3D5dUuTvy1EQHZNr","name":"Monastic Calling","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in monk and at least 3 levels in sentinel</em></p>\n<p>You've learned to blend the aptitude of your monastic order with the focus of your sentinel calling. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your sentinel levels to your monk levels when determining the size of your Martial Arts die.</li>\n<li>You can add your monk levels to your sentinel levels when determining the size of your Kinetic Combat die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Monk 3, Sentinel 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.irr8rmJuI2VUypw6"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Monastic%20Calling.webp","effects":[]}
{"_id":"3tOeQ7XLC7omOmIc","name":"Sniping Caster","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> The ability to cast force or tech powers</em></p>\n<p>You've practiced casting powers more accurately from long range, learning techniques that give you the following benefits:</p>\n<ul>\n<li>When you cast a power that requires you to make an attack roll, the power's range is doubled.</li>\n<li>Your ranged force and tech attacks ignore half cover and three-quarters cover.</li>\n<li>You learn one at-will power that requires an attack roll. Your casting ability for this at-will power depends on the power list you chose from: Wisdom or Charisma (depending on power alignment) for force powers or Intelligence for tech powers.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5050000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Sniping%20Caster.webp","effects":[]}
{"_id":"4DuaFCbiBxqL9eL3","name":"Lucky","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have inexplicable luck that seems to kick in at just the right moment.</p>\n<p>You have 3 luck points. Whenever you make an attack roll, an ability check, or a saving throw, you can spend one luck point to roll an additional d20. You can choose to spend one of your luck points after you roll the die, but before the outcome is determined. You choose which of the d20s is used for the attack roll, ability check, or saving throw.</p>\n<p>You can also spend one luck point when an attack roll is made against you. Roll a d20, and then choose whether the attack uses the attacker&rsquo;s roll or yours. If more than one creature spends a luck point to influence the outcome of a roll, the points cancel each other out; no additional dice are rolled.</p>\n<p>You regain your expended luck points when you finish a long rest.</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":7100000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Lucky.webp","effects":[]}
{"_id":"4FfG6bIRNLIy63c8","name":"Berserker Focus","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in berserker and at least 3 levels in guardian</em></p>\n<p>You've learned to blend the fury of your berserker approach with the expertise of your guardian focus. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your guardian levels to your berserker levels when determining the number of times you can enter a rage and the bonus to weapon damage rolls while raging.</li>\n<li>You can add your berserker levels to your guardian levels when determining the your amount of Focused Strikes dice.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Berserker 3, Guardian 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.LxCuAcnOiIWvVW5D"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Berserker%20Focus.webp","effects":[]}
{"_id":"4L64D2kkX4wIPcWS","name":"Fighter Practice","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in fighter and at least 3 levels in operative</em></p>\n<p>You've learned to blend the prowess of your fighter specialty with the deftness of your operative practice. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your operative levels to your fighter levels when determining the number of hit points you regain from your Second Wind feature.</li>\n<li>You can add your fighter levels to your operative levels when determining the your amount of Sneak Attack dice.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Fighter 3, Operative 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.PmCkRnpkK4CJF3cZ"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Fighter%20Practice.webp","effects":[]}
{"_id":"4svS5qc5vl445fsU","name":"Precision Applications","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've honed your skills to fine edge, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can use the bonus action granted by your Cunning Action to carefully aim your next attack. You gain advantage on your next attack roll before the end of your current turn. You can't use this feature if you have moved during this turn, and using this feature reduces your speed to 0 until the end of your current turn.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"at least 3 levels in operative","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5900000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Precision%20Applications.webp","effects":[]}
{"_id":"5YRWESEfVwbZC2Y6","name":"Heavy Weapon Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You master the assault cannon, bowcaster, scattergun, and shotgun. You gain the following benefits while wielding any of these weapons, if you are proficient with it:</p>\n<ul>\n<li>You gain a +1 bonus to the weapon's attack rolls.</li>\n<li>When a creature rolls a 1 on the saving throw against one of these weapons, it takes damage as if suffering a critical hit. If a creature would already suffer a critical hit when it rolls a 1 on this weapon's saving throw, it instead suffers a critical hit on a roll of 1 or 2.</li>\n<li>Whenever you score a critical hit against a creature that is holding an object, you can attempt to disarm the target. If the target is no more than one size larger than you (your size or smaller if your weapon has the light property), it must succeed on a Strength saving throw (DC = 8 + your proficiency bonus + your Dexterity modifier) or it drops an object of your choice at its feet.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":2500000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Heavy%20Weapon%20Specialist.webp","effects":[]}
{"_id":"7WSolr5mmDrV654v","name":"Rifle Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You master the use of blaster carbine, blaster rifle, ion rifle, sniper rifle, and slugthrower. You gain the following benefits while wielding any of these weapons, if you are proficient with it:</p>\n<ul>\n<li>You gain a +1 bonus to the weapon's attack rolls.</li>\n<li>Whenever you have advantage on an attack roll and hit, and the lower of the two d20 rolls would also hit, you can attempt to snare the target. If the target is no more than one size larger than you (your size or smaller if your weapon has the light property), it must succeed on a Dexterity saving throw (DC = 8 + your proficiency bonus + your Dexterity modifier) or its movement speed is reduced by half until the end of it's next turn. If it's speed was already reduced by half, it is instead reduced to 5 feet.</li>\n<li>When a creature you can see misses you with an attack roll, you can use your reaction to Disengage and move up to half your speed. You must end this movement further away from the creature than you started.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4300000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Rifle%20Specialist.webp","effects":[]}
{"_id":"7wIORUosdIwzijMb","name":"Consular Order","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in consular and at least 3 levels in monk</em></p>\n<p>You've learned to blend the diligence of your consular tradition with the aptitude of your monastic order. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add half your monk levels (rounded down) to half your consular levels (rounded down) when determining the force points you regain through your Force Recovery feature.</li>\n<li>You can add your consular levels to your monk levels when determining the size of your Martial Arts die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Consular 3, Monk 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.x5cR3YYUdfcI1j3b"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Consular%20Order.webp","effects":[]}
{"_id":"8QiP9E123SuPo0fx","name":"Fighter Pursuit","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in fighter and at least 3 levels in scholar</em></p>\n<p>You've learned to blend the prowess of your fighter specialty with the ingenuity of your academic pursuit. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scholar levels to your fighter levels when determining the number of hit points you regain from your Second Wind feature.</li>\n<li>You can add your fighter levels to your scholar levels when determining the size of your Superiority Dice and the number of Superiority Dice you have.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Fighter 3, Scholar 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.Jpc1nF9cQJN1dJhY"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Fighter%20Pursuit.webp","effects":[]}
{"_id":"8rcm51F8jpbNXWs3","name":"Ace Pilot","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Hi You're quite experienced both on land and in the air, be it from time in a navy, as a mercenary, or perhaps even piracy. You gain the following benefits:</p>\n<ul>\n<li>Increase your Intelligence score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Piloting skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>Whenever you make an Intelligence (Investigation) or Wisdom (Perception) check related to vehicles or ships, you are considered to have expertise in the Investigation or Perception skill.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":null,"condition":"Intelligence (Investigation) or Wisdom (Perception) check related to vehicles or ships"},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"int","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":false},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5500000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.int.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"8rcm51F8jpbNXWs3","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.skills.pil.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"8rcm51F8jpbNXWs3","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Ace%20Pilot.webp","effects":[{"_id":"wETPj7Yg4Sj3OEEV","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.int.value","value":1,"mode":2,"priority":20},{"key":"data.skills.pil.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Ace%20Pilot.webp","label":"Ace Pilot","tint":"","transfer":true}]}
{"_id":"99azq7lE3i9pB9RK","name":"Guardian Order","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in guardian and at least 3 levels in monk</em></p>\n<p>You've learned to blend the expertise of your guardian focus with the aptitude of your monastic order. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your monk levels to your guardian levels when determining the your amount of Focused Strikes dice.</li>\n<li>You can add your guardian levels to your monk levels when determining the size of your Martial Arts die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Guardian 3, Monk 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.ncFfAfwVg4q1FF33"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Guardian%20Order.webp","effects":[]}
{"_id":"9BAA7wcoA2sikVrT","name":"Monastic Practice","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in monk and at least 3 levels in operative</em></p>\n<p>You've learned to blend the aptitude of your monastic order with the deftness of your operative practice. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your operative levels to your monk levels when determining the size of your Martial Arts die.</li>\n<li>You can add your monk levels to your operative levels when determining the your amount of Sneak Attack dice.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Monk 3, Operative 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.ew7RcbcPs1EhTZ6N"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Monastic%20Practice.webp","effects":[]}
{"_id":"9Tv2HgQeSEnALiup","name":"Supreme Accuracy","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Dexterity, Intelligence, Wisdom, or Charisma 13</em><br />You have uncanny aim with attacks that rely on precision. You gain the following benefits:</p>\n<ul>\n<li>Increase your Dexterity, Intelligence, Wisdom, or Charisma score by 1, to a maximum of 20.</li>\n<li>Whenever you have advantage on an attack roll using Dexterity, Intelligence, Wisdom, or Charisma you can reroll one of the dice once.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4862500,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Supreme%20Accuracy.webp","effects":[]}
{"_id":"A3iKF2QaiLp57Kct","name":"Silver-Tongued","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You develop your conversational skill to better deceive others. You gain the following benefits:</p>\n<ul>\n<li>Increase your Charisma score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Deception skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>When you take the Attack action, you can replace one attack with an attempt to deceive one humanoid you can see within 30 feet of you that can see and hear you. Make a Charisma (Deception) check contested by the target's Wisdom (Insight) check. If your check succeeds, your movement doesn't provoke opportunity attacks from the target and your attack rolls against it have advantage; both benefits last until the end of your next turn or until you use this ability on a different target. If your check fails, the target can't be deceived by you in this way for 1 hour.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5300000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"A3iKF2QaiLp57Kct","active":false,"_targets":[],"label":"Abilities Charisma"},{"modSpecKey":"data.skills.dec.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"A3iKF2QaiLp57Kct","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Silver-Tongued.webp","effects":[{"_id":"0DVCA8MIhpczgRqW","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.cha.value","value":1,"mode":2,"priority":20},{"key":"data.skills.dec.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Silver-Tongued.webp","label":"Silver-Tongued","tint":"","transfer":true}]}
{"_id":"A6J3YH7FOX93ExiY","name":"Engineering Pursuit","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in engineer and at least 3 levels in scholar</em></p>\n<p>You've learned to blend the artistry of your engineering discipline with the ingenuity of your academic pursuit. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scholar levels to your engineer levels when determining the size of your Potent Aptitude die and the number of uses of your Potent Aptitude feature.</li>\n<li>You can add your engineer levels to your scholar levels when determining the size of your Superiority Dice and the number of Superiority Dice you have.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Engineer 3, Scholar 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.vJO9yClufYQhW7hn"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Engineering%20Pursuit.webp","effects":[]}
{"_id":"BGgoW3Cwxj28VTwz","name":"Power Adept","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> The ability to cast force or tech powers</em><br />When you gain this feat, choose one of the following damage types: acid, cold, fire, force, lightning, or necrotic. Powers you cast ignore resistance to damage of the chosen type. In addition, when you roll damage for a power you cast that deals damage of that type, you can treat any 1 on a damage die as a 2.</p>\n<p>You can select this feat multiple times. Each time you do so, you must choose a different damage type.</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":6500000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Power%20Adept.webp","effects":[]}
{"_id":"BaXJ9OO3GUF33Plg","name":"Investigator","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have an eye for detail and can pick out the smallest clues. You gain the following benefits:</p>\n<ul>\n<li>Increase your Intelligence score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Investigation skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>You can take the Search action as a bonus action.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":2100000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.int.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"BaXJ9OO3GUF33Plg","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Investigator.webp","effects":[{"_id":"LWFLUSnorYCG0US2","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.int.value","value":1,"mode":2,"priority":20},{"key":"data.skills.inv.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Investigator.webp","label":"Investigator","tint":"","transfer":true}]}
{"_id":"BjWUsjBQzq4w1Q3s","name":"Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have focused training with a specific tool. Select one type of specialist's kit. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You gain proficiency with the chosen kit. If you are already proficient with it, you instead gain expertise with it.</li>\n<li>You can attempt ability checks with the chosen kit without the kit present, but you have disadvantage on the check when you do so.</li>\n<li>Whenever you make an ability check with the chosen kit and you don't have disadvantage on the check, you can treat a d20 roll of 9 or lower as a 10, as long as you spend at least 1 minute on the check. You can select this feat multiple times. Each time you do so, you must choose a different specialist's kit.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4875000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Specialist.webp","effects":[]}
{"_id":"Chcah8YNGXMT1Iz8","name":"Alert","permission":{"default":0,"RUkz7eIDP4LKuNqw":3},"type":"feat","data":{"description":{"value":"<p>Always on the lookout for danger, you gain the following benefits:</p>\n<ul>\n<li>You gain a +5 bonus to initiative.</li>\n<li>You can't be surprised while you are conscious.</li>\n<li>Other creatures don't gain advantage on attack rolls against you as a result of being unseen by you.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":1200000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.attributes.init.value","value":"5","mode":"+","targetSpecific":false,"id":1,"itemId":"K7DJqRZNotfWGZMK","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Alert.webp","effects":[{"_id":"cOPS96jeTb8E0cQS","flags":{"dae":{"stackable":false,"specialDuration":["None"],"transfer":true}},"changes":[{"key":"flags.sw5e.initiativeAlert","value":"1","mode":0,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Alert.webp","label":"Alert","tint":"","transfer":true}]}
{"_id":"D02rvwCBbp6mIwlH","name":"Galvanizing Presence","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Your presence on the battlefield is a source of inspiration. You gain the following benefits:</p>\n<ul>\n<li>Increase your Charisma score by 1, to a maximum of 20.</li>\n<li>As a bonus action, you let out a rallying war cry, ending the frightened or charmed condition on yourself and a number of allies that can hear you equal to your Charisma modifier (minimum of one). Once you've used this ability, you must complete a short or long rest before you can use it again.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":2900000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"D02rvwCBbp6mIwlH","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Galvanizing%20Presence.webp","effects":[{"_id":"oqsKJpSvNVvb4brh","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.attributes.str.mod","value":"1","mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Galvanizing%20Presence.webp","label":"Galvanizing Presence","tint":"","transfer":true}]}
{"_id":"DDi6XilrChhf7St6","name":"Monastic Technique","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in monk and at least 3 levels in scout</em></p>\n<p>You've learned to blend the aptitude of your monastic order with the knack of your scout technique. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scout levels to your monk levels when determining the size of your Martial Arts die.</li>\n<li>You can add your monk levels to your scout levels when determining the size of your Ranger's Quarry die and the duration of your Ranger's Quarry feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Monk 3, Scout 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.F8O4RpkZUudbQuSU"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Monastic%20Technique.webp","effects":[]}
{"_id":"Dt92E5ePPUqLTnRx","name":"Engineering Order","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in engineer and at least 3 levels in monk</em></p>\n<p>You've learned to blend the artistry of your engineering discipline with the aptitude of your monastic order. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your monk levels to your engineer levels when determining the size of your Potent Aptitude die and the number of uses of your Potent Aptitude feature.</li>\n<li>You can add your engineer levels to your monk levels when determining the size of your Martial Arts die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Engineer 3, Monk 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.7WOXWU87KjCSp11l"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Engineering%20Order.webp","effects":[]}
{"_id":"E1VLUKO9e7wb4mHm","name":"Athlete","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have undergone extensive physical training to gain the following benefits:</p>\n<ul>\n<li>Increase your Strength or Dexterity score by 1, to a maximum of 20.</li>\n<li>When you are prone, standing up uses only 5 feet of your movement.</li>\n<li>Climbing doesn't halve your speed.</li>\n<li>You can make a running long jump or a running high jump after moving only 5 feet on foot, rather than 10 feet.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":1000000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Athlete.webp","effects":[]}
{"_id":"E89ZF9cltOGagy6F","name":"Keen Mind","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have a mind that can track time, direction, and detail with uncanny precision. You gain the following benefits:</p>\n<ul>\n<li>Increase your Intelligence score by 1, to a maximum of 20.</li>\n<li>You always know which way is north.</li>\n<li>You always know the number of hours left before the next sunrise or sunset.</li>\n<li>You can accurately recall anything you have seen or heard within the past month.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":2400000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.int.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"E89ZF9cltOGagy6F","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Keen%20Mind.webp","effects":[{"_id":"5An1ZGR716UiEg8n","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.int.value","value":1,"mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Keen%20Mind.webp","label":"Keen Mind","tint":"","transfer":true}]}
{"_id":"E8mrRhc4BQEgapcA","name":"Augmented Cyborg","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've experimented with cybernetic augmentations, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>Choose one cybernetic augmentation of standard rarity from Appendix A. That augmentation is installed and doesn't count against the maximum cybernetic augmentations you can support, but it does count towards your total cybernetics augmentations as shown in the Cybernetic Augmentations Side Effects table in Chapter 7.</li>\n</ul>","chat":"","unidentified":""},"source":"WH","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":1100000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Augmented%20Cyborg.webp","effects":[]}
{"_id":"EEMJ3UEwesgxC78X","name":"Lightly Armored","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have trained to master the use of light armor, gaining the following benefits:</p>\n<ul>\n<li>Increase your Strength, Dexterity, or Constitution score by 1, to a maximum of 20.</li>\n<li>You gain proficiency with light armor. If you are already proficient with light armor, instead while you are wearing light armor, your speed increases by 5 feet. You can take this feat twice.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":7300000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.traits.armorProf.value","value":"lgt","mode":"+","targetSpecific":false,"id":1,"itemId":"EEMJ3UEwesgxC78X","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Lightly%20Armored.webp","effects":[{"_id":"S8GetmShXe43aVoD","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.traits.armorProf.value","value":"lgt","mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Lightly%20Armored.webp","label":"Lightly Armored","tint":"","transfer":true}]}
{"_id":"FF1sNY6xNbDsAnh1","name":"Actor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Skilled at mimicry and dramatics, you gain the following benefits:</p>\n<ul>\n<li>Increase your Charisma score by 1, to a maximum of 20.</li>\n<li>You have advantage on Charisma (Deception) and Charisma (Performance) checks when trying to pass yourself off as a different person.</li>\n<li>You can mimic the speech of another person or the sounds made by other creatures. You must have heard the person speaking, or heard the creature make the sound, for at least 1 minute. A successful Wisdom (Insight) check contested by your Charisma (Deception) check allows a listener to determine that the effect is faked.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":1500000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"FF1sNY6xNbDsAnh1","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Actor.webp","effects":[{"_id":"LUNxiVBY9pBVNXQ2","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.cha.value","value":1,"mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Actor.webp","label":"Actor","tint":"","transfer":true}]}
{"_id":"G38wenURjXpXtoOA","name":"Operative Technique","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in operative and at least 3 levels in scout</em></p>\n<p>You've learned to blend the deftness of your operative practice with the knack of your scout technique. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scout levels to your operative levels when determining the your amount of Sneak Attack dice.</li>\n<li>You can add your operative levels to your scout levels when determining the size of your Ranger's Quarry die and the duration of your Ranger's Quarry feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Operative 3, Scout 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.ce5M4DUTylfSC2Uk"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Operative%20Technique.webp","effects":[]}
{"_id":"GPim2157CrrgrS2x","name":"Berserker Discipline","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in berserker and at least 3 levels in engineer</em></p>\n<p>You've learned to blend the fury of your berserker approach with the artistry of your engineering discipline. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your engineer levels to your berserker levels when determining the number of times you can enter a rage and the bonus to weapon damage rolls while raging.</li>\n<li>You can add your berserker levels to your engineer levels when determining the size of your Potent Aptitude die and the number of uses of your Potent Aptitude feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Berserker 3, Engineer 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.V0DCsc70fLdPMrWT"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Berserker%20Discipline.webp","effects":[]}
{"_id":"Gg5CP1rrrqslUvtd","name":"Perceptive","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You hone your senses until they become razor sharp. You gain the following benefits:</p>\n<ul>\n<li>Increase your Wisdom score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Perception skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>Being in a lightly obscured area doesn't impose disadvantage on your Wisdom (Perception) checks if you can both see and hear.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":6100000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.wis.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"Gg5CP1rrrqslUvtd","active":false,"_targets":[],"label":"Abilities Wisdom"},{"modSpecKey":"data.skills.prc.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"Gg5CP1rrrqslUvtd","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Perceptive.webp","effects":[{"_id":"o0hxX4A0uPxWHjaZ","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.wis.value","value":1,"mode":2,"priority":20},{"key":"data.skills.prc.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Perceptive.webp","label":"Perceptive","tint":"","transfer":true}]}
{"_id":"GlrABR30jRsQnhfg","name":"Quick-Fingered","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Your nimble fingers and agility let you perform sleight of hand. You gain the following benefits:</p>\n<ul>\n<li>Increase your Dexterity score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Sleight of Hand skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>As a bonus action, you can make a Dexterity (Sleight of Hand) check to plant something on someone else, conceal an object on a creature, lift a purse, or take something from a pocket.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4100000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.dex.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"GlrABR30jRsQnhfg","active":false,"_targets":[],"label":"Abilities Dexterity"},{"modSpecKey":"data.skills.slt.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"GlrABR30jRsQnhfg","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Quick-Fingered.webp","effects":[{"_id":"Ue42BFejvAwlfI19","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.dex.value","value":1,"mode":2,"priority":20},{"key":"data.skills.slt.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Quick-Fingered.webp","label":"Quick-Fingered","tint":"","transfer":true}]}
{"_id":"Gm5pE7iTE74ITJlK","name":"Practiced","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have acquired skills over your career, gaining the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You gain proficiency in any combination of two skills or tools of your choice.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5800000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Practiced.webp","effects":[]}
{"_id":"HG3tsJyWM7X7fVIv","name":"Fighting Stylist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You adopt a particular style of fighting as your specialty, gaining the following benefits:</p>\n<ul>\n<li>Increase your Strength, Dexterity, or Constitution score by 1, to a maximum of 20.</li>\n<li>Choose one of the Fighting Style options, detailed later in this chapter.</li>\n</ul>\n<p>You can select this feat multiple times. You can't take a Fighting Style option more than once, even if you later get to choose again.</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":3200000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Fighting%20Stylist.webp","effects":[]}
{"_id":"HMtPma2N0myiF2il","name":"Battle Scarred","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've spent a lifetime fighting, with the scars to prove it. You gain the following benefits:</p>\n<ul>\n<li>Increase your Constitution score by 1, to a maximum of 20.</li>\n<li>When you roll a 19 or a 20 on the d20 for a death saving throw, you regain 1 hit point.</li>\n<li>When you are reduced to 0 hit points but not killed outright, you can drop to 1 hit point instead. Once you've used this ability, you must complete a long rest before you can use it again.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"special","cost":null,"condition":"When you are reduced to 0 hit points but not killed outright"},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":"self"},"range":{"value":0,"long":0,"units":""},"uses":{"value":1,"max":1,"per":"lr"},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"heal","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["1","healing"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":900000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.con.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"HMtPma2N0myiF2il","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Battle%20Scarred.webp","effects":[{"_id":"0DNfH4zQ9bTTeP0W","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.con.value","value":1,"mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Battle%20Scarred.webp","label":"Battle Scarred","tint":"","transfer":true}]}
{"_id":"J5eAWVCNYRZPsJzq","name":"Mariner","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've spent an exorbitant amount of time in water. You gain the following benefits:</p>\n<ul>\n<li>Increase your Constitution by 1, to a maximum of 20.</li>\n<li>You gain a swimming speed equal to your movement speed.</li>\n<li>You have advantage on ability checks and saving throws related to swimming.</li>\n<li>You can hold your breath for a number of minutes equal to 1 + twice your Constitution modifier.</li>\n</ul>","chat":"","unidentified":""},"source":"WH","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":2200000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.con.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"J5eAWVCNYRZPsJzq","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Mariner.webp","effects":[{"_id":"iOIplrtcWGmtS6Gu","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.con.value","value":1,"mode":2,"priority":20},{"key":"data.attributes.movement.swim","value":"(@attributes.movement.walk)","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Mariner.webp","label":"Mariner","tint":"","transfer":true}]}
{"_id":"J7N9Ri9ANCJR4Uf6","name":"Engineering Calling","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in engineer and at least 3 levels in sentinel</em></p>\n<p>You've learned to blend the artistry of your engineering discipline with the focus of your sentinel calling. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your sentinel levels to your engineer levels when determining the size of your Potent Aptitude die and the number of uses of your Potent Aptitude feature.</li>\n<li>You can add your engineer levels to your sentinel levels when determining the size of your Kinetic Combat die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Engineer 3, Sentinel 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.SZI6qPmWYLmDFwGM"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Engineering%20Calling.webp","effects":[]}
{"_id":"JoDZj9iDHOq1K0L8","name":"Performer","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You master performance so that you can command any stage. You gain the following benefits:</p>\n<ul>\n<li>Increase your Charisma score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Performance skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>While performing, you can try to distract one humanoid you can see who can see and hear you. Make a Charisma (Performance) check contested by the humanoid's Wisdom (Insight) check. If your check succeeds, you grab the humanoid's attention enough that it makes Wisdom (Perception) and Intelligence (Investigation) checks with disadvantage until you stop performing.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":6300000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"JoDZj9iDHOq1K0L8","active":false,"_targets":[],"label":"Abilities Charisma"},{"modSpecKey":"data.skills.prf.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"JoDZj9iDHOq1K0L8","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Performer.webp","effects":[{"_id":"6r9fTP1TDu68qrBF","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.attributes.str.mod","value":"1","mode":2,"priority":20},{"key":"data.skills.prf.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Performer.webp","label":"Performer","tint":"","transfer":true}]}
{"_id":"KmOP744KaU2bOsX2","name":"Techie","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You master the theory and practice of technology, gaining the following benefits:</p>\n<ul>\n<li>Increase your Intelligence score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Technology skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>You learn the <em>repair droid</em> tech power. You can cast it once, using supplies scavenged around you, without the use of a wristpad and without spending tech points, and you regain the ability to do so when you finish a long rest.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4856250,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.int.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"KmOP744KaU2bOsX2","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.skills.tec.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"KmOP744KaU2bOsX2","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Techie.webp","effects":[{"_id":"T9QcU6d4jFC1GTve","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.int.value","value":1,"mode":2,"priority":20},{"key":"data.skills.tec.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Techie.webp","label":"Techie","tint":"","transfer":true}]}
{"_id":"LzF6ijAkhkIkiZdJ","name":"Forceful Vigor","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Your strength and virility rarely go unnoticed, often to the point of distraction. You gain the following benefits:</p>\n<ul>\n<li>Increase your Strength score by 1, to a maximum of 20.</li>\n<li>You can use your Strength modifier instead of your Constitution modifier when making Constitution checks.</li>\n<li>When you would make a Constitution saving throw, you can instead make a Strength saving throw. You can use this feature a number of times equal to your Strength modifier. You regain all expended uses of this feature when you complete a long rest.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":2700000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.str.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"LzF6ijAkhkIkiZdJ","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Forceful%20Vigor.webp","effects":[{"_id":"mdDtHcBBKSw698Qy","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.str.value","value":1,"mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Forceful%20Vigor.webp","label":"Forceful Vigor","tint":"","transfer":true}]}
{"_id":"NMzjgUDUPBVVJJdP","name":"Force of Personality","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Rooms never go unalerted to your presence, and the strength of your personality make others lose focus on their own social game. Powers and other effects infrequently override your force of will. You gain the following benefits:</p>\n<ul>\n<li>Your Charisma score increases by 1, to a maximum of 20.</li>\n<li>You can use your Charisma modifier instead of your Wisdom modifier when making Insight checks.</li>\n<li>When you would make a Wisdom saving throw, you can instead make a Charisma saving throw. You can use this feature a number of times equal to your Charisma modifier. You regain all expended uses of this feature when you complete a long rest.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":7700000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"NMzjgUDUPBVVJJdP","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Force%20of%20Personality.webp","effects":[{"_id":"IJoxm3NhIdtw6E6s","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.attributes.str.mod","value":"1","mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Force%20of%20Personality.webp","label":"Force of Personality","tint":"","transfer":true}]}
{"_id":"O9td5tmc6IhbQuQl","name":"Consular Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in consular and at least 3 levels in fighter</em></p>\n<p>You've learned to blend the diligence of your consular tradition with the prowess of your fighter specialty. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add half your fighter levels (rounded down) to half your consular levels (rounded down) when determining the force points you regain through your Force Recovery feature.</li>\n<li>You can add your consular levels to your fighter levels when determining the number of hit points you regain from your Second Wind feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Consular 3, Fighter 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.FOqzK1ZMYsEGTGQe"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Consular%20Specialist.webp","effects":[]}
{"_id":"Of8IhnbIiID6sUt4","name":"Charmer","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've master the art of charming those around you, gaining the following benefits:</p>\n<ul>\n<li>Increase your Charisma score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Persuasion skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>If you spend 1 minute talking to someone who can understand what you say, you can make a Charisma (Persuasion) check contested by the creature's Wisdom (Insight) check. If you or your companions are fighting the creature, your check automatically fails. If your check succeeds, the target is charmed by you as long as it remains within 60 feet of you and for 1 minute thereafter.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":1600000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"Of8IhnbIiID6sUt4","active":false,"_targets":[],"label":"Abilities Charisma"},{"modSpecKey":"data.skills.per.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"Of8IhnbIiID6sUt4","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Charmer.webp","effects":[{"_id":"O6MV5fgux54aJzON","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.attributes.str.mod","value":"1","mode":2,"priority":20},{"key":"data.skills.per.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Charmer.webp","label":"Charmer","tint":"","transfer":true}]}
{"_id":"OscgoQiBqmEXaMdx","name":"Consular Technique","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in consular and at least 3 levels in scout</em></p>\n<p>You've learned to blend the diligence of your consular tradition with the knack of your scout technique. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add half your scout levels (rounded down) to half your consular levels (rounded down) when determining the force points you regain through your Force Recovery feature.</li>\n<li>You can add your consular levels to your scout levels when determining the size of your Ranger's Quarry die and the duration of your Ranger's Quarry feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Consular 3, Scout 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.7Zyqa8e3ktuAPmM3"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Consular%20Technique.webp","effects":[]}
{"_id":"PXlnSVNoec3zFrJi","name":"Operative Pursuit","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in operative and at least 3 levels in scholar</em></p>\n<p>You've learned to blend the deftness of your operative practice with the ingenuity of your academic pursuit. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scholar levels to your operative levels when determining the your amount of Sneak Attack dice.</li>\n<li>You can add your operative levels to your scholar levels when determining the size of your Superiority Dice and the number of Superiority Dice you have.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Operative 3, Scholar 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.RALaz5gCzkQxL8vO"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Operative%20Pursuit.webp","effects":[]}
{"_id":"PxcRpl86f1jQDdp6","name":"Berserker Order","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in berserker and at least 3 levels in monk</em></p>\n<p>You've learned to blend the fury of your berserker approach with the aptitude of your monastic order. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your monk levels to your berserker levels when determining the number of times you can enter a rage and the bonus to weapon damage rolls while raging.</li>\n<li>You can add your berserker levels to your monk levels when determining the size of your Martial Arts die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Berserker 3, Monk 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.3zVp3UUe4Ekt803L"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Berserker%20Order.webp","effects":[]}
{"_id":"QLLXt6fQiqI1Va2l","name":"Tech Dabbler","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You know two at-will tech powers. When you reach 3rd level, you learn and can cast one 1st-level tech power once per long rest. When you reach 5th level, you learn and can cast one 2nd-level tech power once per long rest. Your techcasting ability is Intelligence. You require use of a tech focus for these powers. Additionally, you lose the Tech-Impaired special trait if you have it.</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4868750,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Tech%20Dabbler.webp","effects":[{"_id":"GUfzqovlmL2F0aTA","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"flags.sw5e.techImpaired","value":"0","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Tech%20Dabbler.webp","label":"Tech Dabbler","tint":"","transfer":true,"selectedKey":"data.abilities.cha.dc"}]}
{"_id":"Qv2nJWPLJ2klIEbQ","name":"Acrobat","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You become more nimble, gaining the following benefits:</p>\n<ul>\n<li>Increase your Dexterity score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Acrobatics skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>As a bonus action, you can make a DC 15 Dexterity (Acrobatics) check. If you succeed, difficult terrain doesn't cost you extra movement until the end of the current turn.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"bonus","cost":1,"condition":""},"duration":{"value":1,"units":"turn"},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":"dex","actionType":"abil","attackBonus":0,"chatFlavor":"As a bonus action, you can make a DC 15 Dexterity (Acrobatics) check. If you succeed, difficult terrain doesnt cost you extra movement until the end of the current turn.","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"dex","dc":15,"scaling":"flat"},"requirements":"","recharge":{"value":0,"charged":false},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":300000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.dex.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"Qv2nJWPLJ2klIEbQ","active":false,"_targets":[],"label":"Abilities Dexterity"},{"modSpecKey":"data.skills.acr.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"Qv2nJWPLJ2klIEbQ","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Acrobat.webp","effects":[{"_id":"u18WfljlCk4IkdsB","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.dex.value","value":1,"mode":2,"priority":20},{"key":"data.skills.acr.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Acrobat.webp","label":"Acrobat","tint":"","transfer":true}]}
{"_id":"Qv2nJWPLJ2klIEbQ","name":"Acrobat","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You become more nimble, gaining the following benefits:</p>\n<ul>\n<li>Increase your Dexterity score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Acrobatics skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>As a bonus action, you can make a DC 15 Dexterity (Acrobatics) check. If you succeed, difficult terrain doesn't cost you extra movement until the end of the current turn.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"bonus","cost":1,"condition":""},"duration":{"value":1,"units":"turn"},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":"0","max":"0","per":""},"consume":{"type":"","target":"","amount":null},"ability":"dex","actionType":"abil","attackBonus":0,"chatFlavor":"As a bonus action, you can make a DC 15 Dexterity (Acrobatics) check. If you succeed, difficult terrain doesnt cost you extra movement until the end of the current turn.","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"dex","dc":"15","scaling":"flat"},"requirements":"","recharge":{"value":0,"charged":false},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":300000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.dex.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"Qv2nJWPLJ2klIEbQ","active":false,"_targets":[],"label":"Abilities Dexterity"},{"modSpecKey":"data.skills.acr.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"Qv2nJWPLJ2klIEbQ","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Acrobat.webp","effects":[{"_id":"u18WfljlCk4IkdsB","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.dex.value","value":1,"mode":2,"priority":20},{"key":"data.skills.acr.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Acrobat.webp","label":"Acrobat","tint":"","transfer":true}]}
{"_id":"R8PlFyq0UYGnknlE","name":"Guardian Pursuit","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in guardian and at least 3 levels in scholar</em></p>\n<p>You've learned to blend the expertise of your guardian focus with the ingenuity of your academic pursuit. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scholar levels to your guardian levels when determining the your amount of Focused Strikes dice.</li>\n<li>You can add your guardian levels to your scholar levels when determining the size of your Superiority Dice and the number of Superiority Dice you have.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Guardian 3, Scholar 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.moK5yVuxRkNp5bOv"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Guardian%20Pursuit.webp","effects":[]}
{"_id":"RDN5JNfiKs59xcGt","name":"Feigned Confidence","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've spent years pretending you know what you're doing, gaining the following benefits:</p>\n<ul>\n<li>Increase your Charisma score by 1, to a maximum of 20.</li>\n<li>When you would make an ability check with a skill or tool that doesn't add your proficiency bonus, you can first make a DC 15 Charisma (Deception) check. On a success, you can add your proficiency bonus to the initial ability check. You can use this feature a number of times equal to your Charisma modifier (a minimum of once). You regain all expended uses when you finish a short or long rest.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":7900000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"RDN5JNfiKs59xcGt","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Feigned%20Confidence.webp","effects":[{"_id":"BjCZUlbZ9U1ZOSJa","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.attributes.str.mod","value":"1","mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Feigned%20Confidence.webp","label":"Feigned Confidence","tint":"","transfer":true}]}
{"_id":"RRDtj2mMRQYyHqdS","name":"Monastic Pursuit","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in monk and at least 3 levels in scholar</em></p>\n<p>You've learned to blend the aptitude of your monastic order with the ingenuity of your academic pursuit. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scholar levels to your monk levels when determining the size of your Martial Arts die.</li>\n<li>You can add your monk levels to your scholar levels when determining the size of your Superiority Dice and the number of Superiority Dice you have.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Monk 3, Scholar 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.DXPUB7G2s4o98SdV"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Monastic%20Pursuit.webp","effects":[]}
{"_id":"T0pMXR5lUepOZWAu","name":"Unnatural Resilience","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Constitution 20</em><br />You have the fortitude often attributed to gods, granting the following benefits:</p>\n<ul>\n<li>You gain proficiency in Constitution saving throws. If you are already proficient in them, you add double your proficiency bonus to saving throws you make.</li>\n<li>Enhanced effects, such as powers or medpacs, that would restore hit points to you can't restore an amount less than half your level + your Constitution modifier. If this amount would exceed that maximum amount of hit points that effect could restore, you instead take that effect's maximum.</li>\n<li>You can add your Constitution modifier to death saving throws you make.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"12th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4857032,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Unnatural%20Resilience.webp","effects":[{"_id":"HWlDE64BbJVvn82X","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.con.proficient","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Unnatural%20Resilience.webp","label":"Unnatural Resilience","tint":"","transfer":true}]}
{"_id":"T4oYkzdxQmcbHG6G","name":"Brawny","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You become stronger, gaining the following benefits:</p>\n<ul>\n<li>Increase your Strength score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Athletics skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>You count as if you were one size larger for the purpose of determining your carrying capacity.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":700000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.str.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"T4oYkzdxQmcbHG6G","active":false,"_targets":[],"label":"Abilities Strength"},{"modSpecKey":"data.skills.ath.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"T4oYkzdxQmcbHG6G","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Brawny.webp","effects":[{"_id":"nTl10WelwUGi4Gtd","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.str.value","value":1,"mode":2,"priority":20},{"key":"data.skills.ath.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Brawny.webp","label":"Brawny","tint":"","transfer":true}]}
{"_id":"U3aYktOmnQIztFlv","name":"Academic Technique","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in scholar and at least 3 levels in scout</em></p>\n<p>You've learned to blend the ingenuity of your academic pursuit with the knack of your scout technique. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scout levels to your scholar levels when determining the size of your Superiority Dice and the number of Superiority Dice you have.</li>\n<li>You can add your scholar levels to your scout levels when determining the size of your Ranger's Quarry die and the duration of your Ranger's Quarry feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Scholar 3, Scout 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.fa83gW1vV6JzCN7W"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Academic%20Technique.webp","effects":[]}
{"_id":"UUaYVEXcwbVHv2sr","name":"Healer","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You are an able medic, allowing you to mend wounds quickly and get your allies back in the fight. You gain the following benefits:</p>\n<ul>\n<li>Increase your Intelligence or Wisdom score by 1, to a maximum of 20.</li>\n<li>When you use a traumakit to stabilize a dying creature, that creature also regains 1 hit point.</li>\n<li>As an action, you can spend one use of a traumakit to tend to a creature and restore 1d6 + 4 hit points to it, plus additional hit points equal to the creature's maximum number of Hit Dice. The creature can't regain hit points again in this way until it finishes a short or long rest.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":2600000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Healer.webp","effects":[]}
{"_id":"VSXqyHXrw1kI3X91","name":"Close Quarters Caster","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> The ability to cast force or tech powers</em><br />You've practiced utilizing powers in close quarters, learning techniques that grant you the following benefits:</p>\n<ul>\n<li>When making a ranged force or tech attack while you are within 5 feet of a hostile creature, you do not have disadvantage on the attack roll.</li>\n<li>Your ranged force and tech attacks ignore half cover and three-quarters cover against targets within 30 feet of you.</li>\n<li>You learn one at-will power that requires an attack roll. Your casting ability for this at-will power depends on the power list you chose from: Wisdom or Charisma (depending on power alignment) for force powers or Intelligence for tech powers.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4600000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Close%20Quarters%20Caster.webp","effects":[]}
{"_id":"VUliXV0a3Owu4yuI","name":"Sidearm Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You master the blaster pistol, heavy pistol, hold out, ion pistol, light pistol, and wrist launcher. You gain the following benefits while wielding any of these weapons, if you are proficient with it:</p>\n<ul>\n<li>You gain a +1 bonus to the weapon's attack rolls.</li>\n<li>You learn to load and fire your weapon more efficiently. You can now reload these weapons using your object interaction. You must have one free hand to reload.</li>\n<li>Whenever you score a critical hit against a living creature that has a head, you can attempt to daze the target. If the target is no more than one size larger than you (your size or smaller if your weapon has the light property), it must succeed on a Constitution saving throw (DC = 8 + your proficiency bonus + your Dexterity modifier) or be stunned until the end of its next turn.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5100000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Sidearm%20Specialist.webp","effects":[]}
@ -47,19 +71,25 @@
{"_id":"XRtb4NmElyRsERrk","name":"Adaptive Training","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> at least 3 levels in Fighter</em><br />You've developed a new fluidity to your training and practice, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>Whenever you complete a long rest, you can replace a fighting style you know with another style available. You can't take a Fighting Style option more than once, even if you later get to choose again.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":1400000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Adaptive%20Training.webp","effects":[]}
{"_id":"Xqo6KzAFPtLdW9YS","name":"Moderately Armored","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> proficiency with light armor</em></p>\n<p>You have trained to master the use of medium armor, gaining the following benefits:</p>\n<ul>\n<li>Increase your Strength, Dexterity, or Constitution score by 1, to a maximum of 20.</li>\n<li>You gain proficiency with medium armor. If you are already proficient with medium armor, instead while you are wearing medium armor, you can add 3, rather than 2, to your AC if you have a Dexterity of 16 or higher, and you ignore the bulky property of medium armor. You can take this feat twice.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":6700000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.traits.armorProf.value","value":"med","mode":"+","targetSpecific":false,"id":1,"itemId":"Xqo6KzAFPtLdW9YS","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Moderately%20Armored.webp","effects":[{"_id":"hVw642GA8nqxgTYs","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.traits.armorProf.value","value":"med","mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Moderately%20Armored.webp","label":"Moderately Armored","tint":"","transfer":true}]}
{"_id":"XuhxzosKJIBWpWHU","name":"Savage Shorty","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Strength 13, size Small</em></p>\n<p>Despite being short of stature, your size has no impact on your strength and virility. You gain the following benefits:</p>\n<ul>\n<li>Increase your Strength score by 1, to a maximum of 20.</li>\n<li>Your speed increases by 5 feet.</li>\n<li>You lose the Undersized special trait.</li>\n</ul>","chat":"","unidentified":""},"source":"WH","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5400000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.str.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"XuhxzosKJIBWpWHU","active":false,"_targets":[],"label":"Abilities Strength"},{"modSpecKey":"data.attributes.speed.value","value":"5","mode":"+","targetSpecific":false,"id":2,"itemId":"XuhxzosKJIBWpWHU","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Savage%20Shorty.webp","effects":[{"_id":"CHCJWZiArjnqXHw8","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.str.value","value":1,"mode":2,"priority":20},{"key":"data.attributes.movement.walk","value":5,"mode":2,"priority":20},{"key":"flags.sw5e.undersized","value":"0","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Savage%20Shorty.webp","label":"Savage Shorty","tint":"","transfer":true}]}
{"_id":"Y1yahP9p3hjHhkdr","name":"Berserker Calling","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in berserker and at least 3 levels in sentinel</em></p>\n<p>You've learned to blend the fury of your berserker approach with the focus of your sentinel calling. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your sentinel levels to your berserker levels when determining the number of times you can enter a rage and the bonus to weapon damage rolls while raging.</li>\n<li>You can add your berserker levels to your sentinel levels when determining the size of your Kinetic Combat die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Berserker 3, Sentinel 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.RaDxJhWDPl8wyLT6"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Berserker%20Calling.webp","effects":[]}
{"_id":"YDi1dnNHdD3vC9A5","name":"Operative Calling","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in operative and at least 3 levels in sentinel</em></p>\n<p>You've learned to blend the deftness of your operative practice with the focus of your sentinel calling. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your sentinel levels to your operative levels when determining the your amount of Sneak Attack dice.</li>\n<li>You can add your operative levels to your sentinel levels when determining the size of your Kinetic Combat die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Operative 3, Sentinel 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.X5INTWleQncJNx4P"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Operative%20Calling.webp","effects":[]}
{"_id":"YJOdr43nmsPXAxp3","name":"Naturalist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Your extensive study of nature rewards you with the following benefits:</p>\n<ul>\n<li>Increase your Intelligence score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Nature skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>You learn the <em>toxin scan</em> tech power. You can cast it once, using supplies scavenged around you, without the use of a wristpad and without spending tech points, and you regain the ability to do so when you finish a long rest.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":3100000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.int.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"YJOdr43nmsPXAxp3","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.skills.nat.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"YJOdr43nmsPXAxp3","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Naturalist.webp","effects":[{"_id":"kNRVYakcEKDM7tl5","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.int.value","value":1,"mode":2,"priority":20},{"key":"data.skills.nat.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Naturalist.webp","label":"Naturalist","tint":"","transfer":true}]}
{"_id":"YfISDL99fjJ9WYy3","name":"Focused Vitality","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> at least 3 levels in Monk</em></p>\n<p>You've learned to harness your focus to restore yourself, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>As an action, you can spend 2 focus points and roll a Martial Arts die. You regain a number of hit points equal to the amount rolled + your Wisdom or Charisma modifier (your choice, a minimum of one).</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":7800000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Focused%20Vitality.webp","effects":[]}
{"_id":"YhvSSzW56SuR7Kja","name":"Casting Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> The ability to cast force or tech powers</em><br />Choose one from force- or tech-casting. You've mastered your chosen casting type, gaining the following benefits:</p>\n<ul>\n<li>You gain a +1 bonus to your force or tech save DC and your force or tech attack modifier.</li>\n<li>Once per turn, when you cast a power that requires an attack roll or saving throw, you can have advantage on one attack roll, or you can force one creature affected by the power to have advantage or disadvantage on the saving throw (your choice). Once you've used this feature on a power, you can't affect that power again until you complete a short or long rest. Once you've used this feature on a creature, you can't do so again until you complete a short or long rest.</li>\n<li>Once per turn, when you cast a power that doesn't require an ability check, attack roll, or saving throw, but requires a die roll, you can choose the maximum or minimum on the die (your choice). If the power requires rolling multiple dice, you can only affect a number of them equal to half your proficiency bonus (rounded up) in this way. Once you've used this feature on a power, you can't affect that power again until you complete a short or long rest.</li>\n</ul>\n<p>You can select this feat twice. Each time you do so, you must choose a different casting type.</p>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":500000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Casting%20Specialist.webp","effects":[]}
{"_id":"YrUXpp1j01lHSmxG","name":"Blade Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You master the doubleblade, doublesaber, doubleshoto, doublesword, hidden blade, lightdagger, lightfoil, lightsaber, martial lightsaber, shotosaber, techblade, vibroblade, vibrodagger, and vibrorapier. You gain the following benefits while wielding any of these weapons, if you are proficient with it:</p>\n<ul>\n<li>You gain a +1 bonus to the weapon's attack rolls.</li>\n<li>As a bonus action, you can take a parrying stance. While you are in this stance and you aren't wielding a shield, you gain a bonus to AC equal to half your proficiency bonus (rounded up) until the start of your next turn.</li>\n<li>Your critical hit range increases by 1.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":null,"condition":""},"duration":{"value":null,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"assumes a parrying stance.","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":false},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":400000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Blade%20Specialist.webp","effects":[]}
{"_id":"ZIX11ft9mTmdu6uR","name":"Guardian Practice","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in guardian and at least 3 levels in operative</em></p>\n<p>You've learned to blend the expertise of your guardian focus with the deftness of your operative practice. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your operative levels to your guardian levels when determining the your amount of Focused Strikes dice.</li>\n<li>You can add your guardian levels to your operative levels when determining the your amount of Sneak Attack dice.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Guardian 3, Operative 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.ZUmfvHVtgqKkRBnG"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Guardian%20Practice.webp","effects":[]}
{"_id":"a4Id4dk3ov3dYw7X","name":"Polearm Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You master the lightsaber pike, saberspear, vibrolance, vibropike, and vibrospear. You gain the following benefits while wielding any of these weapons, if you are proficient with it:</p>\n<ul>\n<li>You gain a +1 bonus to the weapon's attack rolls.</li>\n<li>When you take the Attack action, you can use a bonus action to make a melee attack with the opposite end of the weapon. The weapon's damage die for this attack is a d4, and the attack deals kinetic damage. If the weapon has the reach property, the bonus action attack does not benefit from this property.</li>\n<li>When you take the Attack action, you can choose to forgo one of your attacks. If you do so, your reach increases by 5 feet until the start of your next turn.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":6000000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Polearm%20Specialist.webp","effects":[]}
{"_id":"aYMhiCMRBwH1WomL","name":"Linguist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have studied languages and codes, gaining the following benefits:</p>\n<ul>\n<li>Increase your Intelligence score by 1, to a maximum of 20.</li>\n<li>You learn three languages of your choice.</li>\n<li>You can ably create written ciphers. Others can&rsquo;t decipher a code you create unless you teach them, they succeed on an Intelligence check (DC = your Intelligence score + your proficiency bonus), or they use a power to decipher it.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":100000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.int.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"aYMhiCMRBwH1WomL","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Linguist.webp","effects":[{"_id":"zLgsiHPBheUMr83I","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.int.value","value":1,"mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Linguist.webp","label":"Linguist","tint":"","transfer":true}]}
{"_id":"ai5BTh0VA5FpLVtu","name":"Force Guidance","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> The ability to cast force powers</em></p>\n<p>You've learned to utilize your gift with the Force in a specific, unique way. You gain the following benefits:</p>\n<ul>\n<li>Increase your Wisdom or Charisma score by 1, to a maximum of 20.</li>\n<li>Choose a skill or tool in which you are proficient. When you make an ability check with the chosen skill or tool, you can add half your Wisdom or Charisma modifier (your choice, rounded down, minimum of one) to the check if it doesn't already include that modifier. You can use this feature a number of times equal to your Wisdom or Charisma modifier (your choice, a minimum of once). You regain all expended uses when you complete a long rest. You can select this feat multiple times. Each time you do so, you must choose a different skill or tool.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":2800000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Force%20Guidance.webp","effects":[]}
{"_id":"aiwPy0S7ZqsaT6k6","name":"Investigative Attunement","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've spent a significant amount of time appraising and testing enhanced items. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>Your maximum attunement increases by 1.</li>\n<li>You have advantage on ability checks made to identify items.</li>\n<li>Once per long rest, you can choose one object that you must touch for 10 minutes. If it is an enhanced or modified item, you learn its properties and how to use them, whether it requires attunement to use, and how many charges it has, if any. You learn whether any powers are affecting the item and what they are. If the item was created by a power, you learn which power created it.</li>\n</ul>","chat":"","unidentified":""},"source":"WH","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"},"requirements":"4th Level","recharge":{"value":null,"charged":false}},"folder":"dFnKIJCGmpjqdA2C","sort":200000,"flags":{"dae":{"activeEquipped":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Investigative%20Attunement.webp","effects":[]}
{"_id":"aujuUebb7f4e6ht8","name":"Threatening","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You become fearsome to others, gaining the following benefits:</p>\n<ul>\n<li>Increase your Charisma score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Intimidation skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>When you take the Attack action, you can replace one attack with an attempt to demoralize one humanoid you can see within 30 feet of you that can see and hear you. Make a Charisma (Intimidation) check contested by the target's Wisdom (Insight) check. If your check succeeds, the target is frightened until the end of your next turn. If your check fails, the target can't be frightened by you in this way for 1 hour.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4859375,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"aujuUebb7f4e6ht8","active":false,"_targets":[],"label":"Abilities Charisma"},{"modSpecKey":"data.skills.itm.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"aujuUebb7f4e6ht8","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Threatening.webp","effects":[{"_id":"Kfcq63ZkU7F18kAq","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.cha.value","value":1,"mode":2,"priority":20},{"key":"data.skills.itm.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Threatening.webp","label":"Threatening","tint":"","transfer":true}]}
{"_id":"b9zeujIB00aVQNHR","name":"Fighter Order","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in fighter and at least 3 levels in monk</em></p>\n<p>You've learned to blend the prowess of your fighter specialty with the aptitude of your monastic order. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your monk levels to your fighter levels when determining the number of hit points you regain from your Second Wind feature.</li>\n<li>You can add your fighter levels to your monk levels when determining the size of your Martial Arts die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Fighter 3, Monk 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.RmbvRCmkrrWnTQlz"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Fighter%20Order.webp","effects":[]}
{"_id":"bsAJp6ZshCSLzzLV","name":"Consular Discipline","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in consular and at least 3 levels in engineer</em></p>\n<p>You've learned to blend the diligence of your consular tradition with the artistry of your engineering discipline. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add half your engineer levels (rounded down) to half your consular levels (rounded down) when determining the force points you regain through your Force Recovery feature.</li>\n<li>You can add your consular levels to your engineer levels when determining the size of your Potent Aptitude die and the number of uses of your Potent Aptitude feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Consular 3, Engineer 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.cApmdw3Cr3n4uzi1"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Consular%20Discipline.webp","effects":[]}
{"_id":"cHFXtjcgWLkCTAea","name":"Heavily Armored","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have trained to master the use of heavy armor, gaining the following benefits:</p>\n<ul>\n<li>Increase your Strength, Dexterity, or Constitution score by 1, to a maximum of 20.</li>\n<li>You gain proficiency with heavy armor. If you are already proficient with heavy armor, instead while you are wearing heavy armor, critical hits made against you are treated as normal hits. You can take this feat twice.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"Proficiency with medium armor","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":7500000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.traits.armorProf.value","value":"hvy","mode":"+","targetSpecific":false,"id":1,"itemId":"cHFXtjcgWLkCTAea","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Heavily%20Armored.webp","effects":[{"_id":"F9EYBpeBtVSmcmc0","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.traits.armorProf.value","value":"hvy","mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Heavily%20Armored.webp","label":"Heavily Armored","tint":"","transfer":true}]}
{"_id":"ccsjgZgwSyw3r0on","name":"Exalted Awareness","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><strong><em>Prerequisite:</em></strong> <em>Wisdom 20</em></p>\n<p>You have the wisdom associated with the most renowned masters of the Force, granting the following benefits:</p>\n<ul>\n<li>You gain proficiency in Wisdom saving throws. If you are already proficient in them, you add double your proficiency bonus to Wisdom saving throws you make.</li>\n<li>Creatures within 60 feet of you have disadvantage on Dexterity (Stealth) checks made to hide from you.</li>\n<li>As an action, you can sense the presence of illusions and other effects designed to deceive the senses within 30 feet of you, provided that you aren't blinded or deafened. You sense that an effect is trying to trick you, but you gain no insight into what is hidden or its true nature. Once you've used this feature, you must complete a short or long rest before you can use it again.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"Level 12","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":8100000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Exalted%20Awareness.webp","effects":[{"_id":"xqw5n8lT98H50eTg","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.wis.proficient","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Exalted%20Awareness.webp","label":"Exalted Awareness","tint":"","transfer":true}]}
{"_id":"ckcrU1ZRdKmq4hQY","name":"Fanatic","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Every blow that hits your enemies makes you feel closer to victory, making you shake in excitement. You gain the following benefits:</p>\n<ul>\n<li>When you score a critical hit with an attack roll or reduce a creature to 0 hit points, you can make one weapon attack as a bonus action.</li>\n<li>Whenever a creature you can see within 30 feet is reduced to 0 hit points, you go into a fervor gaining temporary hit points equal to 1d4 + your Constitution modifier.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":3600000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Fanatic.webp","effects":[]}
{"_id":"cnf7zry702QLzotX","name":"Meditative Mindfulness","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> at least 3 levels in Consular</em></p>\n<p>You've delved to new depths during your meditation, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>When you complete a long rest, you can choose one of the force powers you know and replace it with another force power, as long as that power is not of a higher level than your Max Power Level.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":3500000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Meditative%20Mindfulness.webp","effects":[]}
{"_id":"d1pDbJMTf0LzVHOp","name":"Engineering Technique","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in engineer and at least 3 levels in scout</em></p>\n<p>You've learned to blend the artistry of your engineering discipline with the knack of your scout technique. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scout levels to your engineer levels when determining the size of your Potent Aptitude die and the number of uses of your Potent Aptitude feature.</li>\n<li>You can add your engineer levels to your scout levels when determining the size of your Ranger's Quarry die and the duration of your Ranger's Quarry feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Engineer 3, Scout 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.RDYbHaQ4yEUusQXy"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Engineering%20Technique.webp","effects":[]}
{"_id":"dAmUh0ASLU1xshOs","name":"Combat Caster","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> The ability to cast force or tech powers</em><br />You've practiced making your powers more difficult to avoid, learning techniques that grant you the following benefits:</p>\n<ul>\n<li>When a creature rolls a 1 on the d20 roll of a saving throw against a power you cast that deals damage, they instead take the highest number possible for the damage die.</li>\n<li>You learn one at-will power that requires a saving throw. Your casting ability for this at-will power depends on the power list you chose from: Wisdom or Charisma (depending on power alignment) for force powers or Intelligence for tech powers.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4400000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Combat%20Caster.webp","effects":[]}
{"_id":"dQzURN2q97jG47Qo","name":"Quick Caster","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> The ability to cast force or tech powers</em><br />You've practiced casting powers in quick succession, learning techniques that grant you the following benefits:</p>\n<ul>\n<li>When you cast a power with a casting time of a bonus action, you may use your action to cast a power with a power level no higher than half your proficiency bonus (rounded down).</li>\n<li>When you cast a power with a casting time of a bonus action, you can cast it without expending force or tech points as long as it is no higher level than your proficiency bonus. Once you've used this feature, you must complete a long rest before you can use it again.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5700000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Quick%20Caster.webp","effects":[]}
{"_id":"dSjQBf5jwukcGDfY","name":"Force-Sensitive","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"You know two at-will force powers. When you reach 3rd level, you learn one 1st-level force power, which you can cast once per long rest. When you reach 5th level, you learn one 2nd-level force power, which you can once per long rest. Your forcecasting ability is Wisdom or Charisma (depending on power alignment). Additionally, you lose the Force-Insensitive special trait if you have it.\r\n","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"Humanoid type","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":2000000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Force-Sensitive.webp","effects":[]}
@ -67,26 +97,36 @@
{"_id":"dYGd07LLEJu5RKzH","name":"Trip Weapon Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You master the chakram, light ring, net, saberwhip, vibrobaton, vibrostaff, and vibrowhip. You gain the following benefits while wielding any of these weapons, if you are proficient with it:</p>\n<ul>\n<li>You gain a +1 bonus to the weapon's attack rolls.</li>\n<li>As a bonus action on your turn, you can extend your weapon to sweep around and pull down an opponent's shield. Until the end of that creature's next turn, it gains no benefit to armor class from its shield.</li>\n<li>When you score a critical hit with the weapon or hit with an opportunity attack using the weapon, you can attempt to trip the opponent as well. If the target is no more than one size larger (your size or smaller if your weapon has the light property), it must succeed on a Strength saving throw (DC = 8 + your proficiency bonus + your choice of either your Strength or Dexterity modifier) or be knocked prone.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5009375,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Trip%20Weapon%20Specialist.webp","effects":[]}
{"_id":"drXPCTuKznN8IXBN","name":"Versatile Design","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've learned to approach problems from new angles, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>When you complete a long rest, you can choose one of the maneuvers you know and replace it with another one.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"at least 3 levels in scholar","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5003125,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Versatile%20Design.webp","effects":[]}
{"_id":"eqBlqioFPauxq798","name":"Cunning Intellect","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have the cunning of the most prolific scholars, granting the following benefits:</p>\n<ul>\n<li>You gain proficiency in Intelligence saving throws. If you are already proficient in them, you add double your proficiency bonus to Intelligence saving throws you make.</li>\n<li>When you engage in the Training downtime activity, during resolution, you add your proficiency bonus to the check. If you would already add your proficiency bonus, you instead add twice your proficiency bonus.</li>\n<li>Whenever you make an ability check that uses your Intelligence, you can add half your proficiency bonus (rounded down) if it doesn't already include your proficiency bonus. Additionally, if you roll lower than half your level (rounded down) on an Intelligence check, you can instead use your level for the d20 roll.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"Intelligence 20, level 12","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":1900000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Cunning%20Intellect.webp","effects":[{"_id":"2EHzbhc7iENQNBsV","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.int.proficient","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Cunning%20Intellect.webp","label":"Cunning Intellect","tint":"","transfer":true}]}
{"_id":"fTOsaaqdK8stdXnl","name":"Consular Practice","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in consular and at least 3 levels in operative</em></p>\n<p>You've learned to blend the diligence of your consular tradition with the deftness of your operative practice. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add half your operative levels (rounded down) to half your consular levels (rounded down) when determining the force points you regain through your Force Recovery feature.</li>\n<li>You can add your consular levels to your operative levels when determining the your amount of Sneak Attack dice.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Consular 3, Operative 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.OXJNuzpsjNI0CfFI"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Consular%20Practice.webp","effects":[]}
{"_id":"fohQLLoe5AnkvvaC","name":"Medic","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You master the physician's arts, gaining the following benefits:</p>\n<ul>\n<li>Increase your Wisdom score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Medicine skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>During a short rest, you can clean and bind the wounds of up to six willing beasts and humanoids. Make a DC 15 Wisdom (Medicine) check for each creature. On a success, if a creature spends a Hit Die during this rest, that creature can forgo the roll and instead regain the maximum number of hit points the die can restore. A creature can do so only once per rest, regardless of how many Hit Dice it spends.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":7000000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.wis.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"fohQLLoe5AnkvvaC","active":false,"_targets":[],"label":"Abilities Wisdom"},{"modSpecKey":"data.skills.med.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"fohQLLoe5AnkvvaC","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Medic.webp","effects":[{"_id":"vKn9c9xUN31ay9MD","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.wis.value","value":1,"mode":2,"priority":20},{"key":"data.skills.med.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Medic.webp","label":"Medic","tint":"","transfer":true}]}
{"_id":"fz4xeG1EtHJNBHQy","name":"Bountiful Luck","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"Your people have extraordinary luck, which you have learned to lend to your companions when you see them falter. You're not sure how you do it; you just wish it, and it happens. Surely a sign of fortune's favor!\r\n\r\nWhen an ally you can see within 30 feet of you rolls a 1 on the d20 for an attack roll, an ability check, or a saving throw, you can use your reaction and expend 1 luck point to let the ally reroll the die. The ally must use the new roll.\r\n\r\nWhen you use this ability, you can't use luck points before the end of your next turn. \r\n","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"Lucky feat","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":800000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Bountiful%20Luck.webp","effects":[]}
{"_id":"gQDk0fGDlFDVl9Uj","name":"Inspiring Leader","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Charisma 13</em></p>\n<p>You can spend 10 minutes inspiring your companions, shoring up their resolve to fight. When you do so, choose up to six friendly creatures (which can include yourself) within 30 feet of you who can see or hear you and who can understand you. Each creature can gain temporary hit points equal to your level + your Charisma modifier. A creature can't gain temporary hit points from this feat again until it has finished a short or long rest.</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":7400000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Inspiring%20Leader.webp","effects":[]}
{"_id":"guQgLKcAZKrOlUbw","name":"Berserker Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in berserker and at least 3 levels in fighter</em></p>\n<p>You've learned to blend the fury of your berserker approach with the prowess of your fighter specialty. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your fighter levels to your berserker levels when determining the number of times you can enter a rage and the bonus to weapon damage rolls while raging.</li>\n<li>You can add your berserker levels to your fighter levels when determining the number of hit points you regain from your Second Wind feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Berserker 3, Fighter 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.6OICyPI98KcygVd2"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Berserker%20Specialist.webp","effects":[]}
{"_id":"h9fsZnfh6RP9PiZv","name":"Dual Focused Caster","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> The ability to cast force or tech powers</em><br />You have learned to bifurcate your attention while concentrating on powers, learning techniques that grant you the following benefits:</p>\n<ul>\n<li>If you attempt to cast a power that requires concentration while already concentrating on an existing power, you can maintain concentration on both powers simultaneously. You must spend your action each subsequent round on maintaining this concentration, or lose concentration for both powers.</li>\n<li>At the end of each of your turns where you have two powers you are concentrating on, you must make a Constitution saving throw (DC equals 10 + the number of complete rounds you've been concentrating on two powers). On a failure, you lose concentration for both powers. You can drop concentration on one of your powers during your turn as a free action to avoid this saving throw.</li>\n<li>Any time you would be forced to make a Constitution saving throw to maintain concentration due to taking damage, the DC equals 10 + both powers' levels combined, or half the damage you take, whichever number is higher. On a failure, you lose concentration on both powers.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4000000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Dual%20Focused%20Caster.webp","effects":[]}
{"_id":"iEFbSjp7DaDSo8Az","name":"Tough","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Durable feat</em><br />You have the blood of heroes flowing through your veins. You gain the following benefits:</p>\n<ul>\n<li>Increase your Constitution score by 1, to a maximum of 20.</li>\n<li>Whenever you take the Dodge action in combat, you can spend one Hit Die to heal yourself. Roll the die, add your Constitution modifier, and regain a number of hit points equal to the total (minimum of one).</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5006250,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.con.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"iEFbSjp7DaDSo8Az","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Tough.webp","effects":[{"_id":"UovKMdzYexo4tN49","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.con.value","value":1,"mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Tough.webp","label":"Tough","tint":"","transfer":true}]}
{"_id":"ig8TPZw7mt3jQqbi","name":"Tireless Outrider","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've pushed yourself past the limits of your endurance, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>As an action, you can reduce your exhaustion level by 1 and give yourself a number of temporary hit points equal to 1d10 + your Intelligence modifier. Once you've used this feature, you must complete a short or long rest before you can use it again.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"at least 3 levels in scout","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4853125,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Tireless%20Outrider.webp","effects":[]}
{"_id":"iiZ66oT6lIqkrOGk","name":"Weapon Expert","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have practiced extensively with a variety of weapons, gaining the following benefits:</p>\n<ul>\n<li>Increase your Strength, Dexterity, or Constitution score by 1, to a maximum of 20.</li>\n<li>You gain proficiency with all blasters, lightweapons, and vibroweapons. If you are already proficient with all blasters, lightweapons or vibroweapons, instead once per turn when you roll damage for a weapon attack using a weapon from a category in which you are proficient with all weapons, you can reroll the weapon's damage dice and use either total.</li>\n</ul>\n<p>You can take this feat twice.</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5007813,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.traits.weaponProf.custom","value":"all blasters","mode":"+","targetSpecific":false,"id":1,"itemId":"iiZ66oT6lIqkrOGk","active":false,"_targets":[],"label":"Traits Weapon Prof. Custom"},{"modSpecKey":"data.traits.weaponProf.custom","value":"all lightweapons","mode":"+","targetSpecific":false,"id":2,"itemId":"iiZ66oT6lIqkrOGk","active":false,"_targets":[],"label":"Traits Weapon Prof. Custom"},{"modSpecKey":"data.traits.weaponProf.custom","value":"all vibroweapons","mode":"+","targetSpecific":false,"id":3,"itemId":"iiZ66oT6lIqkrOGk","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Weapon%20Expert.webp","effects":[{"_id":"0d8iTrYN5SNWLeSw","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.traits.weaponProf.custom","value":"All blasters","mode":0,"priority":20},{"key":"data.traits.weaponProf.custom","value":"All lightweapons","mode":0,"priority":20},{"key":"data.traits.weaponProf.custom","value":"All vibroweapons","mode":0,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Weapon%20Expert.webp","label":"Weapon Expert","tint":"","transfer":true}]}
{"_id":"is9NhgvKUfV5NVH6","name":"Consular Pursuit","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in consular and at least 3 levels in scholar</em></p>\n<p>You've learned to blend the diligence of your consular tradition with the ingenuity of your academic pursuit. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add half your scholar levels (rounded down) to half your consular levels (rounded down) when determining the force points you regain through your Force Recovery feature.</li>\n<li>You can add your consular levels to your scholar levels when determining the size of your Superiority Dice and the number of Superiority Dice you have.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Consular 3, Scholar 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.V0iEh39aJBObs8In"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Consular%20Pursuit.webp","effects":[]}
{"_id":"jMPN2LnxjNg46CxC","name":"Consular Focus","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in consular and at least 3 levels in guardian</em></p>\n<p>You've learned to blend the diligence of your consular tradition with the expertise of your guardian focus. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add half your guardian levels (rounded down) to half your consular levels (rounded down) when determining the force points you regain through your Force Recovery feature.</li>\n<li>You can add your consular levels to your guardian levels when determining the your amount of Focused Strikes dice.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Consular 3, Guardian 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.thjuCV6repW18epv"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Consular%20Focus.webp","effects":[]}
{"_id":"jjAqimaLDJ9GoSSL","name":"Customized Droid","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've been customized beyond other droids of the same model, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>Choose one droid customization of standard rarity from Appendix A. That customization is installed and doesn't count against the maximum droid customizations you can support, but it does count towards your maximum parts as shown in the Droid Size Maximum Parts table in Chapter 7.</li>\n</ul>","chat":"","unidentified":""},"source":"WH","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"Class I, II, III, IV, or V Droid","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4800000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Customized%20Droid.webp","effects":[]}
{"_id":"k316FEnj9NARisTU","name":"Expert Potency","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> at least 3 levels in Engineer</em></p>\n<p>You've obtained new ways to assist your allies, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>When a creature has a Potent Aptitude die from you and casts a power, they can roll the die and add the number rolled to one damage or healing roll of the power. If the power would damage or heal multiple targets, this bonus only applies to one of them. The Potent Aptitude die is then lost.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":3400000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Expert%20Potency.webp","effects":[]}
{"_id":"kA8vKWxoDgglIqoT","name":"Engineering Practice","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in engineer and at least 3 levels in operative</em></p>\n<p>You've learned to blend the artistry of your engineering discipline with the deftness of your operative practice. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your operative levels to your engineer levels when determining the size of your Potent Aptitude die and the number of uses of your Potent Aptitude feature.</li>\n<li>You can add your engineer levels to your operative levels when determining the your amount of Sneak Attack dice.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Engineer 3, Operative 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.KmGNI9KR5OLW7Fcx"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Engineering%20Practice.webp","effects":[]}
{"_id":"kQq2eVcVFgDBbH4a","name":"Berserker Technique","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in berserker and at least 3 levels in scout</em></p>\n<p>You've learned to blend the fury of your berserker approach with the knack of your scout technique. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scout levels to your berserker levels when determining the number of times you can enter a rage and the bonus to weapon damage rolls while raging.</li>\n<li>You can add your berserker levels to your scout levels when determining the size of your Ranger's Quarry die and the duration of your Ranger's Quarry feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Berserker 3, Scout 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.zfIrcRQFcK2rPGgT"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Berserker%20Technique.webp","effects":[]}
{"_id":"kbN0CSXPaTs3mfan","name":"Mounted Caster","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> The ability to cast force or tech powers</em><br />You are trained in the use of powers while mounted. While you are mounted and aren't incapacitated, you gain the following benefits:</p>\n<ul>\n<li>When you cast a power targeting yourself, you can also affect your mount with the power.</li>\n<li>You have advantage on melee force or tech attack rolls against any unmounted creature that is smaller than your mount.</li>\n<li>If your mount is subjected to an effect that allows it to make a Dexterity saving throw to take only half damage, it instead takes no damage if it succeeds on the saving throw, and only half damage if it fails.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":6900000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Mounted%20Caster.webp","effects":[]}
{"_id":"l16JW8IL3N6NSivU","name":"War Caster","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> The ability to cast force or tech powers</em><br />You've practiced casting powers in the midst of combat, learning techniques that grant you the following benefits:</p>\n<ul>\n<li>You have advantage on Constitution saving throws that you make to maintain your concentration on a power when you take damage.</li>\n<li>Once per round, when a hostile creature provokes an opportunity attack from you, you can use your reaction to cast a power at the creature, rather than making an opportunity attack. The power must have a casting time of 1 action and must target only that creature.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5004688,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/War%20Caster.webp","effects":[]}
{"_id":"lWHtIoW012u1QQ53","name":"Resilient","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Choose one ability score. You gain the following benefits:</p>\n<ul>\n<li>Increase the chosen ability score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in saving throws using the chosen ability.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":3900000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Resillient.webp","effects":[]}
{"_id":"ltPootGTI5v8QQt5","name":"Engineering Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in engineer and at least 3 levels in fighter</em></p>\n<p>You've learned to blend the artistry of your engineering discipline with the prowess of your fighter specialty. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your fighter levels to your engineer levels when determining the size of your Potent Aptitude die and the number of uses of your Potent Aptitude feature.</li>\n<li>You can add your engineer levels to your fighter levels when determining the number of hit points you regain from your Second Wind feature.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Engineer 3, Fighter 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.8kCUSHU652rm4dPP"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Engineering%20Specialist.webp","effects":[]}
{"_id":"m5FKO0ltZGdxtadH","name":"Entertainer","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have a natural gift for performing and competing. Select one gaming set or musical instrument. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the chosen gaming set or musical instrument. If you are already proficient with it, you instead gain expertise with it.</li>\n<li>While playing your chosen instrument or game, you can always readily read the emotions of those paying attention to you. During this time, and for up to one minute after completing, you have advantage on Wisdom (Insight) checks to read the emotions of those you performed for or competed against. You can select this feat multiple times. Each time you do so, you must choose a different gaming set or musical instrument.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":8000000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Entertainer.webp","effects":[]}
{"_id":"mL4kwXiLiD40nd9F","name":"Fighter Calling","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in fighter and at least 3 levels in sentinel</em></p>\n<p>You've learned to blend the prowess of your fighter specialty with the focus of your sentinel calling. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your sentinel levels to your fighter levels when determining the number of hit points you regain from your Second Wind feature.</li>\n<li>You can add your fighter levels to your sentinel levels when determining the size of your Kinetic Combat die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Fighter 3, Sentinel 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.8ADMRtN9xHXMZwOK"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Fighter%20Calling.webp","effects":[]}
{"_id":"mNHz5us4zXnegeR5","name":"Companion Keeper","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You gain the services of a companion. Choose one of the companion nature options, detailed later in this chapter.</p>","chat":"","unidentified":""},"source":"EC","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"},"requirements":"4th Level","recharge":{"value":null,"charged":false}},"folder":"dFnKIJCGmpjqdA2C","sort":5200000,"flags":{},"img":"systems/sw5e/packs/Icons/Feats/Companion%20Keeper.webp","effects":[]}
{"_id":"oYWQbjFyCZpWezpT","name":"Berserker Pursuit","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in berserker and at least 3 levels in scholar</em></p>\n<p>You've learned to blend the fury of your berserker approach with the ingenuity of your academic pursuit. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your scholar levels to your berserker levels when determining the number of times you can enter a rage and the bonus to weapon damage rolls while raging.</li>\n<li>You can add your berserker levels to your scholar levels when determining the size of your Superiority Dice and the number of Superiority Dice you have.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Berserker 3, Scholar 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.QKGpLrjG9Ms6ochb"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Berserker%20Pursuit.webp","effects":[]}
{"_id":"odprUVlMYRnJ4OOJ","name":"Dungeon Delver","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Alert to the hidden traps and secret doors found in many dungeons, you gain the following benefits:</p>\n<ul>\n<li>Increase your Intelligence or Wisdom score by 1, to a maximum of 20.</li>\n<li>You have advantage on Wisdom (Perception) and Intelligence (Investigation) checks made to detect the presence of secret doors.</li>\n<li>You have advantage on saving throws made to avoid or resist traps.</li>\n<li>You have resistance to the damage dealt by traps.</li>\n<li>You can search for traps while traveling at a normal pace, instead of only at a slow pace.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":1800000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Dungeon%20Delver.webp","effects":[]}
{"_id":"ozWdapIWplYGXv7g","name":"Snappy Interjection","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've mastered a quick tongue to aid your allies. You gain the following benefits:</p>\n<ul>\n<li>Increase your Charisma score by 1, to a maximum of 20.</li>\n<li>Once per short or long rest, when an ally makes an attack roll, an ability check or a saving throw, you can spend your reaction to give them advantage on the roll.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4850000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"ozWdapIWplYGXv7g","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Snappy%20Interjection.webp","effects":[{"_id":"h2MlptVtQI3R91ye","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.cha.value","value":1,"mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Snappy%20Interjection.webp","label":"Snappy Interjection","tint":"","transfer":true}]}
{"_id":"p22Fu1TzzQ0zG6KI","name":"Climber","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You excel at scaling cliffsides, hills, trees, and general climbing. You gain the following benefits:</p>\n<ul>\n<li>Increase your Strength score by 1, to a maximum of 20.</li>\n<li>You gain a climbing speed equal to your movement speed.</li>\n<li>You have advantage on ability checks and saving throws to avoid falling off or down while climbing.</li>\n<li>You can spend 5 minutes instructing, pointing out handholds, and guiding other creatures before making a climb. When you do so, choose up to six friendly creatures (which can include yourself) within 30 feet of you. Each creature can add a 1d6 to any ability check or saving throw they make for that climb.</li>\n</ul>","chat":"","unidentified":""},"source":"WH","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":1700000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.str.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"p22Fu1TzzQ0zG6KI","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Climber.webp","effects":[{"_id":"zt1XYCCaDg29dB35","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.str.value","value":1,"mode":2,"priority":20},{"key":"data.attributes.movement.climb","value":"(@attributes.movement.walk)","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Climber.webp","label":"Climber","tint":"","transfer":true}]}
{"_id":"p9p9uvgtw0as7ecU","name":"Relentless Pursuer","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> at least 3 levels in berserker</em></p>\n<p>You've harnessed a new level of persistence, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>When a creature ends its turn within 15 feet of you, you can use your reaction to move up to half your speed to a space closer to the creature. This movement doesn't provoke opportunity attacks.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5600000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Relentless%20Pursuer.webp","effects":[]}
{"_id":"q7ahgoAYWA5ghy81","name":"Tiny Terror","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Strength 13, size Tiny</em><br />Despite falling below knee height of other species, your size has less impact on your strength and virility. You gain the following benefits:</p>\n<ul>\n<li>Increase your Strength score by 1, to a maximum of 20.</li>\n<li>Your speed increases by 5 feet.</li>\n<li>You lose the Pintsized special trait, and you are no longer limited to +3 when determing your bonus to attack and damasge rolls for weapon attacks using Strength due to the Puny special trait.</li>\n<li>You gain the Undersized special trait:<br /><br /><strong><em>Undersized.</em></strong> Your small stature makes it hard for you to wield bigger weapons. You can't use heavy shields or martial weapons with the two-handed property unless it has the light property, and if a martial weapon has the versatile property, you can only wield it in two-hands.</li>\n</ul>","chat":"","unidentified":""},"source":"WH","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5012500,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.str.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"q7ahgoAYWA5ghy81","active":false,"_targets":[],"label":"Abilities Strength"},{"modSpecKey":"data.attributes.speed.value","value":"5","mode":"+","targetSpecific":false,"id":2,"itemId":"q7ahgoAYWA5ghy81","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Tiny%20Terror.webp","effects":[{"_id":"UDRjGgS1kz9N91VB","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.str.value","value":1,"mode":2,"priority":20},{"key":"data.attributes.movement.walk","value":5,"mode":2,"priority":20},{"key":"flags.sw5e.pintsized","value":"0","mode":5,"priority":20},{"key":"flags.sw5e.undersized","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/Feats/Tiny%20Terror.webp","label":"Tiny Terror","tint":"","transfer":true}]}
{"_id":"qW28id0DXW7FjT6V","name":"Crushing Weapon Specialist","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You master the greatsaber, techaxe, techstaff, vibroaxe, vibroknuckler, vibromace, and vibrosword. You gain the following benefits while wielding any of these weapons, if you are proficient with it:</p>\n<ul>\n<li>You gain a +1 bonus to the weapon's attack rolls.</li>\n<li>Whenever you have advantage on an attack roll and hit, and the lower of the two d20 rolls would also hit, you can attempt to knock the target prone. If the target is no more than one size larger than you (your size or smaller if your weapon has the light property), make a Strength (Athletics) check contested by the target's Strength (Athletics) or Dexterity (Acrobatics) check (the target chooses the ability). If you win the contest, the target is knocked prone.</li>\n<li>Once per round, when you use your reaction to make a melee weapon attack, you have advantage on the attack roll.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5000000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Crushing%20Weapon%20Specialist.webp","effects":[]}
{"_id":"rid1xN6ROEyYOySe","name":"Academic Calling","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in scholar and at least 3 levels in sentinel</em></p>\n<p>You've learned to blend the ingenuity of your academic pursuit with the focus of your sentinel calling. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your sentinel levels to your scholar levels when determining the size of your Superiority Dice and the number of Superiority Dice you have.</li>\n<li>You can add your scholar levels to your sentinel levels when determining the size of your Kinetic Combat die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Scholar 3, Sentinel 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.Nx7AM5DHjkO0GNbL"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Academic%20Calling.webp","effects":[]}
{"_id":"sC2RPRGuIXbzP4Vc","name":"Mobile","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You are exceptionally speedy and agile. You gain the following benefits:</p>\n<ul>\n<li>Your speed increases by 10 feet.</li>\n<li>When you use the Dash action, difficult terrain doesn't cost you extra movement on that turn.</li>\n<li>When you make a melee attack against a creature, you don't provoke opportunity attacks from that creature for the rest of the turn, whether you hit or not.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"4th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":3300000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.attributes.speed.value","value":"10","mode":"+","targetSpecific":false,"id":1,"itemId":"sC2RPRGuIXbzP4Vc","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Mobile.webp","effects":[{"_id":"AYuCoUXLgXEIy4Zo","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.attributes.movement.walk","value":10,"mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Mobile.webp","label":"Mobile","tint":"","transfer":true}]}
{"_id":"tVElcveiEV69LpMD","name":"Titan's Power","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have the strength that legends tell of, granting the following benefits:</p>\n<ul>\n<li>You gain proficiency in Strength saving throws. If you are already proficient in them, you add double your proficiency bonus to Strength saving throws you make.</li>\n<li>You ignore the <em>two-handed</em> property of weapons with which you are proficient.</li>\n<li>When you miss with a melee weapon attack, the creature takes damage equal to your Strength modifier. This damage is of the same type as the weapon's damage.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"Strength 20, level 12","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4857813,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Titan%27s%20Power.webp","effects":[{"_id":"364INNg0IvDPOWqC","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.str.proficient","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Titan%27s%20Power.webp","label":"Titan's Power","tint":"","transfer":true}]}
{"_id":"tc0x7wRpNsW1O2Zz","name":"Prone Combatant","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've practiced fighting while prone, gaining the following benefits:</p>\n<ul>\n<li>Increase your Dexterity score by 1, to a maximum of 20.</li>\n<li>You gain a crawling speed equal to your movement speed.</li>\n<li>You no longer have disadvantage on ranged attack rolls against targets within 30 feet.</li>\n<li>When you attempt to hide on your turn while prone, you can opt to not move on that turn. If you avoid moving, you are considered lightly obscured. You lose this benefit if you move or stand up, either voluntarily or because of some external effect. You are still automatically detected if any effect or action causes you to no longer be hidden. If you are still hidden on your next turn, you can continue to remain motionless and gain this benefit until you are detected.</li>\n</ul>","chat":"","unidentified":""},"source":"WH","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4700000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.dex.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"tc0x7wRpNsW1O2Zz","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Prone%20Combatant.webp","effects":[{"_id":"voyn9mLe9ijrdBsQ","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.dex.value","value":1,"mode":2,"priority":20},{"key":"data.attributes.movement.crawl","value":"(@attributes.movement.walk)","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Prone%20Combatant.webp","label":"Prone Combatant","tint":"","transfer":true}]}
@ -95,6 +135,10 @@
{"_id":"ua8SMi9eB45JvLvn","name":"Shard Modification","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Droid type</em></p>\n<p>You are specially modified droid used to house a shard. Shards are sentient crystals native to the planet Orax, roughly a foot in length, that communicate with each other through pulses of light. While inhabiting a specialized droid host, shards are able to overcome the droid's inability to wield the Force, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You lose the Force Insensitive special trait.</li>\n<li>You can cast the <em>sense force</em> force power once per day. Wisdom or Charisma (your choice) is your forcecasting ability for this power.</li>\n</ul>","chat":"","unidentified":""},"source":"WH","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4900000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Shard%20Modification.webp","effects":[{"_id":"ADseZBBm0OiENVFg","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"flags.dnd5e.forceInsensitive","value":"0","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Shard%20Modification.webp","label":"Shard Modification","tint":"","transfer":true}]}
{"_id":"vesMmgkOBAQLvIEU","name":"Blinding Agility","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Dexterity 20</em><br />You have the reflexes of one who can see things before they happen, granting the following benefits:</p>\n<ul>\n<li>You gain proficiency in Dexterity saving throws. If you are already proficient in them, you add double your proficiency bonus to Dexterity saving throws you make.</li>\n<li>Weapons that lack the <em>two-handed</em> or <em>special</em> properties are considered to have the <em>finesse</em> property for you.</li>\n<li>Opportunity attacks made against you have disadvantage.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"12th Level","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":600000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Blinding%20Agility.webp","effects":[{"_id":"nJqyLCEz95MgVt8G","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.dex.proficient","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Blinding%20Agility.webp","label":"Blinding Agility","tint":"","transfer":true}]}
{"_id":"vxDwtMysjVevQ9RN","name":"Crafter","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You have a knack for crafting; you work with greater efficiency and produce goods of higher quality. Select one type of artisan's implements. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You gain proficiency with the chosen tool. If you are already proficient with it, you instead gain expertise with it.</li>\n<li>When you craft something with the chosen tool, the total market value you can craft increases 50 cr per day. If you have expertise with it, the market value instead increases by 100 cr per day.</li>\n<li>If you use the tool you've selected to practice a profession during downtime, you can support a lifestyle one higher than you would normally be able to. You can select this feat multiple times. Each time you do so, you must choose a different set of artisan's implements.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":4200000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Crafter.webp","effects":[]}
{"_id":"w2VDYMSS9FmqAYFF","name":"Scout Calling","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in scout and at least 3 levels in sentinel</em></p>\n<p>You've learned to blend the knack of your scout technique with the focus of your sentinel calling. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your sentinel levels to your scout levels when determining the size of your Ranger's Quarry die and the duration of your Ranger's Quarry feature.</li>\n<li>You can add your scout levels to your sentinel levels when determining the size of your Kinetic Combat die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Scout 3, Sentinel 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.au8P4MNO1hTfbB23"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Scout%20Calling.webp","effects":[]}
{"_id":"xaESqag9S7ivxWNw","name":"Fighter Focus","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in fighter and at least 3 levels in guardian</em></p>\n<p>You've learned to blend the prowess of your fighter specialty with the expertise of your guardian focus. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your guardian levels to your fighter levels when determining the number of hit points you regain from your Second Wind feature.</li>\n<li>You can add your fighter levels to your guardian levels when determining the your amount of Focused Strikes dice.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Fighter 3, Guardian 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.XfT7QUdpfD2C16OE"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Fighter%20Focus.webp","effects":[]}
{"_id":"y09iFQHd9gACYeKn","name":"Haggler","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>Your skills at bartering have granted you the following benefits:</p>\n<ul>\n<li>Increase your Charisma score by 1, up to a maximum of 20.</li>\n<li>You have advantage on Charisma (Persuasion) and Charisma (Deception) checks when attempting to barter or trade.</li>\n<li>You are always aware of the current monetary value for any unenhanced or common enhanced item. Whenever you identify an item, you gain a rough estimate of its current monetary value.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":7600000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"y09iFQHd9gACYeKn","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Haggler.webp","effects":[{"_id":"UoHud3hNEJGfWPXH","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.attributes.str.mod","value":"1","mode":2,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Haggler.webp","label":"Haggler","tint":"","transfer":true}]}
{"_id":"yOhhoeyIfccOM1JQ","name":"Kinetic Stoicism","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You've developed a preternatural focus, granting the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>Once per turn, whenever you roll a Kinetic Combat die, you can roll the die twice and take either total.</li>\n</ul>","chat":"","unidentified":""},"source":"EC","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"at least 3 levels in sentinel","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":7200000,"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Feats/Kinetic%20Stoicism.webp","effects":[]}
{"_id":"z8UXCrEGMeyqHQUE","name":"Engineering Focus","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in engineer and at least 3 levels in guardian</em></p>\n<p>You've learned to blend the artistry of your engineering discipline with the expertise of your guardian focus. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your guardian levels to your engineer levels when determining the size of your Potent Aptitude die and the number of uses of your Potent Aptitude feature.</li>\n<li>You can add your engineer levels to your guardian levels when determining the your amount of Focused Strikes dice.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Engineer 3, Guardian 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.qQtBWlf36I0bREJo"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Engineering%20Focus.webp","effects":[]}
{"_id":"zIgrm924baVG33Y1","name":"Guardian Calling","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> At least 3 levels in guardian and at least 3 levels in sentinel</em></p>\n<p>You've learned to blend the expertise of your guardian focus with the focus of your sentinel calling. You gain the following benefits:</p>\n<ul>\n<li>Increase an ability score of your choice by 1, to a maximum of 20.</li>\n<li>You can add your sentinel levels to your guardian levels when determining the your amount of Focused Strikes dice.</li>\n<li>You can add your guardian levels to your sentinel levels when determining the size of your Kinetic Combat die.</li>\n</ul>","chat":"","unidentified":""},"requirements":"Guardian 3, Sentinel 3","source":"EC","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"},"recharge":{"value":null,"charged":false}},"flags":{"core":{"sourceId":"Item.Fsye0Rc6ebAT8q37"}},"img":"systems/sw5e/packs/Icons/Feats/MC-Guardian%20Calling.webp","effects":[]}
{"_id":"zp1d7mtK3QWMZX6j","name":"Stealthy","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"feat","data":{"description":{"value":"<p>You know how best to hide, gaining the following benefits:</p>\n<ul>\n<li>Increase your Dexterity score by 1, to a maximum of 20.</li>\n<li>You gain proficiency in the Stealth skill. If you are already proficient in it, you instead gain expertise in it.</li>\n<li>If you are hidden, you can move up to 10 feet in the open without revealing yourself if you end the move in a position where you're not clearly visible.</li>\n</ul>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"","cost":0,"condition":""},"duration":{"value":0,"units":""},"target":{"value":0,"width":null,"units":"","type":""},"range":{"value":0,"long":0,"units":null},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":null,"amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"requirements":"","recharge":{"value":0,"charged":true},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"folder":"dFnKIJCGmpjqdA2C","sort":5250000,"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.abilities.dex.value","value":"1","mode":"+","targetSpecific":false,"id":1,"itemId":"zp1d7mtK3QWMZX6j","active":false,"_targets":[],"label":"Abilities Dexterity"},{"modSpecKey":"data.skills.ste.value","value":"1","mode":"+","targetSpecific":false,"id":2,"itemId":"zp1d7mtK3QWMZX6j","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Feats/Stealthy.webp","effects":[{"_id":"UsFD1hC8pag7Ek5j","flags":{"dae":{"stackable":false,"specialDuration":"None","transfer":true}},"changes":[{"key":"data.abilities.dex.value","value":1,"mode":2,"priority":20},{"key":"data.skills.ste.value","value":1,"mode":4,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Feats/Stealthy.webp","label":"Stealthy","tint":"","transfer":true}]}

File diff suppressed because one or more lines are too long

View file

@ -753,6 +753,12 @@ input[type="reset"]:disabled {
border-color: transparent;
background: none;
}
.sw5e.sheet.actor .attributable {
position: relative;
}
.sw5e.sheet.actor .attributable:hover .tooltip {
display: block;
}
.sw5e.sheet.actor .swalt-sheet {
display: grid;
grid-template-rows: 182px 36px auto;
@ -866,6 +872,10 @@ input[type="reset"]:disabled {
.sw5e.sheet.actor .swalt-sheet header .summary .proficiency {
line-height: 26px;
}
.sw5e.sheet.actor .swalt-sheet header .summary select {
position: relative;
top: -4px;
}
.sw5e.sheet.actor .swalt-sheet header .attributes {
grid-column-start: 2;
grid-row-start: 3;
@ -877,6 +887,9 @@ input[type="reset"]:disabled {
.sw5e.sheet.actor .swalt-sheet header .attributes h1 {
text-align: center;
}
.sw5e.sheet.actor .swalt-sheet header .attributes .attribute-name {
position: relative;
}
.sw5e.sheet.actor .swalt-sheet header .attributes .attribute-value,
.sw5e.sheet.actor .swalt-sheet header .attributes .attribute-value input {
font-family: 'Russo One';
@ -911,6 +924,28 @@ input[type="reset"]:disabled {
padding: 1px 4px;
display: block;
}
.sw5e.sheet.actor .swalt-sheet header .attributes .config-button {
position: absolute;
display: none;
right: -6px;
top: -3px;
font-size: 10px;
font-weight: normal;
}
.sw5e.sheet.actor .swalt-sheet header .attributes:hover .config-button {
display: block;
}
.sw5e.sheet.actor .swalt-sheet header .attributes input.temphp {
width: 48%;
}
.sw5e.sheet.actor .swalt-sheet header .attributes .property-attribution {
min-width: 150px;
top: 50px;
font-family: Signika, sans-serif;
font-size: 14px;
font-weight: normal;
line-height: 1rem;
}
.sw5e.sheet.actor .swalt-sheet header .attributes footer button {
background: none;
padding: 1px 3px;

172
sw5e.css
View file

@ -81,7 +81,7 @@
flex: 4;
}
/* ----------------------------------------- */
/* All DnD5e Apps */
/* All SW5e Apps */
/* ----------------------------------------- */
.sw5e {
/* ----------------------------------------- */
@ -220,6 +220,9 @@
/* TinyMCE */
/* ----------------------------------------- */
/* ----------------------------------------- */
/* Notifications */
/* ----------------------------------------- */
/* ----------------------------------------- */
/* Sheet Header */
/* ----------------------------------------- */
/* ----------------------------------------- */
@ -297,6 +300,22 @@
.sw5e.sheet .editor .tox-toolbar__primary {
background: none;
}
.sw5e.sheet .warnings,
.sw5e.sheet .info {
flex: 0 0 100%;
margin: 0;
padding: 0;
list-style: none;
}
.sw5e.sheet .warnings .notification,
.sw5e.sheet .info .notification {
font-family: "Signika", sans-serif;
font-weight: normal;
font-size: 13px;
box-shadow: none;
padding: 2px 8px;
margin-bottom: 2px;
}
.sw5e.sheet .sheet-header {
flex: 0 0 100px;
border-bottom: 2px groove #eeede0;
@ -309,6 +328,16 @@
font-size: 20px;
font-weight: 400;
}
.sw5e.sheet .sheet-header .header-details .summary select {
width: 100%;
height: 100%;
border: 0;
font-family: 'Russo One';
font-size: 20px;
font-weight: 400;
text-transform: capitalize;
font-weight: 100;
}
.sw5e.sheet .sheet-header h1 {
flex: 1;
border-bottom: none;
@ -404,7 +433,8 @@
.sw5e.sheet .traits {
margin: 5px 0 0;
}
.sw5e.sheet .traits .trait-selector {
.sw5e.sheet .traits .trait-selector,
.sw5e.sheet .traits .proficiency-selector {
flex: 0 0 16px;
padding: 2px 0;
color: #999;
@ -507,11 +537,69 @@
margin: 0;
padding: 0;
}
.trait-selector .trait-list li ol.trait-list {
margin-left: 1.5em;
}
.trait-selector input[type="text"] {
height: 24px;
margin: 2px;
}
/* ----------------------------------------- */
/* Property Attribution */
/* ----------------------------------------- */
.property-attribution {
display: none;
position: absolute;
padding: 3px;
border: 1px solid #000;
border-radius: 3px;
background-color: rgba(0, 0, 0, 0.8);
backdrop-filter: blur(4px);
color: #c9c7b8;
text-align: left;
z-index: 1;
}
.property-attribution table {
margin: 0;
border: 0;
}
.property-attribution table tr {
background-color: inherit;
}
.property-attribution table td {
padding: 3px;
}
.property-attribution table tr.total > td {
font-weight: 600;
padding-top: 5px;
border-top: 1px solid #7a7971;
}
.property-attribution table td.attribution-value {
width: 20%;
padding-right: 5px;
text-align: right;
font-weight: 600;
}
.property-attribution table td::before {
opacity: 0.6;
}
.property-attribution table td.mode-1::before {
content: "×";
}
.property-attribution table td.mode-2::before {
content: "+";
}
.property-attribution table td.mode-2.negative::before {
content: "";
margin-right: -1px;
}
.property-attribution table td.mode-3::before {
content: "↓";
}
.property-attribution table td.mode-4::before {
content: "↑";
}
/* ----------------------------------------- */
/* Actor Type Config Sheet Specifically */
/* ----------------------------------------- */
.actor-type .trait-list {
@ -539,8 +627,20 @@
display: none;
}
/* ----------------------------------------- */
/* Armor Config Sheet Specifically */
/* ----------------------------------------- */
.sw5e.actor-armor-config .ac-field input {
font-size: 3em;
text-align: center;
}
/* ----------------------------------------- */
/* Add Feature Prompt Specifically */
/* ----------------------------------------- */
.sw5e.select-items-prompt {
/* ----------------------------------------- */
/* HUD
/* ----------------------------------------- */
}
.sw5e.select-items-prompt .dialog-content {
margin-bottom: 1em;
}
@ -555,10 +655,11 @@
.sw5e.select-items-prompt .item-name > label {
align-items: center;
}
/* ----------------------------------------- */
/* HUD
/* ----------------------------------------- */
.placeable-hud .control-icon {
.sw5e.select-items-prompt .window-content {
max-height: 90vh;
overflow-y: auto;
}
.sw5e.select-items-prompt .placeable-hud .control-icon {
box-sizing: content-box;
width: 40px;
flex: 0 0 40px;
@ -566,14 +667,14 @@
font-size: 28px;
line-height: 40px;
text-align: center;
color: #FBF4F4;
color: #fbf4f4;
background: rgba(0, 0, 0, 0.6);
box-shadow: 0 0 15px #000;
border: 1px solid #333;
border-radius: 8px;
pointer-events: all;
}
#token-hud .status-effects {
.sw5e.select-items-prompt #token-hud .status-effects {
visibility: hidden;
position: absolute;
left: 50px;
@ -582,7 +683,7 @@
padding: 3px;
box-sizing: content-box;
width: 100px;
color: #FBF4F4;
color: #fbf4f4;
grid-template-columns: 25px 25px 25px 25px;
background: rgba(0, 0, 0, 0.6);
box-shadow: 0 0 15px #000;
@ -659,6 +760,10 @@
height: 24px;
line-height: 24px;
}
.sw5e.sheet.actor .sheet-header .summary select {
position: relative;
top: -4px;
}
.sw5e.sheet.actor .sheet-header .attributes {
flex: 0 0 100%;
margin: 0;
@ -673,30 +778,35 @@
.sw5e.sheet.actor .sheet-header .attributes .attribute:last-child {
border-right: none;
}
.sw5e.sheet.actor .sheet-header .attributes .attribute .attribute-name {
position: relative;
}
.sw5e.sheet.actor .sheet-header .attributes .attribute .attribute-value {
height: 30px;
line-height: 30px;
}
.sw5e.sheet.actor .sheet-header .attributes .movement h4.attribute-name,
.sw5e.sheet.actor .sheet-header .attributes .hit-dice h4.attribute-name {
position: relative;
}
.sw5e.sheet.actor .sheet-header .attributes .movement .config-button,
.sw5e.sheet.actor .sheet-header .attributes .hit-dice .config-button {
.sw5e.sheet.actor .sheet-header .attributes .attribute .config-button {
position: absolute;
display: none;
right: 0;
top: 1px;
font-size: 12px;
right: -6px;
top: -3px;
font-size: 10px;
font-weight: normal;
}
.sw5e.sheet.actor .sheet-header .attributes .movement:hover .config-button,
.sw5e.sheet.actor .sheet-header .attributes .hit-dice:hover .config-button {
.sw5e.sheet.actor .sheet-header .attributes .attribute:hover .config-button {
display: block;
}
.sw5e.sheet.actor .sheet-header .attributes input.temphp {
.sw5e.sheet.actor .sheet-header .attributes .attribute input.temphp {
width: 48%;
}
.sw5e.sheet.actor .sheet-header .attributes .attribute .property-attribution {
min-width: 150px;
top: 50px;
font-family: Signika, sans-serif;
font-size: 14px;
font-weight: normal;
line-height: 1rem;
}
.sw5e.sheet.actor h4.box-title {
height: 18px;
line-height: 16px;
@ -753,6 +863,12 @@
font-weight: 400;
white-space: nowrap;
}
.sw5e.sheet.actor .attributable {
position: relative;
}
.sw5e.sheet.actor .attributable:hover .tooltip {
display: block;
}
.sw5e.sheet.actor .ability-scores {
flex: 0 0 100px;
height: 440px;
@ -1034,7 +1150,7 @@
border-top: 1px solid #c9c7b8;
}
.sw5e.sheet.actor .inventory-list .item-summary h2 {
font-family: 'Russo One';
font-family: "Russo One";
font-size: 20px;
font-weight: 400;
text-transform: uppercase;
@ -1068,7 +1184,7 @@
font-size: 13px;
line-height: 12px;
text-align: right;
color: #EEE;
color: #eee;
text-shadow: 0 0 5px #000;
}
.sw5e.sheet.actor .encumbrance .encumbrance-breakpoint {
@ -1902,11 +2018,15 @@
padding: 0;
text-align: center;
}
.sw5e.sheet.actor.npc .header-exp .experience {
.sw5e.sheet.actor.npc .header-exp .experience,
.sw5e.sheet.actor.npc .header-exp .proficiency {
flex: 0 0 18px;
color: #7a7971;
font-size: 16px;
}
.sw5e.sheet.actor.npc .header-exp .proficiency {
margin-top: -0.3em;
}
.sw5e.sheet.actor.npc .summary {
font-size: 18px;
}
@ -1930,6 +2050,10 @@
.sw5e.sheet.actor.npc .summary li.creature-type:hover .config-button {
display: block;
}
.sw5e.sheet.actor.vehicle {
min-width: 720px;
min-height: 680px;
}
.sw5e.sheet.actor.vehicle .features .item-controls {
flex: 0 0 68px;
}

25
sw5e.js
View file

@ -41,6 +41,7 @@ import * as chat from "./module/chat.js";
import * as dice from "./module/dice.js";
import * as macros from "./module/macros.js";
import * as migrations from "./module/migration.js";
import ActiveEffect5e from "./module/active-effect.js";
/* -------------------------------------------- */
/* Foundry VTT Initialization */
@ -83,6 +84,7 @@ Hooks.once("init", function () {
// Record Configuration Values
CONFIG.SW5E = SW5E;
CONFIG.ActiveEffect.documentClass = ActiveEffect5e;
CONFIG.Actor.documentClass = Actor5e;
CONFIG.Item.documentClass = Item5e;
CONFIG.Token.documentClass = TokenDocument5e;
@ -193,6 +195,7 @@ Hooks.once("setup", function () {
"abilityConsumptionTypes",
"actorSizes",
"alignments",
"armorClasses",
"armorProficiencies",
"armorPropertiesTypes",
"conditionTypes",
@ -205,6 +208,7 @@ Hooks.once("setup", function () {
"equipmentTypes",
"healingTypes",
"itemActionTypes",
"itemRarity",
"languages",
"limitedUsePeriods",
"movementTypes",
@ -227,6 +231,8 @@ Hooks.once("setup", function () {
"targetTypes",
"timePeriods",
"toolProficiencies",
"toolTypes",
"vehicleTypes",
"weaponProficiencies",
"weaponProperties",
"weaponSizes",
@ -237,24 +243,30 @@ Hooks.once("setup", function () {
const noSort = [
"abilities",
"alignments",
"armorClasses",
"armorProficiencies",
"currencies",
"distanceUnits",
"movementUnits",
"itemActionTypes",
"itemRarity",
"proficiencyLevels",
"limitedUsePeriods",
"powerComponents",
"powerLevels",
"powerPreparationModes",
"weaponProficiencies",
"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])];
const localized = Object.entries(CONFIG.SW5E[o]).map(([k, v]) => {
if (v.label) v.label = game.i18n.localize(v.label);
if (typeof v === "string") return [k, game.i18n.localize(v)];
return [k, v];
});
if (!noSort.includes(o)) localized.sort((a, b) => a[1].localeCompare(b[1]));
if (!noSort.includes(o)) localized.sort((a, b) => (a[1].label ?? a[1]).localeCompare(b[1].label ?? b[1]));
CONFIG.SW5E[o] = localized.reduce((obj, e) => {
obj[e[0]] = e[1];
return obj;
@ -278,10 +290,13 @@ Hooks.once("ready", function () {
// 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";
const NEEDS_MIGRATION_VERSION = "1.4.2.R1-A8";
// Check for R1 SW5E versions
const SW5E_NEEDS_MIGRATION_VERSION = "R1-A6";
const SW5E_NEEDS_MIGRATION_VERSION = "R1-A8";
const COMPATIBLE_MIGRATION_VERSION = 0.8;
const totalDocuments = game.actors.size + game.scenes.size + game.items.size;
if (!currentVersion && totalDocuments === 0)
return game.settings.set("sw5e", "systemMigrationVersion", game.system.data.version);
const needsMigration =
currentVersion &&
(isNewerVersion(SW5E_NEEDS_MIGRATION_VERSION, currentVersion) ||

View file

@ -1,160 +1,159 @@
{
"name": "sw5e",
"title": "SW 5th Edition",
"description": "A comprehensive game system for running games of SW 5th Edition in the Foundry VTT environment.",
"version": "1.3.5.R1-A7",
"author": "Dev Team",
"scripts": [],
"esmodules": ["sw5e.js"],
"styles": ["sw5e.css", "sw5e-global.css", "sw5e-light.css", "sw5e-dark.css"],
"packs": [
{
"name": "adventuringgear",
"label": "Adventuring Gear",
"path": "./packs/packs/adventuringgear.db",
"entity": "Item"
},
{
"name": "archetypes",
"label": "Archetypes",
"path": "./packs/packs/archetypes.db",
"entity": "Item"
},
{
"name": "armor",
"label": "Armor",
"path": "./packs/packs/armor.db",
"entity": "Item"
},
{
"name": "backgrounds",
"label": "Backgrounds",
"path": "./packs/packs/backgrounds.db",
"entity": "Item"
},
{
"name": "classes",
"label": "Classes",
"path": "./packs/packs/classes.db",
"entity": "Item"
},
{
"name": "classfeatures",
"label": "Class Features",
"path": "./packs/packs/classfeatures.db",
"entity": "Item"
},
{
"name": "conditions",
"label": "Conditions",
"path": "./packs/packs/conditions.db",
"entity": "JournalEntry"
},
{
"name": "enhanceditems",
"label": "Enhanced Items",
"path": "./packs/packs/enhanceditems.db",
"entity": "Item"
},
{
"name": "feats",
"label": "Feats",
"path": "./packs/packs/feats.db",
"entity": "Item"
},
{
"name": "fightingstyles",
"label": "Fighting Styles",
"path": "./packs/packs/fightingstyles.db",
"entity": "Item"
},
{
"name": "fightingmasteries",
"label": "Fighting Masteries",
"path": "./packs/packs/fightingmasteries.db",
"entity": "Item"
},
{
"name": "forcepowers",
"label": "Force Powers",
"path": "./packs/packs/forcepowers.db",
"entity": "Item"
},
{
"name": "gamingset",
"label": "Gaming Sets",
"path": "./packs/packs/gamingset.db",
"entity": "Item"
},
{
"name": "lightsaberform",
"label": "Lightsaber Forms",
"path": "./packs/packs/lightsaberforms.db",
"entity": "Item"
},
{
"name": "monsters",
"label": "Monsters",
"path": "./packs/packs/monsters.db",
"entity": "Actor"
},
{
"name": "species",
"label": "Species",
"path": "./packs/packs/species.db",
"entity": "Item"
},
{
"name": "speciestraits",
"label": "Species Traits",
"path": "./packs/packs/speciestraits.db",
"entity": "Item"
},
{
"name": "tables",
"label": "Tables",
"path": "./packs/packs/tables.db",
"entity": "RollTable"
},
{
"name": "techpowers",
"label": "Tech Powers",
"path": "./packs/packs/techpowers.db",
"entity": "Item"
},
{
"name": "weapons",
"label": "Weapons",
"path": "./packs/packs/weapons.db",
"entity": "Item"
}
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
},
{
"lang": "fr",
"name": "French",
"path": "lang/fr.json"
},
{
"lang": "it",
"name": "Italian",
"path": "lang/it.json"
}
],
"socket": true,
"gridDistance": 5,
"gridUnits": "ft",
"primaryTokenAttribute": "attributes.hp",
"secondaryTokenAttribute": null,
"minimumCoreVersion": "0.8.2",
"compatibleCoreVersion": "0.8.8",
"url": "https://github.com/unrealkakeman89/sw5e",
"manifest": "https://raw.githubusercontent.com/unrealkakeman89/sw5e/master/system.json",
"download": "https://github.com/unrealkakeman89/sw5e/archive/master.zip"
"name": "sw5e",
"title": "SW 5th Edition",
"description": "A comprehensive game system for running games of SW 5th Edition in the Foundry VTT environment.",
"version": "1.4.2.R1-A8",
"author": "Dev Team",
"scripts": [],
"esmodules": ["sw5e.js"],
"styles": ["sw5e.css", "sw5e-global.css", "sw5e-light.css", "sw5e-dark.css"],
"packs": [
{
"name": "adventuringgear",
"label": "Adventuring Gear",
"path": "./packs/packs/adventuringgear.db",
"entity": "Item"
},
{
"name": "archetypes",
"label": "Archetypes",
"path": "./packs/packs/archetypes.db",
"entity": "Item"
},
{
"name": "armor",
"label": "Armor",
"path": "./packs/packs/armor.db",
"entity": "Item"
},
{
"name": "backgrounds",
"label": "Backgrounds",
"path": "./packs/packs/backgrounds.db",
"entity": "Item"
},
{
"name": "classes",
"label": "Classes",
"path": "./packs/packs/classes.db",
"entity": "Item"
},
{
"name": "classfeatures",
"label": "Class Features",
"path": "./packs/packs/classfeatures.db",
"entity": "Item"
},
{
"name": "conditions",
"label": "Conditions",
"path": "./packs/packs/conditions.db",
"entity": "JournalEntry"
},
{
"name": "enhanceditems",
"label": "Enhanced Items",
"path": "./packs/packs/enhanceditems.db",
"entity": "Item"
},
{
"name": "feats",
"label": "Feats",
"path": "./packs/packs/feats.db",
"entity": "Item"
},
{
"name": "fightingstyles",
"label": "Fighting Styles",
"path": "./packs/packs/fightingstyles.db",
"entity": "Item"
},
{
"name": "fightingmasteries",
"label": "Fighting Masteries",
"path": "./packs/packs/fightingmasteries.db",
"entity": "Item"
},
{
"name": "forcepowers",
"label": "Force Powers",
"path": "./packs/packs/forcepowers.db",
"entity": "Item"
},
{
"name": "gamingset",
"label": "Gaming Sets",
"path": "./packs/packs/gamingset.db",
"entity": "Item"
},
{
"name": "lightsaberform",
"label": "Lightsaber Forms",
"path": "./packs/packs/lightsaberforms.db",
"entity": "Item"
},
{
"name": "monsters",
"label": "Monsters",
"path": "./packs/packs/monsters.db",
"entity": "Actor"
},
{
"name": "species",
"label": "Species",
"path": "./packs/packs/species.db",
"entity": "Item"
},
{
"name": "speciestraits",
"label": "Species Traits",
"path": "./packs/packs/speciestraits.db",
"entity": "Item"
},
{
"name": "tables",
"label": "Tables",
"path": "./packs/packs/tables.db",
"entity": "RollTable"
},
{
"name": "techpowers",
"label": "Tech Powers",
"path": "./packs/packs/techpowers.db",
"entity": "Item"
},
{
"name": "weapons",
"label": "Weapons",
"path": "./packs/packs/weapons.db",
"entity": "Item"
}
],
"languages": [
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
},
{
"lang": "fr",
"name": "French",
"path": "lang/fr.json"
},
{
"lang": "it",
"name": "Italian",
"path": "lang/it.json"
}
],
"socket": true,
"gridDistance": 5,
"gridUnits": "ft",
"primaryTokenAttribute": "attributes.hp",
"secondaryTokenAttribute": null,
"minimumCoreVersion": "0.8.2",
"compatibleCoreVersion": "0.8.8",
"url": "https://github.com/unrealkakeman89/sw5e",
"manifest": "https://raw.githubusercontent.com/unrealkakeman89/sw5e/master/system.json",
"download": "https://github.com/unrealkakeman89/sw5e/archive/master.zip"
}

File diff suppressed because it is too large Load diff

View file

@ -2,6 +2,7 @@
{{!-- Sheet Header --}}
<header class="panel">
<img class="profile" src="{{actor.img}}" title="{{actor.name}}" data-edit="img" />
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-warnings.html"}}
<h1 class="character-name">
<input name="name" type="text" value="{{actor.name}}" placeholder="{{ localize 'SW5E.Name' }}" />
</h1>
@ -36,10 +37,12 @@
<div class="attributes">
{{!-- ARMOR CLASS --}}
<section>
<h1>{{ localize "SW5E.ArmorClass" }}</h1>
<div class="attribute-value">
<input class="ac-display" name="data.attributes.ac.value" type="text"
value="{{data.attributes.ac.value}}" data-dtype="Number" placeholder="10" />
<h1 class="attribute-name armor">
{{ localize "SW5E.ArmorClass" }}
<a class="config-button" data-action="armor" title="{{localize 'SW5E.ArmorConfig'}}"><i class="fas fa-cog"></i></a>
</h1>
<div class="attribute-value attributable" data-property="attributes.ac">
<span>{{data.attributes.ac.value}}</span>
</div>
</section>
@ -93,7 +96,7 @@
{{!-- SPEED / MOVEMENT TYPES --}}
<section>
<h1>
<h1 class="attribute-name movement">
{{ localize "SW5E.Movement" }}
<a class="config-button" data-action="movement" title="{{localize 'SW5E.MovementConfig'}}"><i class="fas fa-cog"></i></a>
</h1>

View file

@ -3,6 +3,8 @@
{{!-- NPC Sheet Header --}}
<header class="panel">
<img class="profile" src="{{actor.img}}" title="{{actor.name}}" data-edit="img" />
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-warnings.html"}}
<h1 class="character-name">
<input name="name" type="text" value="{{actor.name}}" placeholder="{{ localize 'SW5E.Name' }}" />
</h1>
@ -15,8 +17,12 @@
<div class="experience">
<span class="max">{{data.details.xp.value}} XP</span>
</div>
</div>
<div class="proficiency">
<span>
{{ localize "SW5E.Proficiency" }} {{numberFormat data.attributes.prof decimals=0 sign=true}}
</span>
</div>
</div>
<div class="summary">
<span class="npc-size">{{lookup config.actorSizes data.traits.size}}</span>
<input type="text" name="data.details.alignment" value="{{data.details.alignment}}"
@ -31,14 +37,15 @@
<div class="attributes">
{{!-- ARMOR CLASS --}}
<section>
<h1>{{ localize "SW5E.ArmorClass" }}</h1>
<div class="attribute-value">
<input class="ac-display" name="data.attributes.ac.value" type="text"
value="{{data.attributes.ac.value}}" data-dtype="Number" placeholder="10" />
<h1 class="attribute-name armor">
{{ localize "SW5E.ArmorClass" }}
<a class="config-button" data-action="armor" title="{{localize 'SW5E.ArmorConfig'}}"><i class="fas fa-cog"></i></a>
</h1>
<div class="attribute-value attributable" data-property="attributes.ac">
<span>{{data.attributes.ac.value}}</span>
</div>
<footer class="attribute-footer proficiency">
{{ localize "SW5E.Proficiency" }}
{{numberFormat data.attributes.prof decimals=0 sign=true}}
<footer class="attribute-footer">
<span>{{labels.armorType}}</span>
</footer>
</section>
@ -58,7 +65,8 @@
</footer>
</section>
<section>
<h1>{{ localize "SW5E.Movement" }}
<h1 class="attribute-name movement">
{{ localize "SW5E.Movement" }}
<a class="config-button" data-action="movement" title="{{localize 'SW5E.MovementConfig'}}"><i class="fas fa-cog"></i></a>
</h1>
<div class="attribute-value">
@ -99,7 +107,7 @@
<span class="ability-mod"
title="{{ localize 'SW5E.Modifier' }}">{{numberFormat ability.mod decimals=0 sign=true}}</span>
<input type="hidden" name="data.abilities.{{id}}.proficient"
value="{{ability.proficient}}" data-dtype="Number" />
value="{{ability.baseProf}}" data-dtype="Number" />
<button class="proficiency-toggle ability-proficiency"
title="Proficiency">{{{ability.icon}}}</button>
<span class="ability-save"
@ -116,7 +124,7 @@
{{#each config.skills as |label s|}}
{{#with (lookup ../data.skills s) as |skill|}}
<li class="skill {{#if skill.value}}proficient{{/if}}" data-skill="{{s}}">
<input type="hidden" name="data.skills.{{s}}.value" value="{{skill.value}}"
<input type="hidden" name="data.skills.{{s}}.value" value="{{skill.baseValue}}"
data-dtype="Number" />
<button class="proficiency-toggle skill-proficiency"
title="{{skill.hover}}">{{{skill.icon}}}</button>

View file

@ -12,7 +12,7 @@
<span class="ability-mod"
title="{{ localize 'SW5E.Modifier' }}">{{numberFormat ability.mod decimals=0 sign=true}}</span>
<input type="hidden" name="data.abilities.{{id}}.proficient"
value="{{ability.proficient}}" data-dtype="Number" />
value="{{ability.baseProf}}" data-dtype="Number" />
<button class="proficiency-toggle ability-proficiency"
title="Proficiency">{{{ability.icon}}}</button>
<span class="ability-save"
@ -29,7 +29,7 @@
{{#each config.skills as |label s|}}
{{#with (lookup ../data.skills s) as |skill|}}
<li class="skill {{#if skill.value}}proficient{{/if}}" data-skill="{{s}}">
<input type="hidden" name="data.skills.{{s}}.value" value="{{skill.value}}"
<input type="hidden" name="data.skills.{{s}}.value" value="{{skill.baseValue}}"
data-dtype="Number" />
<button class="proficiency-toggle skill-proficiency"
title="{{skill.hover}}">{{{skill.icon}}}</button>

View file

@ -74,7 +74,7 @@
{{#if ../../isCharacter}}
<div class="item-detail item-weight">
{{#if item.totalWeight}}
{{ item.totalWeight }} {{localize "SW5E.AbbreviationLbs"}}
{{ item.totalWeight }} {{ @root.weightUnit }}
{{/if}}
</div>
{{/if}}

View file

@ -112,7 +112,7 @@
<div>
<label>{{localize "SW5E.TraitArmorProf"}}</label>
<a class="trait-selector" data-options="armorProficiencies" data-target="data.traits.armorProf">
<a class="proficiency-selector" data-type="armor" data-target="data.traits.armorProf">
<i class="fas fa-edit"></i>
</a>
<ul class="traits-list">
@ -123,7 +123,7 @@
</div>
<div>
<label>{{localize "SW5E.TraitToolProf"}}</label>
<a class="trait-selector" data-options="toolProficiencies" data-target="data.traits.toolProf">
<a class="proficiency-selector" data-type="tool" data-target="data.traits.toolProf">
<i class="fas fa-edit"></i>
</a>
<ul class="traits-list">
@ -134,7 +134,7 @@
</div>
<div>
<label>{{localize "SW5E.TraitWeaponProf"}}</label>
<a class="trait-selector" data-options="weaponProficiencies" data-target="data.traits.weaponProf">
<a class="proficiency-selector" data-type="weapon" data-target="data.traits.weaponProf">
<i class="fas fa-edit"></i>
</a>
<ul class="traits-list">

View file

@ -0,0 +1,5 @@
<ol class="warnings">
{{#each warnings}}
<li class="notification warning">{{localize this}}</li>
{{/each}}
</ol>

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