Compare commits
34 commits
9242971386
...
309265cc2d
Author | SHA1 | Date | |
---|---|---|---|
309265cc2d | |||
![]() |
9719740291 | ||
![]() |
bb6ebf7978 | ||
![]() |
a9884df6e3 | ||
![]() |
3c7411bf55 | ||
![]() |
b4623057b0 | ||
![]() |
20a0191e23 | ||
![]() |
299b5eccd6 | ||
![]() |
e7b1451ea4 | ||
![]() |
76e4d74508 | ||
![]() |
48b6ab8e18 | ||
![]() |
b7fdb0fb6e | ||
![]() |
727a606df7 | ||
![]() |
bb7c8af607 | ||
![]() |
8344715512 | ||
![]() |
8c68144d25 | ||
![]() |
a487b89931 | ||
![]() |
5bb253d9c3 | ||
![]() |
f16383841b | ||
![]() |
71872e82d4 | ||
![]() |
54efbd8a79 | ||
![]() |
2541003441 | ||
![]() |
b774992945 | ||
![]() |
46a831e840 | ||
![]() |
1087324154 | ||
![]() |
d04c24191b | ||
![]() |
5c9fa179e0 | ||
![]() |
a5531f93cb | ||
![]() |
96f669853f | ||
![]() |
12887a3bc7 | ||
![]() |
f31861b9a1 | ||
![]() |
fb1a4f538a | ||
![]() |
9d57516ec1 | ||
![]() |
a443d65734 |
41
lang/en.json
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
113
module/active-effect.js
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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 */
|
||||
/* -------------------------------------------- */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
/* -------------------------------------------- */
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
/* -------------------------------------------- */
|
||||
|
|
|
@ -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}
|
||||
|
|
94
module/apps/actor-armor.js
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
120
module/apps/proficiency-selector.js
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
92
module/apps/property-attribution.js
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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) => {
|
||||
|
|
180
module/config.js
|
@ -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
|
||||
}
|
||||
};
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
});
|
||||
};
|
||||
|
|
|
@ -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",
|
||||
|
|
6
package-lock.json
generated
|
@ -2048,9 +2048,9 @@
|
|||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
|
||||
},
|
||||
"path-parse": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
|
||||
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
|
||||
},
|
||||
"path-root": {
|
||||
"version": "0.1.1",
|
||||
|
|
BIN
packs/Icons/Archetypes/Artillerist Technique-Companion.webp
Normal file
After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
BIN
packs/Icons/Archetypes/Astrotech Engineering (Companion).webp
Normal file
After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 10 KiB |
BIN
packs/Icons/Archetypes/Detective Pursuit.webp
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
packs/Icons/Archetypes/Path of Witchcraft - Companion.webp
Normal file
After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
BIN
packs/Icons/Archetypes/Vonil-Ishu Form (Companion).webp
Normal file
After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
BIN
packs/Icons/Backgrounds/Scavenger.webp
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
packs/Icons/Feats/MC-Academic Calling.webp
Normal file
After Width: | Height: | Size: 8.5 KiB |
BIN
packs/Icons/Feats/MC-Academic Technique.webp
Normal file
After Width: | Height: | Size: 7.4 KiB |
BIN
packs/Icons/Feats/MC-Berserker Calling.webp
Normal file
After Width: | Height: | Size: 7 KiB |
BIN
packs/Icons/Feats/MC-Berserker Discipline.webp
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
packs/Icons/Feats/MC-Berserker Focus.webp
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
packs/Icons/Feats/MC-Berserker Order.webp
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
packs/Icons/Feats/MC-Berserker Practice.webp
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
packs/Icons/Feats/MC-Berserker Pursuit.webp
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
packs/Icons/Feats/MC-Berserker Specialist.webp
Normal file
After Width: | Height: | Size: 5.6 KiB |
BIN
packs/Icons/Feats/MC-Berserker Technique.webp
Normal file
After Width: | Height: | Size: 5.9 KiB |
BIN
packs/Icons/Feats/MC-Berserker Tradition.webp
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
packs/Icons/Feats/MC-Consular Calling.webp
Normal file
After Width: | Height: | Size: 9.6 KiB |
BIN
packs/Icons/Feats/MC-Consular Discipline.webp
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
packs/Icons/Feats/MC-Consular Focus.webp
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
packs/Icons/Feats/MC-Consular Order.webp
Normal file
After Width: | Height: | Size: 8.6 KiB |
BIN
packs/Icons/Feats/MC-Consular Practice.webp
Normal file
After Width: | Height: | Size: 7.7 KiB |
BIN
packs/Icons/Feats/MC-Consular Pursuit.webp
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
packs/Icons/Feats/MC-Consular Specialist.webp
Normal file
After Width: | Height: | Size: 8.4 KiB |
BIN
packs/Icons/Feats/MC-Consular Technique.webp
Normal file
After Width: | Height: | Size: 8.6 KiB |
BIN
packs/Icons/Feats/MC-Engineering Calling.webp
Normal file
After Width: | Height: | Size: 9.4 KiB |
BIN
packs/Icons/Feats/MC-Engineering Focus.webp
Normal file
After Width: | Height: | Size: 8.7 KiB |
BIN
packs/Icons/Feats/MC-Engineering Order.webp
Normal file
After Width: | Height: | Size: 8.1 KiB |
BIN
packs/Icons/Feats/MC-Engineering Practice.webp
Normal file
After Width: | Height: | Size: 7.3 KiB |
BIN
packs/Icons/Feats/MC-Engineering Pursuit.webp
Normal file
After Width: | Height: | Size: 8.7 KiB |
BIN
packs/Icons/Feats/MC-Engineering Specialist.webp
Normal file
After Width: | Height: | Size: 8 KiB |
BIN
packs/Icons/Feats/MC-Engineering Technique.webp
Normal file
After Width: | Height: | Size: 8.2 KiB |
BIN
packs/Icons/Feats/MC-Fighter Calling.webp
Normal file
After Width: | Height: | Size: 7.7 KiB |
BIN
packs/Icons/Feats/MC-Fighter Focus.webp
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
packs/Icons/Feats/MC-Fighter Order.webp
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
packs/Icons/Feats/MC-Fighter Practice.webp
Normal file
After Width: | Height: | Size: 5.5 KiB |
BIN
packs/Icons/Feats/MC-Fighter Pursuit.webp
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
packs/Icons/Feats/MC-Fighter Technique.webp
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
packs/Icons/Feats/MC-Guardian Calling.webp
Normal file
After Width: | Height: | Size: 8.3 KiB |
BIN
packs/Icons/Feats/MC-Guardian Order.webp
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
packs/Icons/Feats/MC-Guardian Practice.webp
Normal file
After Width: | Height: | Size: 6.1 KiB |
BIN
packs/Icons/Feats/MC-Guardian Pursuit.webp
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
packs/Icons/Feats/MC-Guardian Technique.webp
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
packs/Icons/Feats/MC-Monastic Calling.webp
Normal file
After Width: | Height: | Size: 7.9 KiB |
BIN
packs/Icons/Feats/MC-Monastic Practice.webp
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
packs/Icons/Feats/MC-Monastic Pursuit.webp
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
packs/Icons/Feats/MC-Monastic Technique.webp
Normal file
After Width: | Height: | Size: 6.7 KiB |
BIN
packs/Icons/Feats/MC-Operative Calling.webp
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
packs/Icons/Feats/MC-Operative Pursuit.webp
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
packs/Icons/Feats/MC-Operative Technique.webp
Normal file
After Width: | Height: | Size: 5.7 KiB |
BIN
packs/Icons/Feats/MC-Scout Calling.webp
Normal file
After Width: | Height: | Size: 8 KiB |
BIN
packs/Icons/Species/Tognath.webp
Normal file
After Width: | Height: | Size: 6 KiB |
|
@ -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 weapon’s 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 weapon’s 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"}
|
||||
|
|
|
@ -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 maneuver’s 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’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 doesn’t 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 doesn’t 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’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}]}
|
||||
|
|
|
@ -180,6 +180,7 @@
|
|||
{"_id":"mDhD0APXsJ9tDa01","name":"Force Blinding","permission":{"default":0,"XA86Wm4MjngMySbc":3},"type":"power","data":{"description":{"value":"<p>You use the Force to emit a blinding flash of light from your hand. Roll 6d10, the total is how many hit points of creatures this power can effect. Creatures in a 15-foot cone originating from you are affected in ascending order of their current hit points (ignoring unconscious creatures and creatures that can’t see).</p>\n<p>Starting with the creature that has the lowest current hit points, each creature affected by this power is blinded until the power ends. Subtract each creature’s hit points from the total before moving on to the creature with the next lowest hit points. A creature’s hit points must be equal to or less than the remaining total for the creature to be affected.</p>\n<p><em><strong>Force Potency.</strong></em> When you cast this power using a force slot of 2nd level or higher, roll an additional 2d10 for each slot level above 1st.</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":1,"units":"round"},"target":{"value":15,"units":"ft","type":"cone"},"range":{"value":null,"long":null,"units":"self"},"uses":{"value":0,"max":"0","per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"other","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"6d10","save":{"ability":"","dc":null,"scaling":"power"},"level":1,"school":"lgt","components":{"value":"","vocal":false,"somatic":false,"material":false,"ritual":false,"concentration":false},"materials":{"value":"","consumed":false,"cost":0,"supply":0},"preparation":{"mode":"prepared","prepared":false},"scaling":{"mode":"level","formula":"2d10"}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Force%20Blinding.webp","effects":[]}
|
||||
{"_id":"maQoLsCcelDb2hWJ","name":"Slow","permission":{"default":0,"9BhUyjgxIxogl2ot":3},"type":"power","data":{"description":{"value":"<p>A hostile creature of your choice must make a Constitution saving throw. On a failed save, the target’s speed decreases by 10 feet until the power ends.</p>\n<p>The target’s speed decreases by 5 more feet when you reach 5th level (15 feet), 11th level (20 feet), and 17th level (25 feet).</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":1,"units":"hour"},"target":{"value":1,"units":"","type":"enemy"},"range":{"value":15,"long":null,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"ability":"","actionType":"save","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"con","dc":null,"scaling":"power"},"level":0,"school":"drk","components":{"value":"","vocal":false,"somatic":false,"material":false,"ritual":false,"concentration":false},"materials":{"value":"","consumed":false,"cost":0,"supply":0},"preparation":{"mode":"prepared","prepared":false},"scaling":{"mode":"none","formula":""},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"consume":{"type":"","target":"","amount":null}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Slow.webp","effects":[]}
|
||||
{"_id":"mnwPexAofsIOp8dD","name":"Telekinesis","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Force Throw</em></p>\n<p>You gain the ability to move or manipulate creatures and objects with the Force. When you cast this power, and as your action each round for the duration, you can exert your will on one creature or object that you can see within range, causing the appropriate effect below. You can affect the same target round after round, or choose a new one at any time. If you switch targets, the prior target is no longer affected by the power.</p>\n<p><strong>Creature.</strong> You can try to move a Huge or smaller creature. The target must make a Strength saving throw. On a failed save, you move the creature up to 30 feet in any direction, including upward but not beyond the range of this power. Until the end of your next turn, the creature is restrained in your telekinetic grip. A creature lifted upward is suspended in mid-air.</p>\n<p>On subsequent rounds, you can use your action to attempt to maintain your telekinetic grip on the creature by repeating the contest.</p>\n<p><strong>Object.</strong> You move an object that isn’t being worn or carried and weighs up to 2,500 lbs up to 30 feet in any direction, but not beyond the range of this power.</p>\n<p>You can exert fine control on objects with your telekinetic grip, such as manipulating a simple tool, opening a door or a container, stowing or retrieving an item from an open container, or pouring the contents from a vial.</p>\n<p><em><strong>Force Potency.</strong></em> When you cast this power using a force slot of 6th level or higher, the maximum object weight increases by 2,500 lbs for every slot level above 5th.</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":10,"units":"minute"},"target":{"value":1,"units":"any","type":"object"},"range":{"value":90,"long":null,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"ability":"","actionType":"save","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"str","dc":null,"scaling":"power"},"level":5,"school":"uni","components":{"value":"","vocal":false,"somatic":false,"material":false,"ritual":false,"concentration":true},"materials":{"value":"","consumed":false,"cost":0,"supply":0},"preparation":{"mode":"prepared","prepared":true},"scaling":{"mode":"none","formula":""},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"consume":{"type":"","target":"","amount":null}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Telekinesis.webp","effects":[]}
|
||||
{"name":"Dark Rejuvenation","permission":{"default":0,"45plGSakcs6nzjR8":3},"type":"power","data":{"description":{"value":"<p>Through the Dark Side, you thrive on the destruction of your enemies. For the duration of this power, at the start of each of your turns, if you made one or more melee attacks that inflicted at least 5 points of damage since the start of your previous turn, you gain 1 temporary hit point for every 5 points of damage you inflicted with your most damaging attack. The maximum number of temporary hit points you can gain in this way in one turn is equal to your forcecasting ability modifier. Force Potency. When you cast this power using a force slot of 2nd level or higher, the duration of the power is concentration, up to 10 minutes. If you use a force slot of 3rd level or higher, the duration is 1 hour. Using a force slot of 3rd level or higher grants a duration that doesn't require concentration. In addition, the maximum number of temporary hit points you can gain from this power in one turn is equal to your forcecasting ability modifier or the level of the slot you used to cast this power, whichever is higher.</p>","chat":"","unidentified":""},"source":"","activation":{"type":"bonus","cost":1,"condition":""},"duration":{"value":1,"units":"minute"},"target":{"value":null,"width":null,"units":null,"type":"self"},"range":{"value":null,"long":null,"units":"self"},"uses":{"value":0,"max":0,"per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"util","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":1,"school":"drk","components":{"value":"","vocal":false,"somatic":false,"material":false,"ritual":false,"concentration":true},"materials":{"value":"","consumed":false,"cost":0,"supply":0},"preparation":{"mode":"prepared","prepared":true},"scaling":{"mode":"level","formula":""}},"flags":{},"img":"icons/svg/mystery-man.svg","effects":[],"_id":"n3SX0MIEiVx9C6Em"}
|
||||
{"_id":"ntUNXx3Uag6BjJJH","name":"Share Life","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Give Life</em></p>\n<p>You sacrifice some of your health to mend another creature’s injuries. You take 4d8 necrotic damage, and one creature of your choice that you can see within range regains a number of hit points equal to twice the necrotic damage you take. This power has no effect on droids or constructs.</p>\n<p><em><strong>Force Potency.</strong></em> When you cast this power using a force slot of 4th level or higher, the damage increases by 1d8 for each slot level above 3rd.</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":"inst"},"target":{"value":1,"units":"","type":"creature"},"range":{"value":30,"long":null,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"ability":"","actionType":"other","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["4d8","necrotic"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":3,"school":"lgt","components":{"value":"","vocal":false,"somatic":false,"material":false,"ritual":false,"concentration":false},"materials":{"value":"","consumed":false,"cost":0,"supply":0},"preparation":{"mode":"prepared","prepared":false},"scaling":{"mode":"level","formula":"1d8"},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"consume":{"type":"","target":"","amount":null}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Share%20Life.webp","effects":[]}
|
||||
{"_id":"oF7fFDz9xqC9ICzm","name":"Stasis Field","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Stasis</em></p>\n<p>Choose a point that you can see within range. Each creature within range of that point must succeed on a Wisdom saving throw or be paralyzed for the duration. At the end of each of a target’s turns, it can make another Wisdom saving throw. On a success, the power ends on the target. This power has no effect on droids or constructs.</p>\n<p><em><strong>Force Potency.</strong></em> When you cast this power using a force slot of 9th level, the size of the cube increases to 40 feet.</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":1,"units":"minute"},"target":{"value":30,"units":"ft","type":"creature"},"range":{"value":120,"long":null,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"ability":"","actionType":"save","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"wis","dc":null,"scaling":"power"},"level":8,"school":"lgt","components":{"value":"","vocal":false,"somatic":false,"material":false,"ritual":false,"concentration":true},"materials":{"value":"","consumed":false,"cost":0,"supply":0},"preparation":{"mode":"prepared","prepared":true},"scaling":{"mode":"none","formula":""},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"consume":{"type":"","target":"","amount":null}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Stasis%20Field.webp","effects":[]}
|
||||
{"_id":"oPi4Y7zezP7MxNDK","name":"Force Jump","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"<p><em><strong>Prerequisite:</strong> Force Leap</em></p>\n<p>Using the Force to augment the strength in your legs, you leap up to 30 feet to an unoccupied space you can see.</p>\n<p><em><strong>Force Potency.</strong></em> When you cast this power using a force slot of 2nd level or higher, your jump distance increases by 5 feet for each slot level above 1st.</p>","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":null,"units":"inst"},"target":{"value":null,"units":"","type":"self"},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":"0","per":""},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":1,"school":"uni","components":{"value":"","vocal":false,"somatic":false,"material":false,"ritual":false,"concentration":false},"materials":{"value":"","consumed":false,"cost":0,"supply":0},"preparation":{"mode":"prepared","prepared":false},"scaling":{"mode":"level","formula":"5 additional feet"},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"consume":{"type":"","target":"","amount":null}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Force%20Jump.webp","effects":[]}
|
||||
|
|
|
@ -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
|
@ -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
|
@ -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) ||
|
||||
|
|
315
system.json
|
@ -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"
|
||||
}
|
||||
|
|
2042
template.json
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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}}
|
||||
|
|