`,
+ buttons: {
+ test: {
+ label: game.i18n.localize("SW5E.ActionAbil"),
+ callback: () => this.rollAbilityTest(abilityId, options)
+ },
+ save: {
+ label: game.i18n.localize("SW5E.ActionSave"),
+ callback: () => this.rollAbilitySave(abilityId, options)
+ }
+ }
+ }).render(true);
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Roll an Ability Test
+ * Prompt the user for input regarding Advantage/Disadvantage and any Situational Bonus
+ * @param {String} abilityId The ability ID (e.g. "str")
+ * @param {Object} options Options which configure how ability tests are rolled
+ * @return {Promise} A Promise which resolves to the created Roll instance
+ */
+ rollAbilityTest(abilityId, options = {}) {
+ const label = CONFIG.SW5E.abilities[abilityId];
+ const abl = this.data.data.abilities[abilityId];
+
+ // Construct parts
+ const parts = ["@mod"];
+ const data = {mod: abl.mod};
+
+ // Add feat-related proficiency bonuses
+ const feats = this.data.flags.sw5e || {};
+ if (feats.remarkableAthlete && SW5E.characterFlags.remarkableAthlete.abilities.includes(abilityId)) {
+ parts.push("@proficiency");
+ data.proficiency = Math.ceil(0.5 * this.data.data.attributes.prof);
+ } else if (feats.jackOfAllTrades) {
+ parts.push("@proficiency");
+ data.proficiency = Math.floor(0.5 * this.data.data.attributes.prof);
+ }
+
+ // Add global actor bonus
+ const bonuses = getProperty(this.data.data, "bonuses.abilities") || {};
+ if (bonuses.check) {
+ parts.push("@checkBonus");
+ data.checkBonus = bonuses.check;
+ }
+
+ // Add provided extra roll parts now because they will get clobbered by mergeObject below
+ if (options.parts?.length > 0) {
+ parts.push(...options.parts);
+ }
+
+ // Roll and return
+ const rollData = foundry.utils.mergeObject(options, {
+ parts: parts,
+ data: data,
+ title: game.i18n.format("SW5E.AbilityPromptTitle", {ability: label}),
+ halflingLucky: feats.halflingLucky,
+ messageData: {
+ "speaker": options.speaker || ChatMessage.getSpeaker({actor: this}),
+ "flags.sw5e.roll": {type: "ability", abilityId}
+ }
});
- chatString = "SW5E.DeathSaveSuccess";
- }
-
- // Increment successes
- else await this.update({"data.attributes.death.success": Math.clamped(successes, 0, 3)});
+ return d20Roll(rollData);
}
- // Save failure
- else {
- let failures = (death.failure || 0) + (d20 === 1 ? 2 : 1);
- await this.update({"data.attributes.death.failure": Math.clamped(failures, 0, 3)});
- if ( failures >= 3 ) { // 3 Failures = death
- chatString = "SW5E.DeathSaveFailure";
- }
- }
+ /* -------------------------------------------- */
- // Display success/failure chat message
- if ( chatString ) {
- let chatData = { content: game.i18n.format(chatString, {name: this.name}), speaker };
- ChatMessage.applyRollMode(chatData, roll.options.rollMode);
- await ChatMessage.create(chatData);
- }
+ /**
+ * Roll an Ability Saving Throw
+ * Prompt the user for input regarding Advantage/Disadvantage and any Situational Bonus
+ * @param {String} abilityId The ability ID (e.g. "str")
+ * @param {Object} options Options which configure how ability tests are rolled
+ * @return {Promise} A Promise which resolves to the created Roll instance
+ */
+ rollAbilitySave(abilityId, options = {}) {
+ const label = CONFIG.SW5E.abilities[abilityId];
+ const abl = this.data.data.abilities[abilityId];
- // Return the rolled result
- return roll;
- }
+ // Construct parts
+ const parts = ["@mod"];
+ const data = {mod: abl.mod};
- /* -------------------------------------------- */
-
- /**
- * Roll a hit die of the appropriate type, gaining hit points equal to the die roll plus your CON modifier
- * @param {string} [denomination] The hit denomination of hit die to roll. Example "d8".
- * If no denomination is provided, the first available HD will be used
- * @param {boolean} [dialog] Show a dialog prompt for configuring the hit die roll?
- * @return {Promise} The created Roll instance, or null if no hit die was rolled
- */
- async rollHitDie(denomination, {dialog=true}={}) {
-
- // If no denomination was provided, choose the first available
- let cls = null;
- if ( !denomination ) {
- cls = this.itemTypes.class.find(c => c.data.data.hitDiceUsed < c.data.data.levels);
- if ( !cls ) return null;
- denomination = cls.data.data.hitDice;
- }
-
- // Otherwise locate a class (if any) which has an available hit die of the requested denomination
- else {
- cls = this.items.find(i => {
- const d = i.data.data;
- return (d.hitDice === denomination) && ((d.hitDiceUsed || 0) < (d.levels || 1));
- });
- }
-
- // If no class is available, display an error notification
- if ( !cls ) {
- ui.notifications.error(game.i18n.format("SW5E.HitDiceWarn", {name: this.name, formula: denomination}));
- return null;
- }
-
- // Prepare roll data
- const parts = [`1${denomination}`, "@abilities.con.mod"];
- const title = game.i18n.localize("SW5E.HitDiceRoll");
- const rollData = foundry.utils.deepClone(this.data.data);
-
- // Call the roll helper utility
- const roll = await damageRoll({
- event: new Event("hitDie"),
- parts: parts,
- data: rollData,
- title: title,
- allowCritical: false,
- fastForward: !dialog,
- dialogOptions: {width: 350},
- messageData: {
- speaker: ChatMessage.getSpeaker({actor: this}),
- "flags.sw5e.roll": {type: "hitDie"}
- }
- });
- if ( !roll ) return null;
-
- // Adjust actor data
- await cls.update({"data.hitDiceUsed": cls.data.data.hitDiceUsed + 1});
- const hp = this.data.data.attributes.hp;
- const dhp = Math.min(hp.max + (hp.tempmax ?? 0) - hp.value, roll.total);
- await this.update({"data.attributes.hp.value": hp.value + dhp});
- return roll;
- }
-
- /* -------------------------------------------- */
-
- /**
- * Results from a rest operation.
- *
- * @typedef {object} RestResult
- * @property {number} dhp Hit points recovered during the rest.
- * @property {number} dhd Hit dice recovered or spent during the rest.
- * @property {object} updateData Updates applied to the actor.
- * @property {Array.
';
- const scrollIntroEnd = scrollDescription.indexOf(pdel);
- const scrollIntro = scrollDescription.slice(0, scrollIntroEnd + pdel.length);
- const scrollDetails = scrollDescription.slice(scrollIntroEnd + pdel.length);
+ /**
+ * Prepare chat card data for loot type items
+ * @private
+ */
+ _lootChatData(data, labels, props) {
+ props.push(
+ game.i18n.localize("SW5E.ItemTypeLoot"),
+ data.weight ? data.weight + " " + game.i18n.localize("SW5E.AbbreviationLbs") : null
+ );
+ }
- // Create a composite description from the scroll description and the power details
- const desc = `${scrollIntro}
${itemData.name} (Level ${level})
${description.value}
Scroll Details
${scrollDetails}`;
+ /* -------------------------------------------- */
- // Create the power scroll data
- const powerScrollData = mergeObject(scrollData, {
- name: `${game.i18n.localize("SW5E.PowerScroll")}: ${itemData.name}`,
- img: itemData.img,
- data: {
- "description.value": desc.trim(),
- source,
- actionType,
- activation,
- duration,
- target,
- range,
- damage,
- save,
- level
- }
- });
- return new this(powerScrollData);
- }
+ /**
+ * Render a chat card for Power type data
+ * @return {Object}
+ * @private
+ */
+ _powerChatData(data, labels, props) {
+ props.push(labels.level, labels.components + (labels.materials ? ` (${labels.materials})` : ""));
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Prepare chat card data for items of the "Feat" type
+ * @private
+ */
+ _featChatData(data, labels, props) {
+ props.push(data.requirements);
+ }
+
+ /* -------------------------------------------- */
+ /* Item Rolls - Attack, Damage, Saves, Checks */
+ /* -------------------------------------------- */
+
+ /**
+ * Place an attack roll using an item (weapon, feat, power, or equipment)
+ * Rely upon the d20Roll logic for the core implementation
+ *
+ * @param {object} options Roll options which are configured and provided to the d20Roll function
+ * @return {Promise} A Promise which resolves to the created Roll instance
+ */
+ async rollAttack(options = {}) {
+ const itemData = this.data.data;
+ const flags = this.actor.data.flags.sw5e || {};
+ if (!this.hasAttack) {
+ throw new Error("You may not place an Attack Roll with this Item.");
+ }
+ let title = `${this.name} - ${game.i18n.localize("SW5E.AttackRoll")}`;
+
+ // get the parts and rollData for this item's attack
+ const {parts, rollData} = this.getAttackToHit();
+
+ // Handle ammunition consumption
+ delete this._ammo;
+ let ammo = null;
+ let ammoUpdate = null;
+ const consume = itemData.consume;
+ if (consume?.type === "ammo") {
+ ammo = this.actor.items.get(consume.target);
+ if (ammo?.data) {
+ const q = ammo.data.data.quantity;
+ 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}}
+ },
+ options
+ );
+ rollConfig.event = options.event;
+
+ // Expanded critical hit thresholds
+ if (this.data.type === "weapon" && flags.weaponCriticalThreshold) {
+ rollConfig.critical = parseInt(flags.weaponCriticalThreshold);
+ } else if (this.data.type === "power" && flags.powerCriticalThreshold) {
+ rollConfig.critical = parseInt(flags.powerCriticalThreshold);
+ }
+
+ // Elven Accuracy
+ if (flags.elvenAccuracy && ["dex", "int", "wis", "cha"].includes(this.abilityMod)) {
+ rollConfig.elvenAccuracy = true;
+ }
+
+ // Apply Halfling Lucky
+ if (flags.halflingLucky) rollConfig.halflingLucky = true;
+
+ // Invoke the d20 roll helper
+ const roll = await d20Roll(rollConfig);
+ if (roll === false) return null;
+
+ // Commit ammunition consumption on attack rolls resource consumption if the attack roll was made
+ if (ammo && !isObjectEmpty(ammoUpdate)) await ammo.update(ammoUpdate);
+ return roll;
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Place a damage roll using an item (weapon, feat, power, or equipment)
+ * Rely upon the damageRoll logic for the core implementation.
+ * @param {MouseEvent} [event] An event which triggered this roll, if any
+ * @param {boolean} [critical] Should damage be rolled as a critical hit?
+ * @param {number} [powerLevel] If the item is a power, override the level for damage scaling
+ * @param {boolean} [versatile] If the item is a weapon, roll damage using the versatile formula
+ * @param {object} [options] Additional options passed to the damageRoll function
+ * @return {Promise} A Promise which resolves to the created Roll instance
+ */
+ rollDamage({critical = false, event = null, powerLevel = null, versatile = false, options = {}} = {}) {
+ if (!this.hasDamage) throw new Error("You may not make a Damage Roll with this Item.");
+ const itemData = this.data.data;
+ const actorData = this.actor.data.data;
+ const messageData = {"flags.sw5e.roll": {type: "damage", itemId: this.id}};
+
+ // Get roll data
+ const parts = itemData.damage.parts.map((d) => d[0]);
+ const rollData = this.getRollData();
+ if (powerLevel) rollData.item.level = powerLevel;
+
+ // Configure the damage roll
+ const actionFlavor = game.i18n.localize(itemData.actionType === "heal" ? "SW5E.Healing" : "SW5E.DamageRoll");
+ const title = `${this.name} - ${actionFlavor}`;
+ const rollConfig = {
+ actor: this.actor,
+ critical: critical ?? event?.altKey ?? false,
+ data: rollData,
+ event: event,
+ fastForward: event ? event.shiftKey || event.altKey || event.ctrlKey || event.metaKey : false,
+ parts: parts,
+ title: title,
+ flavor: this.labels.damageTypes.length ? `${title} (${this.labels.damageTypes})` : title,
+ speaker: ChatMessage.getSpeaker({actor: this.actor}),
+ dialogOptions: {
+ width: 400,
+ top: event ? event.clientY - 80 : null,
+ left: window.innerWidth - 710
+ },
+ messageData: messageData
+ };
+
+ // Adjust damage from versatile usage
+ if (versatile && itemData.damage.versatile) {
+ parts[0] = itemData.damage.versatile;
+ messageData["flags.sw5e.roll"].versatile = true;
+ }
+
+ // 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;
+ this._scaleAtWillDamage(parts, itemData.scaling.formula, level, rollData);
+ } else if (powerLevel && itemData.scaling.mode === "level" && itemData.scaling.formula) {
+ const scaling = itemData.scaling.formula;
+ this._scalePowerDamage(parts, itemData.level, powerLevel, scaling, rollData);
+ }
+ }
+
+ // Add damage bonus formula
+ const actorBonus = getProperty(actorData, `bonuses.${itemData.actionType}`) || {};
+ if (actorBonus.damage && parseInt(actorBonus.damage) !== 0) {
+ parts.push(actorBonus.damage);
+ }
+
+ // Handle ammunition damage
+ const ammoData = this._ammo?.data;
+
+ // only add the ammunition damage if the ammution is a consumable with type 'ammo'
+ if (this._ammo && ammoData.type === "consumable" && ammoData.data.consumableType === "ammo") {
+ parts.push("@ammo");
+ rollData["ammo"] = ammoData.data.damage.parts.map((p) => p[0]).join("+");
+ rollConfig.flavor += ` [${this._ammo.name}]`;
+ delete this._ammo;
+ }
+
+ // Scale melee critical hit damage
+ if (itemData.actionType === "mwak") {
+ rollConfig.criticalBonusDice = this.actor.getFlag("sw5e", "meleeCriticalDamageDice") ?? 0;
+ }
+
+ // Call the roll helper utility
+ return damageRoll(mergeObject(rollConfig, options));
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Adjust an at-will damage formula to scale it for higher level characters and monsters
+ * @private
+ */
+ _scaleAtWillDamage(parts, scale, level, rollData) {
+ const add = Math.floor((level + 1) / 6);
+ if (add === 0) return;
+ this._scaleDamage(parts, scale || parts.join(" + "), add, rollData);
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Adjust the power damage formula to scale it for power level up-casting
+ * @param {Array} parts The original damage parts
+ * @param {number} baseLevel The default power level
+ * @param {number} powerLevel The casted power level
+ * @param {string} formula The scaling formula
+ * @param {object} rollData A data object that should be applied to the scaled damage roll
+ * @return {string[]} The scaled roll parts
+ * @private
+ */
+ _scalePowerDamage(parts, baseLevel, powerLevel, formula, rollData) {
+ const upcastLevels = Math.max(powerLevel - baseLevel, 0);
+ if (upcastLevels === 0) return parts;
+ this._scaleDamage(parts, formula, upcastLevels, rollData);
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Scale an array of damage parts according to a provided scaling formula and scaling multiplier
+ * @param {string[]} parts Initial roll parts
+ * @param {string} scaling A scaling formula
+ * @param {number} times A number of times to apply the scaling formula
+ * @param {object} rollData A data object that should be applied to the scaled damage roll
+ * @return {string[]} The scaled roll parts
+ * @private
+ */
+ _scaleDamage(parts, scaling, times, rollData) {
+ if (times <= 0) return parts;
+ const p0 = new Roll(parts[0], rollData);
+ const s = new Roll(scaling, rollData).alter(times);
+
+ // Attempt to simplify by combining like dice terms
+ let simplified = false;
+ if (s.terms[0] instanceof Die && s.terms.length === 1) {
+ const d0 = p0.terms[0];
+ const s0 = s.terms[0];
+ if (d0 instanceof Die && d0.faces === s0.faces && d0.modifiers.equals(s0.modifiers)) {
+ d0.number += s0.number;
+ parts[0] = p0.formula;
+ simplified = true;
+ }
+ }
+
+ // Otherwise add to the first part
+ if (!simplified) {
+ parts[0] = `${parts[0]} + ${s.formula}`;
+ }
+ return parts;
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Place an attack roll using an item (weapon, feat, power, or equipment)
+ * Rely upon the d20Roll logic for the core implementation
+ *
+ * @return {Promise} A Promise which resolves to the created Roll instance
+ */
+ async rollFormula(options = {}) {
+ if (!this.data.data.formula) {
+ throw new Error("This Item does not have a formula to roll!");
+ }
+
+ // Define Roll Data
+ const rollData = this.getRollData();
+ if (options.powerLevel) rollData.item.level = options.powerLevel;
+ const title = `${this.name} - ${game.i18n.localize("SW5E.OtherFormula")}`;
+
+ // Invoke the roll and submit it to chat
+ const roll = new Roll(rollData.item.formula, rollData).roll();
+ roll.toMessage({
+ speaker: ChatMessage.getSpeaker({actor: this.actor}),
+ flavor: title,
+ rollMode: game.settings.get("core", "rollMode"),
+ messageData: {"flags.sw5e.roll": {type: "other", itemId: this.id}}
+ });
+ return roll;
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Perform an ability recharge test for an item which uses the d6 recharge mechanic
+ * @return {Promise} A Promise which resolves to the created Roll instance
+ */
+ async rollRecharge() {
+ const data = this.data.data;
+ if (!data.recharge.value) return;
+
+ // Roll the check
+ const roll = new Roll("1d6").roll();
+ const success = roll.total >= parseInt(data.recharge.value);
+
+ // Display a Chat Message
+ const promises = [
+ roll.toMessage({
+ flavor: `${game.i18n.format("SW5E.ItemRechargeCheck", {name: this.name})} - ${game.i18n.localize(
+ success ? "SW5E.ItemRechargeSuccess" : "SW5E.ItemRechargeFailure"
+ )}`,
+ speaker: ChatMessage.getSpeaker({actor: this.actor, token: this.actor.token})
+ })
+ ];
+
+ // Update the Item data
+ if (success) promises.push(this.update({"data.recharge.charged": true}));
+ return Promise.all(promises).then(() => roll);
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Roll a Tool Check. Rely upon the d20Roll logic for the core implementation
+ * @prarm {Object} options Roll configuration options provided to the d20Roll function
+ * @return {Promise} A Promise which resolves to the created Roll instance
+ */
+ rollToolCheck(options = {}) {
+ if (this.type !== "tool") throw "Wrong item type!";
+
+ // Prepare roll data
+ let rollData = this.getRollData();
+ const parts = [`@mod`, "@prof"];
+ const title = `${this.name} - ${game.i18n.localize("SW5E.ToolCheck")}`;
+
+ // Add global actor bonus
+ const bonuses = getProperty(this.actor.data.data, "bonuses.abilities") || {};
+ if (bonuses.check) {
+ parts.push("@checkBonus");
+ rollData.checkBonus = bonuses.check;
+ }
+
+ // Compose the roll data
+ const rollConfig = mergeObject(
+ {
+ parts: parts,
+ data: rollData,
+ title: title,
+ speaker: ChatMessage.getSpeaker({actor: this.actor}),
+ flavor: title,
+ dialogOptions: {
+ width: 400,
+ top: options.event ? options.event.clientY - 80 : null,
+ left: window.innerWidth - 710
+ },
+ chooseModifier: true,
+ halflingLucky: this.actor.getFlag("sw5e", "halflingLucky") || false,
+ reliableTalent: this.data.data.proficient >= 1 && this.actor.getFlag("sw5e", "reliableTalent"),
+ messageData: {"flags.sw5e.roll": {type: "tool", itemId: this.id}}
+ },
+ options
+ );
+ rollConfig.event = options.event;
+
+ // Call the roll helper utility
+ return d20Roll(rollConfig);
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Prepare a data object which is passed to any Roll formulas which are created related to this Item
+ * @private
+ */
+ getRollData() {
+ if (!this.actor) return null;
+ const rollData = this.actor.getRollData();
+ rollData.item = foundry.utils.deepClone(this.data.data);
+
+ // Include an ability score modifier if one exists
+ const abl = this.abilityMod;
+ if (abl) {
+ const ability = rollData.abilities[abl];
+ if (!ability) {
+ console.warn(
+ `Item ${this.name} in Actor ${this.actor.name} has an invalid item ability modifier of ${abl} defined`
+ );
+ }
+ rollData["mod"] = ability?.mod || 0;
+ }
+
+ // Include a proficiency score
+ const prof = "proficient" in rollData.item ? rollData.item.proficient || 0 : 1;
+ rollData["prof"] = Math.floor(prof * (rollData.attributes.prof || 0));
+ return rollData;
+ }
+
+ /* -------------------------------------------- */
+ /* Chat Message Helpers */
+ /* -------------------------------------------- */
+
+ static chatListeners(html) {
+ html.on("click", ".card-buttons button", this._onChatCardAction.bind(this));
+ html.on("click", ".item-name", this._onChatCardToggleContent.bind(this));
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Handle execution of a chat card action via a click event on one of the card buttons
+ * @param {Event} event The originating click event
+ * @returns {Promise} A promise which resolves once the handler workflow is complete
+ * @private
+ */
+ static async _onChatCardAction(event) {
+ event.preventDefault();
+
+ // Extract card data
+ const button = event.currentTarget;
+ button.disabled = true;
+ const card = button.closest(".chat-card");
+ const messageId = card.closest(".message").dataset.messageId;
+ const message = game.messages.get(messageId);
+ const action = button.dataset.action;
+
+ // Validate permission to proceed with the roll
+ const isTargetted = action === "save";
+ if (!(isTargetted || game.user.isGM || message.isAuthor)) return;
+
+ // Recover the actor for the chat card
+ const actor = await this._getChatCardActor(card);
+ if (!actor) return;
+
+ // Get the Item from stored flag data or by the item ID on the Actor
+ const storedData = message.getFlag("sw5e", "itemData");
+ const item = storedData ? new this(storedData, {parent: actor}) : actor.items.get(card.dataset.itemId);
+ if (!item) {
+ return ui.notifications.error(
+ game.i18n.format("SW5E.ActionWarningNoItem", {item: card.dataset.itemId, name: actor.name})
+ );
+ }
+ const powerLevel = parseInt(card.dataset.powerLevel) || null;
+
+ // Handle different actions
+ switch (action) {
+ case "attack":
+ await item.rollAttack({event});
+ break;
+ case "damage":
+ case "versatile":
+ await item.rollDamage({
+ critical: event.altKey,
+ event: event,
+ powerLevel: powerLevel,
+ versatile: action === "versatile"
+ });
+ break;
+ case "formula":
+ await item.rollFormula({event, powerLevel});
+ break;
+ case "save":
+ const targets = this._getChatCardTargets(card);
+ for (let token of targets) {
+ const speaker = ChatMessage.getSpeaker({scene: canvas.scene, token: token});
+ await token.actor.rollAbilitySave(button.dataset.ability, {event, speaker});
+ }
+ break;
+ case "toolCheck":
+ await item.rollToolCheck({event});
+ break;
+ case "placeTemplate":
+ const template = game.sw5e.canvas.AbilityTemplate.fromItem(item);
+ if (template) template.drawPreview();
+ break;
+ }
+
+ // Re-enable the button
+ button.disabled = false;
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Handle toggling the visibility of chat card content when the name is clicked
+ * @param {Event} event The originating click event
+ * @private
+ */
+ static _onChatCardToggleContent(event) {
+ event.preventDefault();
+ const header = event.currentTarget;
+ const card = header.closest(".chat-card");
+ const content = card.querySelector(".card-content");
+ content.style.display = content.style.display === "none" ? "block" : "none";
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Get the Actor which is the author of a chat card
+ * @param {HTMLElement} card The chat card being used
+ * @return {Actor|null} The Actor entity or null
+ * @private
+ */
+ static async _getChatCardActor(card) {
+ // Case 1 - a synthetic actor from a Token
+ if (card.dataset.tokenId) {
+ const token = await fromUuid(card.dataset.tokenId);
+ if (!token) return null;
+ return token.actor;
+ }
+
+ // Case 2 - use Actor ID directory
+ const actorId = card.dataset.actorId;
+ return game.actors.get(actorId) || null;
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Get the Actor which is the author of a chat card
+ * @param {HTMLElement} card The chat card being used
+ * @return {Actor[]} An Array of Actor entities, if any
+ * @private
+ */
+ static _getChatCardTargets(card) {
+ let targets = canvas.tokens.controlled.filter((t) => !!t.actor);
+ if (!targets.length && game.user.character) targets = targets.concat(game.user.character.getActiveTokens());
+ if (!targets.length) ui.notifications.warn(game.i18n.localize("SW5E.ActionWarningNoToken"));
+ return targets;
+ }
+
+ /* -------------------------------------------- */
+ /* Event Handlers */
+ /* -------------------------------------------- */
+
+ /** @inheritdoc */
+ async _preCreate(data, options, user) {
+ await super._preCreate(data, options, user);
+ if (!this.isEmbedded || this.parent.type === "vehicle") return;
+ const actorData = this.parent.data;
+ const isNPC = this.parent.type === "npc";
+ let updates;
+ switch (data.type) {
+ case "equipment":
+ updates = this._onCreateOwnedEquipment(data, actorData, isNPC);
+ break;
+ case "weapon":
+ updates = this._onCreateOwnedWeapon(data, actorData, isNPC);
+ break;
+ case "power":
+ updates = this._onCreateOwnedPower(data, actorData, isNPC);
+ break;
+ }
+ if (updates) return this.data.update(updates);
+ }
+
+ /* -------------------------------------------- */
+
+ /** @inheritdoc */
+ _onCreate(data, options, userId) {
+ super._onCreate(data, options, userId);
+
+ // The below options are only needed for character classes
+ if (userId !== game.user.id) return;
+ const isCharacterClass = this.parent && this.parent.type !== "vehicle" && this.type === "class";
+ if (!isCharacterClass) return;
+
+ // Assign a new primary class
+ const pc = this.parent.items.get(this.parent.data.data.details.originalClass);
+ if (!pc) this.parent._assignPrimaryClass();
+
+ // Prompt to add new class features
+ if (options.addFeatures === false) return;
+ this.parent
+ .getClassFeatures({
+ className: this.name,
+ archetypeName: this.data.data.archetype,
+ level: this.data.data.levels
+ })
+ .then((features) => {
+ return this.parent.addEmbeddedItems(features, options.promptAddFeatures);
+ });
+ }
+
+ /* -------------------------------------------- */
+
+ /** @inheritdoc */
+ _onUpdate(changed, options, userId) {
+ super._onUpdate(changed, options, userId);
+
+ // The below options are only needed for character classes
+ if (userId !== game.user.id) return;
+ const isCharacterClass = this.parent && this.parent.type !== "vehicle" && this.type === "class";
+ if (!isCharacterClass) return;
+
+ // Prompt to add new class features
+ const addFeatures = changed["name"] || (changed.data && ["archetype", "levels"].some((k) => k in changed.data));
+ if (!addFeatures || options.addFeatures === false) return;
+ this.parent
+ .getClassFeatures({
+ className: changed.name || this.name,
+ archetypeName: changed.data?.archetype || this.data.data.archetype,
+ level: changed.data?.levels || this.data.data.levels
+ })
+ .then((features) => {
+ return this.parent.addEmbeddedItems(features, options.promptAddFeatures);
+ });
+ }
+
+ /* -------------------------------------------- */
+
+ /** @inheritdoc */
+ _onDelete(options, userId) {
+ super._onDelete(options, userId);
+
+ // Assign a new primary class
+ if (this.parent && this.type === "class" && userId === game.user.id) {
+ if (this.id !== this.parent.data.data.details.originalClass) return;
+ this.parent._assignPrimaryClass();
+ }
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Pre-creation logic for the automatic configuration of owned equipment type Items
+ * @private
+ */
+ _onCreateOwnedEquipment(data, actorData, isNPC) {
+ const updates = {};
+ if (foundry.utils.getProperty(data, "data.equipped") === undefined) {
+ updates["data.equipped"] = isNPC; // NPCs automatically equip equipment
+ }
+ if (foundry.utils.getProperty(data, "data.proficient") === undefined) {
+ if (isNPC) {
+ updates["data.proficient"] = true; // NPCs automatically have equipment proficiency
+ } else {
+ const armorProf = CONFIG.SW5E.armorProficienciesMap[data.data?.armor?.type]; // Player characters check proficiency
+ const actorArmorProfs = actorData.data.traits?.armorProf?.value || [];
+ updates["data.proficient"] = armorProf === true || actorArmorProfs.includes(armorProf);
+ }
+ }
+ return updates;
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Pre-creation logic for the automatic configuration of owned power type Items
+ * @private
+ */
+ _onCreateOwnedPower(data, actorData, isNPC) {
+ const updates = {};
+ updates["data.preparation.prepared"] = true; // Automatically prepare powers for everyone
+ return updates;
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Pre-creation logic for the automatic configuration of owned weapon type Items
+ * @private
+ */
+ _onCreateOwnedWeapon(data, actorData, isNPC) {
+ const updates = {};
+ if (foundry.utils.getProperty(data, "data.equipped") === undefined) {
+ updates["data.equipped"] = isNPC; // NPCs automatically equip weapons
+ }
+ if (foundry.utils.getProperty(data, "data.proficient") === undefined) {
+ if (isNPC) {
+ updates["data.proficient"] = true; // NPCs automatically have equipment proficiency
+ } else {
+ // TODO: With the changes to make weapon proficiencies more verbose, this may need revising
+ const weaponProf = CONFIG.SW5E.weaponProficienciesMap[data.data?.weaponType]; // Player characters check proficiency
+ const actorWeaponProfs = actorData.data.traits?.weaponProf?.value || [];
+ updates["data.proficient"] = weaponProf === true || actorWeaponProfs.includes(weaponProf);
+ }
+ }
+ return updates;
+ }
+
+ /* -------------------------------------------- */
+ /* Factory Methods */
+ /* -------------------------------------------- */
+ // TODO: Make work properly
+ /**
+ * Create a consumable power scroll Item from a power Item.
+ * @param {Item5e} power The power to be made into a scroll
+ * @return {Item5e} The created scroll consumable item
+ */
+ static async createScrollFromPower(power) {
+ // Get power data
+ const itemData = power instanceof Item5e ? power.data : power;
+ const {actionType, description, source, activation, duration, target, range, damage, save, level} =
+ itemData.data;
+
+ // Get scroll data
+ const scrollUuid = `Compendium.${CONFIG.SW5E.sourcePacks.ITEMS}.${CONFIG.SW5E.powerScrollIds[level]}`;
+ const scrollItem = await fromUuid(scrollUuid);
+ const scrollData = scrollItem.data;
+ delete scrollData._id;
+
+ // Split the scroll description into an intro paragraph and the remaining details
+ const scrollDescription = scrollData.data.description.value;
+ const pdel = "";
+ const scrollIntroEnd = scrollDescription.indexOf(pdel);
+ const scrollIntro = scrollDescription.slice(0, scrollIntroEnd + pdel.length);
+ const scrollDetails = scrollDescription.slice(scrollIntroEnd + pdel.length);
+
+ // Create a composite description from the scroll description and the power details
+ const desc = `${scrollIntro}
${itemData.name} (Level ${level})
${description.value}
Scroll Details
${scrollDetails}`;
+
+ // Create the power scroll data
+ const powerScrollData = mergeObject(scrollData, {
+ name: `${game.i18n.localize("SW5E.PowerScroll")}: ${itemData.name}`,
+ img: itemData.img,
+ data: {
+ "description.value": desc.trim(),
+ source,
+ actionType,
+ activation,
+ duration,
+ target,
+ range,
+ damage,
+ save,
+ level
+ }
+ });
+ return new this(powerScrollData);
+ }
}
diff --git a/module/item/sheet.js b/module/item/sheet.js
index 556032e7..0bb7f64b 100644
--- a/module/item/sheet.js
+++ b/module/item/sheet.js
@@ -1,362 +1,370 @@
import TraitSelector from "../apps/trait-selector.js";
-import { onManageActiveEffect, prepareActiveEffectCategories } from "../effects.js";
+import {onManageActiveEffect, prepareActiveEffectCategories} from "../effects.js";
/**
* Override and extend the core ItemSheet implementation to handle specific item types
* @extends {ItemSheet}
*/
export default class ItemSheet5e extends ItemSheet {
- constructor(...args) {
- super(...args);
+ constructor(...args) {
+ super(...args);
- // Expand the default size of the class sheet
- if (this.object.data.type === "class") {
- this.options.width = this.position.width = 600;
- this.options.height = this.position.height = 680;
- }
- }
-
- /* -------------------------------------------- */
-
- /** @inheritdoc */
- static get defaultOptions() {
- return foundry.utils.mergeObject(super.defaultOptions, {
- width: 560,
- height: 400,
- classes: ["sw5e", "sheet", "item"],
- resizable: true,
- scrollY: [".tab.details"],
- tabs: [{ navSelector: ".tabs", contentSelector: ".sheet-body", initial: "description" }]
- });
- }
-
- /* -------------------------------------------- */
-
- /** @inheritdoc */
- get template() {
- const path = "systems/sw5e/templates/items/";
- return `${path}/${this.item.data.type}.html`;
- }
-
- /* -------------------------------------------- */
-
- /** @override */
- async getData(options) {
- const data = super.getData(options);
- const itemData = data.data;
- data.labels = this.item.labels;
- data.config = CONFIG.SW5E;
-
- // Item Type, Status, and Details
- data.itemType = game.i18n.localize(`ITEM.Type${data.item.type.titleCase()}`);
- data.itemStatus = this._getItemStatus(itemData);
- data.itemProperties = this._getItemProperties(itemData);
- data.isPhysical = itemData.data.hasOwnProperty("quantity");
-
- // Potential consumption targets
- data.abilityConsumptionTargets = this._getItemConsumptionTargets(itemData);
-
- // Action Detail
- data.hasAttackRoll = this.item.hasAttack;
- data.isHealing = itemData.data.actionType === "heal";
- data.isFlatDC = getProperty(itemData, "data.save.scaling") === "flat";
- data.isLine = ["line", "wall"].includes(itemData.data.target?.type);
-
- // Original maximum uses formula
- const sourceMax = foundry.utils.getProperty(this.item.data._source, "data.uses.max");
- if ( sourceMax ) itemData.data.uses.max = sourceMax;
-
- // Vehicles
- data.isCrewed = itemData.data.activation?.type === "crew";
- data.isMountable = this._isItemMountable(itemData);
-
- // Prepare Active Effects
- data.effects = prepareActiveEffectCategories(this.item.effects);
-
- // Re-define the template data references (backwards compatible)
- data.item = itemData;
- data.data = itemData.data;
- return data;
- }
-
- /* -------------------------------------------- */
-
- /**
- * Get the valid item consumption targets which exist on the actor
- * @param {Object} item Item data for the item being displayed
- * @return {{string: string}} An object of potential consumption targets
- * @private
- */
- _getItemConsumptionTargets(item) {
- const consume = item.data.consume || {};
- if (!consume.type) return [];
- const actor = this.item.actor;
- if (!actor) return {};
-
- // Ammunition
- if (consume.type === "ammo") {
- return actor.itemTypes.consumable.reduce(
- (ammo, i) => {
- if (i.data.data.consumableType === "ammo") {
- ammo[i.id] = `${i.name} (${i.data.data.quantity})`;
- }
- return ammo;
- },
- { [item._id]: `${item.name} (${item.data.quantity})` }
- );
- }
-
- // Attributes
- else if (consume.type === "attribute") {
- const attributes = TokenDocument.getTrackedAttributes(actor.data.data);
- attributes.bar.forEach(a => a.push("value"));
- return attributes.bar.concat(attributes.value).reduce((obj, a) => {
- let k = a.join(".");
- obj[k] = k;
- return obj;
- }, {});
- }
-
- // Materials
- else if (consume.type === "material") {
- return actor.items.reduce((obj, i) => {
- if (["consumable", "loot"].includes(i.data.type) && !i.data.data.activation) {
- obj[i.id] = `${i.name} (${i.data.data.quantity})`;
+ // Expand the default size of the class sheet
+ if (this.object.data.type === "class") {
+ this.options.width = this.position.width = 600;
+ this.options.height = this.position.height = 680;
}
- return obj;
- }, {});
}
- // Charges
- else if (consume.type === "charges") {
- return actor.items.reduce((obj, i) => {
- // Limited-use items
- const uses = i.data.data.uses || {};
- if (uses.per && uses.max) {
- const label =
- uses.per === "charges"
- ? ` (${game.i18n.format("SW5E.AbilityUseChargesLabel", { value: uses.value })})`
- : ` (${game.i18n.format("SW5E.AbilityUseConsumableLabel", { max: uses.max, per: uses.per })})`;
- obj[i.id] = i.name + label;
+ /* -------------------------------------------- */
+
+ /** @inheritdoc */
+ static get defaultOptions() {
+ return foundry.utils.mergeObject(super.defaultOptions, {
+ width: 560,
+ height: 400,
+ classes: ["sw5e", "sheet", "item"],
+ resizable: true,
+ scrollY: [".tab.details"],
+ tabs: [{navSelector: ".tabs", contentSelector: ".sheet-body", initial: "description"}]
+ });
+ }
+
+ /* -------------------------------------------- */
+
+ /** @inheritdoc */
+ get template() {
+ const path = "systems/sw5e/templates/items/";
+ return `${path}/${this.item.data.type}.html`;
+ }
+
+ /* -------------------------------------------- */
+
+ /** @override */
+ async getData(options) {
+ const data = super.getData(options);
+ const itemData = data.data;
+ data.labels = this.item.labels;
+ data.config = CONFIG.SW5E;
+
+ // Item Type, Status, and Details
+ data.itemType = game.i18n.localize(`ITEM.Type${data.item.type.titleCase()}`);
+ data.itemStatus = this._getItemStatus(itemData);
+ data.itemProperties = this._getItemProperties(itemData);
+ data.isPhysical = itemData.data.hasOwnProperty("quantity");
+
+ // Potential consumption targets
+ data.abilityConsumptionTargets = this._getItemConsumptionTargets(itemData);
+
+ // Action Details
+ data.hasAttackRoll = this.item.hasAttack;
+ data.isHealing = itemData.data.actionType === "heal";
+ data.isFlatDC = getProperty(itemData, "data.save.scaling") === "flat";
+ data.isLine = ["line", "wall"].includes(itemData.data.target?.type);
+
+ // Original maximum uses formula
+ const sourceMax = foundry.utils.getProperty(this.item.data._source, "data.uses.max");
+ if (sourceMax) itemData.data.uses.max = sourceMax;
+
+ // Vehicles
+ data.isCrewed = itemData.data.activation?.type === "crew";
+ data.isMountable = this._isItemMountable(itemData);
+
+ // Prepare Active Effects
+ data.effects = prepareActiveEffectCategories(this.item.effects);
+
+ // Re-define the template data references (backwards compatible)
+ data.item = itemData;
+ data.data = itemData.data;
+ return data;
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Get the valid item consumption targets which exist on the actor
+ * @param {Object} item Item data for the item being displayed
+ * @return {{string: string}} An object of potential consumption targets
+ * @private
+ */
+ _getItemConsumptionTargets(item) {
+ const consume = item.data.consume || {};
+ if (!consume.type) return [];
+ const actor = this.item.actor;
+ if (!actor) return {};
+
+ // Ammunition
+ if (consume.type === "ammo") {
+ return actor.itemTypes.consumable.reduce(
+ (ammo, i) => {
+ if (i.data.data.consumableType === "ammo") {
+ ammo[i.id] = `${i.name} (${i.data.data.quantity})`;
+ }
+ return ammo;
+ },
+ {[item._id]: `${item.name} (${item.data.quantity})`}
+ );
}
- // Recharging items
- const recharge = i.data.data.recharge || {};
- if (recharge.value) obj[i.id] = `${i.name} (${game.i18n.format("SW5E.Recharge")})`;
- return obj;
- }, {});
- } else return {};
- }
+ // Attributes
+ else if (consume.type === "attribute") {
+ const attributes = TokenDocument.getTrackedAttributes(actor.data.data);
+ attributes.bar.forEach((a) => a.push("value"));
+ return attributes.bar.concat(attributes.value).reduce((obj, a) => {
+ let k = a.join(".");
+ obj[k] = k;
+ return obj;
+ }, {});
+ }
- /* -------------------------------------------- */
+ // Materials
+ else if (consume.type === "material") {
+ return actor.items.reduce((obj, i) => {
+ if (["consumable", "loot"].includes(i.data.type) && !i.data.data.activation) {
+ obj[i.id] = `${i.name} (${i.data.data.quantity})`;
+ }
+ return obj;
+ }, {});
+ }
- /**
- * Get the text item status which is shown beneath the Item type in the top-right corner of the sheet
- * @return {string}
- * @private
- */
- _getItemStatus(item) {
- if (item.type === "power") {
- return CONFIG.SW5E.powerPreparationModes[item.data.preparation];
- } else if (["weapon", "equipment"].includes(item.type)) {
- return game.i18n.localize(item.data.equipped ? "SW5E.Equipped" : "SW5E.Unequipped");
- } else if (item.type === "tool") {
- return game.i18n.localize(item.data.proficient ? "SW5E.Proficient" : "SW5E.NotProficient");
- }
- }
+ // Charges
+ else if (consume.type === "charges") {
+ return actor.items.reduce((obj, i) => {
+ // Limited-use items
+ const uses = i.data.data.uses || {};
+ if (uses.per && uses.max) {
+ const label =
+ uses.per === "charges"
+ ? ` (${game.i18n.format("SW5E.AbilityUseChargesLabel", {value: uses.value})})`
+ : ` (${game.i18n.format("SW5E.AbilityUseConsumableLabel", {
+ max: uses.max,
+ per: uses.per
+ })})`;
+ obj[i.id] = i.name + label;
+ }
- /* -------------------------------------------- */
-
- /**
- * Get the Array of item properties which are used in the small sidebar of the description tab
- * @return {Array}
- * @private
- */
- _getItemProperties(item) {
- const props = [];
- const labels = this.item.labels;
-
- if (item.type === "weapon") {
- props.push(
- ...Object.entries(item.data.properties)
- .filter((e) => e[1] === true)
- .map((e) => CONFIG.SW5E.weaponProperties[e[0]])
- );
- } else if (item.type === "power") {
- props.push(
- labels.components,
- labels.materials,
- item.data.components.concentration ? game.i18n.localize("SW5E.Concentration") : null,
- item.data.components.ritual ? game.i18n.localize("SW5E.Ritual") : null
- );
- } else if (item.type === "equipment") {
- props.push(CONFIG.SW5E.equipmentTypes[item.data.armor.type]);
- props.push(labels.armor);
- } else if (item.type === "feat") {
- props.push(labels.featType);
- //TODO: Work out these
- } else if (item.type === "species") {
- //props.push(labels.species);
- } else if (item.type === "archetype") {
- //props.push(labels.archetype);
- } else if (item.type === "background") {
- //props.push(labels.background);
- } else if (item.type === "classfeature") {
- //props.push(labels.classfeature);
- } else if (item.type === "deployment") {
- //props.push(labels.deployment);
- } else if (item.type === "venture") {
- //props.push(labels.venture);
- } else if (item.type === "fightingmastery") {
- //props.push(labels.fightingmastery);
- } else if (item.type === "fightingstyle") {
- //props.push(labels.fightingstyle);
- } else if (item.type === "lightsaberform") {
- //props.push(labels.lightsaberform);
+ // Recharging items
+ const recharge = i.data.data.recharge || {};
+ if (recharge.value) obj[i.id] = `${i.name} (${game.i18n.format("SW5E.Recharge")})`;
+ return obj;
+ }, {});
+ } else return {};
}
- // Action type
- if (item.data.actionType) {
- props.push(CONFIG.SW5E.itemActionTypes[item.data.actionType]);
+ /* -------------------------------------------- */
+
+ /**
+ * Get the text item status which is shown beneath the Item type in the top-right corner of the sheet
+ * @return {string}
+ * @private
+ */
+ _getItemStatus(item) {
+ if (item.type === "power") {
+ return CONFIG.SW5E.powerPreparationModes[item.data.preparation];
+ } else if (["weapon", "equipment"].includes(item.type)) {
+ return game.i18n.localize(item.data.equipped ? "SW5E.Equipped" : "SW5E.Unequipped");
+ } else if (item.type === "tool") {
+ return game.i18n.localize(item.data.proficient ? "SW5E.Proficient" : "SW5E.NotProficient");
+ }
}
- // Action usage
- if (item.type !== "weapon" && item.data.activation && !isObjectEmpty(item.data.activation)) {
- props.push(labels.activation, labels.range, labels.target, labels.duration);
- }
- return props.filter((p) => !!p);
- }
+ /* -------------------------------------------- */
- /* -------------------------------------------- */
+ /**
+ * Get the Array of item properties which are used in the small sidebar of the description tab
+ * @return {Array}
+ * @private
+ */
+ _getItemProperties(item) {
+ const props = [];
+ const labels = this.item.labels;
- /**
- * Is this item a separate large object like a siege engine or vehicle
- * component that is usually mounted on fixtures rather than equipped, and
- * has its own AC and HP.
- * @param item
- * @returns {boolean}
- * @private
- */
- _isItemMountable(item) {
- const data = item.data;
- return (
- (item.type === "weapon" && data.weaponType === "siege") ||
- (item.type === "equipment" && data.armor.type === "vehicle")
- );
- }
+ if (item.type === "weapon") {
+ props.push(
+ ...Object.entries(item.data.properties)
+ .filter((e) => e[1] === true)
+ .map((e) => CONFIG.SW5E.weaponProperties[e[0]])
+ );
+ } else if (item.type === "power") {
+ props.push(
+ labels.materials,
+ item.data.components.concentration ? game.i18n.localize("SW5E.Concentration") : null,
+ item.data.components.ritual ? game.i18n.localize("SW5E.Ritual") : null
+ );
+ } else if (item.type === "equipment") {
+ props.push(CONFIG.SW5E.equipmentTypes[item.data.armor.type]);
+ props.push(labels.armor);
+ } else if (item.type === "feat") {
+ props.push(labels.featType);
+ //TODO: Work out these
+ } else if (item.type === "species") {
+ //props.push(labels.species);
+ } else if (item.type === "archetype") {
+ //props.push(labels.archetype);
+ } else if (item.type === "background") {
+ //props.push(labels.background);
+ } else if (item.type === "classfeature") {
+ //props.push(labels.classfeature);
+ } else if (item.type === "deployment") {
+ //props.push(labels.deployment);
+ } else if (item.type === "venture") {
+ //props.push(labels.venture);
+ } else if (item.type === "fightingmastery") {
+ //props.push(labels.fightingmastery);
+ } else if (item.type === "fightingstyle") {
+ //props.push(labels.fightingstyle);
+ } else if (item.type === "lightsaberform") {
+ //props.push(labels.lightsaberform);
+ }
- /* -------------------------------------------- */
+ // Action type
+ if (item.data.actionType) {
+ props.push(CONFIG.SW5E.itemActionTypes[item.data.actionType]);
+ }
- /** @inheritdoc */
- setPosition(position = {}) {
- if (!(this._minimized || position.height)) {
- position.height = this._tabs[0].active === "details" ? "auto" : this.options.height;
- }
- return super.setPosition(position);
- }
-
- /* -------------------------------------------- */
- /* Form Submission */
- /* -------------------------------------------- */
-
- /** @inheritdoc */
- _getSubmitData(updateData = {}) {
- // Create the expanded update data object
- const fd = new FormDataExtended(this.form, { editors: this.editors });
- let data = fd.toObject();
- if (updateData) data = mergeObject(data, updateData);
- else data = expandObject(data);
-
- // Handle Damage array
- const damage = data.data?.damage;
- if (damage) damage.parts = Object.values(damage?.parts || {}).map((d) => [d[0] || "", d[1] || ""]);
-
- // Return the flattened submission data
- return flattenObject(data);
- }
-
- /* -------------------------------------------- */
-
- /** @inheritdoc */
- activateListeners(html) {
- super.activateListeners(html);
- if (this.isEditable) {
- html.find(".damage-control").click(this._onDamageControl.bind(this));
- html.find(".trait-selector.class-skills").click(this._onConfigureTraits.bind(this));
- html.find(".effect-control").click((ev) => {
- if (this.item.isOwned) return ui.notifications.warn("Managing Active Effects within an Owned Item is not currently supported and will be added in a subsequent update.");
- onManageActiveEffect(ev, this.item);
- });
- }
- }
-
- /* -------------------------------------------- */
-
- /**
- * Add or remove a damage part from the damage formula
- * @param {Event} event The original click event
- * @return {Promise}
- * @private
- */
- async _onDamageControl(event) {
- event.preventDefault();
- const a = event.currentTarget;
-
- // Add new damage component
- if (a.classList.contains("add-damage")) {
- await this._onSubmit(event); // Submit any unsaved changes
- const damage = this.item.data.data.damage;
- return this.item.update({ "data.damage.parts": damage.parts.concat([["", ""]]) });
+ // Action usage
+ if (item.type !== "weapon" && item.data.activation && !isObjectEmpty(item.data.activation)) {
+ props.push(labels.activation, labels.range, labels.target, labels.duration);
+ }
+ return props.filter((p) => !!p);
}
- // Remove a damage component
- if (a.classList.contains("delete-damage")) {
- await this._onSubmit(event); // Submit any unsaved changes
- const li = a.closest(".damage-part");
- const damage = foundry.utils.deepClone(this.item.data.data.damage);
- damage.parts.splice(Number(li.dataset.damagePart), 1);
- return this.item.update({ "data.damage.parts": damage.parts });
+ /* -------------------------------------------- */
+
+ /**
+ * Is this item a separate large object like a siege engine or vehicle
+ * component that is usually mounted on fixtures rather than equipped, and
+ * has its own AC and HP.
+ * @param item
+ * @returns {boolean}
+ * @private
+ */
+ _isItemMountable(item) {
+ const data = item.data;
+ return (
+ (item.type === "weapon" && data.weaponType === "siege") ||
+ (item.type === "equipment" && data.armor.type === "vehicle")
+ );
}
- }
- /* -------------------------------------------- */
+ /* -------------------------------------------- */
- /**
- * Handle spawning the TraitSelector application for selection various options.
- * @param {Event} event The click event which originated the selection
- * @private
- */
- _onConfigureTraits(event) {
- event.preventDefault();
- const a = event.currentTarget;
-
- const options = {
- name: a.dataset.target,
- title: a.parentElement.innerText,
- choices: [],
- allowCustom: false
- };
-
- switch(a.dataset.options) {
- case 'saves':
- options.choices = CONFIG.SW5E.abilities;
- 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);
- options.choices = Object.fromEntries(Object.entries(CONFIG.SW5E.skills).filter(skill => choiceSet.includes(skill[0])));
- options.maximum = skills.number;
- break;
+ /** @inheritdoc */
+ setPosition(position = {}) {
+ if (!(this._minimized || position.height)) {
+ position.height = this._tabs[0].active === "details" ? "auto" : this.options.height;
+ }
+ return super.setPosition(position);
}
- new TraitSelector(this.item, options).render(true);
- }
- /* -------------------------------------------- */
+ /* -------------------------------------------- */
+ /* Form Submission */
+ /* -------------------------------------------- */
- /** @inheritdoc */
- async _onSubmit(...args) {
- if (this._tabs[0].active === "details") this.position.height = "auto";
- await super._onSubmit(...args);
- }
+ /** @inheritdoc */
+ _getSubmitData(updateData = {}) {
+ // Create the expanded update data object
+ const fd = new FormDataExtended(this.form, {editors: this.editors});
+ let data = fd.toObject();
+ if (updateData) data = mergeObject(data, updateData);
+ else data = expandObject(data);
+
+ // Handle Damage array
+ const damage = data.data?.damage;
+ if (damage) damage.parts = Object.values(damage?.parts || {}).map((d) => [d[0] || "", d[1] || ""]);
+
+ // Return the flattened submission data
+ return flattenObject(data);
+ }
+
+ /* -------------------------------------------- */
+
+ /** @inheritdoc */
+ activateListeners(html) {
+ super.activateListeners(html);
+ if (this.isEditable) {
+ html.find(".damage-control").click(this._onDamageControl.bind(this));
+ html.find(".trait-selector.class-skills").click(this._onConfigureTraits.bind(this));
+ html.find(".effect-control").click((ev) => {
+ if (this.item.isOwned)
+ return ui.notifications.warn(
+ "Managing Active Effects within an Owned Item is not currently supported and will be added in a subsequent update."
+ );
+ onManageActiveEffect(ev, this.item);
+ });
+ }
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Add or remove a damage part from the damage formula
+ * @param {Event} event The original click event
+ * @return {Promise}
+ * @private
+ */
+ async _onDamageControl(event) {
+ event.preventDefault();
+ const a = event.currentTarget;
+
+ // Add new damage component
+ if (a.classList.contains("add-damage")) {
+ await this._onSubmit(event); // Submit any unsaved changes
+ const damage = this.item.data.data.damage;
+ return this.item.update({"data.damage.parts": damage.parts.concat([["", ""]])});
+ }
+
+ // Remove a damage component
+ if (a.classList.contains("delete-damage")) {
+ await this._onSubmit(event); // Submit any unsaved changes
+ const li = a.closest(".damage-part");
+ const damage = foundry.utils.deepClone(this.item.data.data.damage);
+ damage.parts.splice(Number(li.dataset.damagePart), 1);
+ return this.item.update({"data.damage.parts": damage.parts});
+ }
+ }
+
+ /* -------------------------------------------- */
+
+ /**
+ * Handle spawning the TraitSelector application for selection various options.
+ * @param {Event} event The click event which originated the selection
+ * @private
+ */
+ _onConfigureTraits(event) {
+ event.preventDefault();
+ const a = event.currentTarget;
+
+ const options = {
+ name: a.dataset.target,
+ title: a.parentElement.innerText,
+ choices: [],
+ allowCustom: false
+ };
+
+ switch (a.dataset.options) {
+ case "saves":
+ options.choices = CONFIG.SW5E.abilities;
+ 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);
+ options.choices = Object.fromEntries(
+ Object.entries(CONFIG.SW5E.skills).filter((skill) => choiceSet.includes(skill[0]))
+ );
+ options.maximum = skills.number;
+ break;
+ }
+ new TraitSelector(this.item, options).render(true);
+ }
+
+ /* -------------------------------------------- */
+
+ /** @inheritdoc */
+ async _onSubmit(...args) {
+ if (this._tabs[0].active === "details") this.position.height = "auto";
+ await super._onSubmit(...args);
+ }
}
diff --git a/module/macros.js b/module/macros.js
index 96bb3419..e8919864 100644
--- a/module/macros.js
+++ b/module/macros.js
@@ -1,4 +1,3 @@
-
/* -------------------------------------------- */
/* Hotbar Macros */
/* -------------------------------------------- */
@@ -11,24 +10,24 @@
* @returns {Promise}
*/
export async function create5eMacro(data, slot) {
- if ( data.type !== "Item" ) return;
- if (!( "data" in data ) ) return ui.notifications.warn("You can only create macro buttons for owned Items");
- const item = data.data;
+ if (data.type !== "Item") return;
+ if (!("data" in data)) return ui.notifications.warn("You can only create macro buttons for owned Items");
+ const item = data.data;
- // Create the macro command
- const command = `game.sw5e.rollItemMacro("${item.name}");`;
- let macro = game.macros.entities.find(m => (m.name === item.name) && (m.command === command));
- if ( !macro ) {
- macro = await Macro.create({
- name: item.name,
- type: "script",
- img: item.img,
- command: command,
- flags: {"sw5e.itemMacro": true}
- });
- }
- game.user.assignHotbarMacro(macro, slot);
- return false;
+ // Create the macro command
+ const command = `game.sw5e.rollItemMacro("${item.name}");`;
+ let macro = game.macros.entities.find((m) => m.name === item.name && m.command === command);
+ if (!macro) {
+ macro = await Macro.create({
+ name: item.name,
+ type: "script",
+ img: item.img,
+ command: command,
+ flags: {"sw5e.itemMacro": true}
+ });
+ }
+ game.user.assignHotbarMacro(macro, slot);
+ return false;
}
/* -------------------------------------------- */
@@ -40,20 +39,22 @@ export async function create5eMacro(data, slot) {
* @return {Promise}
*/
export function rollItemMacro(itemName) {
- const speaker = ChatMessage.getSpeaker();
- let actor;
- if ( speaker.token ) actor = game.actors.tokens[speaker.token];
- if ( !actor ) actor = game.actors.get(speaker.actor);
+ const speaker = ChatMessage.getSpeaker();
+ let actor;
+ if (speaker.token) actor = game.actors.tokens[speaker.token];
+ if (!actor) actor = game.actors.get(speaker.actor);
- // Get matching items
- const items = actor ? actor.items.filter(i => i.name === itemName) : [];
- if ( items.length > 1 ) {
- ui.notifications.warn(`Your controlled Actor ${actor.name} has more than one Item with name ${itemName}. The first matched item will be chosen.`);
- } else if ( items.length === 0 ) {
- return ui.notifications.warn(`Your controlled Actor does not have an item named ${itemName}`);
- }
- const item = items[0];
+ // Get matching items
+ const items = actor ? actor.items.filter((i) => i.name === itemName) : [];
+ if (items.length > 1) {
+ ui.notifications.warn(
+ `Your controlled Actor ${actor.name} has more than one Item with name ${itemName}. The first matched item will be chosen.`
+ );
+ } else if (items.length === 0) {
+ return ui.notifications.warn(`Your controlled Actor does not have an item named ${itemName}`);
+ }
+ const item = items[0];
- // Trigger the item roll
- return item.roll();
+ // Trigger the item roll
+ return item.roll();
}
diff --git a/module/migration.js b/module/migration.js
index ba772a1b..ab6eb420 100644
--- a/module/migration.js
+++ b/module/migration.js
@@ -2,65 +2,68 @@
* Perform a system migration for the entire World, applying migrations for Actors, Items, and Compendium packs
* @return {Promise} A Promise which resolves once the migration is completed
*/
-export const migrateWorld = async function() {
- ui.notifications.info(`Applying SW5e System Migration for version ${game.system.data.version}. Please be patient and do not close your game or shut down your server.`, {permanent: true});
+export const migrateWorld = async function () {
+ ui.notifications.info(
+ `Applying SW5e System Migration for version ${game.system.data.version}. Please be patient and do not close your game or shut down your server.`,
+ {permanent: true}
+ );
- // Migrate World Actors
- for await ( let a of game.actors.contents ) {
- try {
- console.log(`Checking Actor entity ${a.name} for migration needs`);
- const updateData = await migrateActorData(a.data);
- if ( !foundry.utils.isObjectEmpty(updateData) ) {
- console.log(`Migrating Actor entity ${a.name}`);
- await a.update(updateData, {enforceTypes: false});
- }
- } catch(err) {
- err.message = `Failed sw5e system migration for Actor ${a.name}: ${err.message}`;
- console.error(err);
+ // Migrate World Actors
+ for await (let a of game.actors.contents) {
+ try {
+ console.log(`Checking Actor entity ${a.name} for migration needs`);
+ const updateData = await migrateActorData(a.data);
+ if (!foundry.utils.isObjectEmpty(updateData)) {
+ console.log(`Migrating Actor entity ${a.name}`);
+ await a.update(updateData, {enforceTypes: false});
+ }
+ } catch (err) {
+ err.message = `Failed sw5e system migration for Actor ${a.name}: ${err.message}`;
+ console.error(err);
+ }
}
- }
- // Migrate World Items
- for ( let i of game.items.contents ) {
- try {
- const updateData = migrateItemData(i.toObject());
- if ( !foundry.utils.isObjectEmpty(updateData) ) {
- console.log(`Migrating Item entity ${i.name}`);
- await i.update(updateData, {enforceTypes: false});
- }
- } catch(err) {
- err.message = `Failed sw5e system migration for Item ${i.name}: ${err.message}`;
- console.error(err);
+ // Migrate World Items
+ for (let i of game.items.contents) {
+ try {
+ const updateData = migrateItemData(i.toObject());
+ if (!foundry.utils.isObjectEmpty(updateData)) {
+ console.log(`Migrating Item entity ${i.name}`);
+ await i.update(updateData, {enforceTypes: false});
+ }
+ } catch (err) {
+ err.message = `Failed sw5e system migration for Item ${i.name}: ${err.message}`;
+ console.error(err);
+ }
}
- }
- // Migrate Actor Override Tokens
- for ( let s of game.scenes.contents ) {
- try {
- const updateData = await migrateSceneData(s.data);
- if ( !foundry.utils.isObjectEmpty(updateData) ) {
- console.log(`Migrating Scene entity ${s.name}`);
- 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);
- }
- } catch(err) {
- err.message = `Failed sw5e system migration for Scene ${s.name}: ${err.message}`;
- console.error(err);
+ // Migrate Actor Override Tokens
+ for (let s of game.scenes.contents) {
+ try {
+ const updateData = await migrateSceneData(s.data);
+ if (!foundry.utils.isObjectEmpty(updateData)) {
+ console.log(`Migrating Scene entity ${s.name}`);
+ 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));
+ }
+ } catch (err) {
+ err.message = `Failed sw5e system migration for Scene ${s.name}: ${err.message}`;
+ console.error(err);
+ }
}
- }
- // Migrate World Compendium Packs
- for ( let p of game.packs ) {
- if ( p.metadata.package !== "world" ) continue;
- if ( !["Actor", "Item", "Scene"].includes(p.metadata.entity) ) continue;
- await migrateCompendium(p);
- }
+ // Migrate World Compendium Packs
+ for (let p of game.packs) {
+ if (p.metadata.package !== "world") continue;
+ if (!["Actor", "Item", "Scene"].includes(p.metadata.entity)) continue;
+ await migrateCompendium(p);
+ }
- // Set the migration as complete
- game.settings.set("sw5e", "systemMigrationVersion", game.system.data.version);
- ui.notifications.info(`SW5e System Migration to version ${game.system.data.version} completed!`, {permanent: true});
+ // Set the migration as complete
+ game.settings.set("sw5e", "systemMigrationVersion", game.system.data.version);
+ ui.notifications.info(`SW5e System Migration to version ${game.system.data.version} completed!`, {permanent: true});
};
/* -------------------------------------------- */
@@ -70,50 +73,48 @@ export const migrateWorld = async function() {
* @param pack
* @return {Promise}
*/
-export const migrateCompendium = async function(pack) {
- const entity = pack.metadata.entity;
- if ( !["Actor", "Item", "Scene"].includes(entity) ) return;
+export const migrateCompendium = async function (pack) {
+ const entity = pack.metadata.entity;
+ if (!["Actor", "Item", "Scene"].includes(entity)) return;
- // Unlock the pack for editing
- const wasLocked = pack.locked;
- await pack.configure({locked: false});
+ // Unlock the pack for editing
+ const wasLocked = pack.locked;
+ await pack.configure({locked: false});
- // Begin by requesting server-side data model migration and get the migrated content
- await pack.migrate();
- const documents = await pack.getDocuments();
+ // Begin by requesting server-side data model migration and get the migrated content
+ await pack.migrate();
+ const documents = await pack.getDocuments();
- // Iterate over compendium entries - applying fine-tuned migration functions
- for await ( let doc of documents ) {
- let updateData = {};
- try {
- switch (entity) {
- case "Actor":
- updateData = await migrateActorData(doc.data);
- break;
- case "Item":
- updateData = migrateItemData(doc.toObject());
- break;
- case "Scene":
- updateData = await migrateSceneData(doc.data);
- break;
- }
- if ( foundry.utils.isObjectEmpty(updateData) ) continue;
+ // Iterate over compendium entries - applying fine-tuned migration functions
+ for await (let doc of documents) {
+ let updateData = {};
+ try {
+ switch (entity) {
+ case "Actor":
+ updateData = await migrateActorData(doc.data);
+ break;
+ case "Item":
+ updateData = migrateItemData(doc.toObject());
+ break;
+ case "Scene":
+ updateData = await migrateSceneData(doc.data);
+ break;
+ }
+ if (foundry.utils.isObjectEmpty(updateData)) continue;
- // Save the entry, if data was changed
- await doc.update(updateData);
- console.log(`Migrated ${entity} entity ${doc.name} in Compendium ${pack.collection}`);
+ // Save the entry, if data was changed
+ await doc.update(updateData);
+ console.log(`Migrated ${entity} entity ${doc.name} in Compendium ${pack.collection}`);
+ } catch (err) {
+ // Handle migration failures
+ err.message = `Failed sw5e system migration for entity ${doc.name} in pack ${pack.collection}: ${err.message}`;
+ console.error(err);
+ }
}
- // Handle migration failures
- catch(err) {
- err.message = `Failed sw5e system migration for entity ${doc.name} in pack ${pack.collection}: ${err.message}`;
- console.error(err);
- }
- }
-
- // Apply the original locked status for the pack
- await pack.configure({locked: wasLocked});
- console.log(`Migrated all ${entity} entities from Compendium ${pack.collection}`);
+ // Apply the original locked status for the pack
+ await pack.configure({locked: wasLocked});
+ console.log(`Migrated all ${entity} entities from Compendium ${pack.collection}`);
};
/* -------------------------------------------- */
@@ -126,95 +127,95 @@ export const migrateCompendium = async function(pack) {
* @param {object} actor The actor data object to update
* @return {Object} The updateData to apply
*/
-export const migrateActorData = async function(actor) {
- const updateData = {};
+export const migrateActorData = async function (actor) {
+ const updateData = {};
- // Actor Data Updates
- if(actor.data) {
- _migrateActorMovement(actor, updateData);
- _migrateActorSenses(actor, updateData);
- _migrateActorType(actor, updateData);
- }
+ // Actor Data Updates
+ if (actor.data) {
+ _migrateActorMovement(actor, updateData);
+ _migrateActorSenses(actor, updateData);
+ _migrateActorType(actor, updateData);
+ }
- // Migrate Owned Items
- if ( !!actor.items ) {
- const items = await actor.items.reduce(async (memo, i) => {
- const results = await memo;
+ // Migrate Owned Items
+ if (!!actor.items) {
+ const items = await actor.items.reduce(async (memo, i) => {
+ const results = await memo;
- // Migrate the Owned Item
- const itemData = i instanceof CONFIG.Item.documentClass ? i.toObject() : i
- let itemUpdate = await migrateActorItemData(itemData, actor);
+ // Migrate the Owned Item
+ const itemData = i instanceof CONFIG.Item.documentClass ? i.toObject() : i;
+ let itemUpdate = await migrateActorItemData(itemData, actor);
- // Prepared, Equipped, and Proficient for NPC actors
- if ( actor.type === "npc" ) {
- if (getProperty(itemData.data, "preparation.prepared") === false) itemUpdate["data.preparation.prepared"] = true;
- if (getProperty(itemData.data, "equipped") === false) itemUpdate["data.equipped"] = true;
- if (getProperty(itemData.data, "proficient") === false) itemUpdate["data.proficient"] = true;
- }
+ // Prepared, Equipped, and Proficient for NPC actors
+ if (actor.type === "npc") {
+ if (getProperty(itemData.data, "preparation.prepared") === false)
+ itemUpdate["data.preparation.prepared"] = true;
+ if (getProperty(itemData.data, "equipped") === false) itemUpdate["data.equipped"] = true;
+ if (getProperty(itemData.data, "proficient") === false) itemUpdate["data.proficient"] = true;
+ }
- // Update the Owned Item
- if ( !isObjectEmpty(itemUpdate) ) {
- itemUpdate._id = itemData.id;
- console.log(`Migrating Actor ${actor.name}'s ${i.name}`);
- results.push(expandObject(itemUpdate));
- }
+ // Update the Owned Item
+ if (!isObjectEmpty(itemUpdate)) {
+ itemUpdate._id = itemData._id;
+ console.log(`Migrating Actor ${actor.name}'s ${i.name}`);
+ results.push(expandObject(itemUpdate));
+ }
- return results;
- }, []);
+ return results;
+ }, []);
- if ( items.length > 0 ) updateData.items = items;
- }
+ if (items.length > 0) updateData.items = items;
+ }
- // Update NPC data with new datamodel information
- if (actor.type === "npc") {
- _updateNPCData(actor);
- }
+ // Update NPC data with new datamodel information
+ if (actor.type === "npc") {
+ _updateNPCData(actor);
+ }
- // migrate powers last since it relies on item classes being migrated first.
- _migrateActorPowers(actor, updateData);
-
- return updateData;
+ // migrate powers last since it relies on item classes being migrated first.
+ _migrateActorPowers(actor, updateData);
+
+ return updateData;
};
/* -------------------------------------------- */
-
/**
* Scrub an Actor's system data, removing all keys which are not explicitly defined in the system template
* @param {Object} actorData The data object for an Actor
* @return {Object} The scrubbed Actor data
*/
function cleanActorData(actorData) {
+ // Scrub system data
+ const model = game.system.model.Actor[actorData.type];
+ actorData.data = filterObject(actorData.data, model);
- // Scrub system data
- const model = game.system.model.Actor[actorData.type];
- actorData.data = filterObject(actorData.data, model);
+ // Scrub system flags
+ const allowedFlags = CONFIG.SW5E.allowedActorFlags.reduce((obj, f) => {
+ obj[f] = null;
+ return obj;
+ }, {});
+ if (actorData.flags.sw5e) {
+ actorData.flags.sw5e = filterObject(actorData.flags.sw5e, allowedFlags);
+ }
- // Scrub system flags
- const allowedFlags = CONFIG.SW5E.allowedActorFlags.reduce((obj, f) => {
- obj[f] = null;
- return obj;
- }, {});
- if ( actorData.flags.sw5e ) {
- actorData.flags.sw5e = filterObject(actorData.flags.sw5e, allowedFlags);
- }
-
- // Return the scrubbed data
- return actorData;
+ // Return the scrubbed data
+ return actorData;
}
-
/* -------------------------------------------- */
/**
* Migrate a single Item entity to incorporate latest data model changes
- * @param item
+ *
+ * @param {object} item Item data to migrate
+ * @return {object} The updateData to apply
*/
-export const migrateItemData = function(item) {
- const updateData = {};
- _migrateItemClassPowerCasting(item, updateData);
- _migrateItemAttunement(item, updateData);
- return updateData;
+export const migrateItemData = function (item) {
+ const updateData = {};
+ _migrateItemClassPowerCasting(item, updateData);
+ _migrateItemAttunement(item, updateData);
+ return updateData;
};
/* -------------------------------------------- */
@@ -224,12 +225,12 @@ export const migrateItemData = function(item) {
* @param item
* @param actor
*/
-export const migrateActorItemData = async function(item, actor) {
- const updateData = {};
- _migrateItemClassPowerCasting(item, updateData);
- _migrateItemAttunement(item, updateData);
- await _migrateItemPower(item, actor, updateData);
- return updateData;
+export const migrateActorItemData = async function (item, actor) {
+ const updateData = {};
+ _migrateItemClassPowerCasting(item, updateData);
+ _migrateItemAttunement(item, updateData);
+ await _migrateItemPower(item, actor, updateData);
+ return updateData;
};
/* -------------------------------------------- */
@@ -240,33 +241,34 @@ export const migrateActorItemData = async function(item, actor) {
* @param {Object} scene The Scene data to Update
* @return {Object} The updateData to apply
*/
- export const migrateSceneData = async function(scene) {
- const tokens = await Promise.all(scene.tokens.map(async token => {
- const t = token.toJSON();
- if (!t.actorId || t.actorLink) {
- t.actorData = {};
- }
- else if (!game.actors.has(t.actorId)) {
- t.actorId = null;
- t.actorData = {};
- } else if ( !t.actorLink ) {
- const actorData = duplicate(t.actorData);
- actorData.type = token.actor?.type;
- const update = migrateActorData(actorData);
- ['items', 'effects'].forEach(embeddedName => {
- if (!update[embeddedName]?.length) return;
- const updates = new Map(update[embeddedName].map(u => [u._id, u]));
- t.actorData[embeddedName].forEach(original => {
- const update = updates.get(original._id);
- if (update) mergeObject(original, update);
- });
- delete update[embeddedName];
- });
+export const migrateSceneData = async function (scene) {
+ const tokens = await Promise.all(
+ scene.tokens.map(async (token) => {
+ const t = token.toJSON();
+ if (!t.actorId || t.actorLink) {
+ t.actorData = {};
+ } else if (!game.actors.has(t.actorId)) {
+ t.actorId = null;
+ t.actorData = {};
+ } else if (!t.actorLink) {
+ const actorData = duplicate(t.actorData);
+ actorData.type = token.actor?.type;
+ const update = migrateActorData(actorData);
+ ["items", "effects"].forEach((embeddedName) => {
+ if (!update[embeddedName]?.length) return;
+ const updates = new Map(update[embeddedName].map((u) => [u._id, u]));
+ t.actorData[embeddedName].forEach((original) => {
+ const update = updates.get(original._id);
+ if (update) mergeObject(original, update);
+ });
+ delete update[embeddedName];
+ });
- mergeObject(t.actorData, update);
- }
- return t;
- }));
+ mergeObject(t.actorData, update);
+ }
+ return t;
+ })
+ );
return {tokens};
};
@@ -282,87 +284,93 @@ export const migrateActorItemData = async function(item, actor) {
* @return {Object} The updated Actor
*/
function _updateNPCData(actor) {
+ let actorData = actor.data;
+ const updateData = {};
+ // check for flag.core, if not there is no compendium monster so exit
+ const hasSource = actor?.flags?.core?.sourceId !== undefined;
+ if (!hasSource) return actor;
+ // shortcut out if dataVersion flag is set to 1.2.4 or higher
+ const hasDataVersion = actor?.flags?.sw5e?.dataVersion !== undefined;
+ if (
+ hasDataVersion &&
+ (actor.flags.sw5e.dataVersion === "1.2.4" || isNewerVersion("1.2.4", actor.flags.sw5e.dataVersion))
+ )
+ return actor;
+ // Check to see what the source of NPC is
+ const sourceId = actor.flags.core.sourceId;
+ const coreSource = sourceId.substr(0, sourceId.length - 17);
+ const core_id = sourceId.substr(sourceId.length - 16, 16);
+ if (coreSource === "Compendium.sw5e.monsters") {
+ game.packs
+ .get("sw5e.monsters")
+ .getEntity(core_id)
+ .then((monster) => {
+ const monsterData = monster.data.data;
+ // copy movement[], senses[], powercasting, force[], tech[], powerForceLevel, powerTechLevel
+ updateData["data.attributes.movement"] = monsterData.attributes.movement;
+ updateData["data.attributes.senses"] = monsterData.attributes.senses;
+ updateData["data.attributes.powercasting"] = monsterData.attributes.powercasting;
+ updateData["data.attributes.force"] = monsterData.attributes.force;
+ updateData["data.attributes.tech"] = monsterData.attributes.tech;
+ updateData["data.details.powerForceLevel"] = monsterData.details.powerForceLevel;
+ updateData["data.details.powerTechLevel"] = monsterData.details.powerTechLevel;
+ // push missing powers onto actor
+ let newPowers = [];
+ for (let i of monster.items) {
+ const itemData = i.data;
+ if (itemData.type === "power") {
+ const itemCompendium_id = itemData.flags?.core?.sourceId.split(".").slice(-1)[0];
+ let hasPower = !!actor.items.find(
+ (item) => item.flags?.core?.sourceId.split(".").slice(-1)[0] === itemCompendium_id
+ );
+ if (!hasPower) {
+ // Clone power to new object. Don't know if it is technically needed, but seems to prevent some weirdness.
+ const newPower = JSON.parse(JSON.stringify(itemData));
- let actorData = actor.data;
- const updateData = {};
- // check for flag.core, if not there is no compendium monster so exit
- const hasSource = actor?.flags?.core?.sourceId !== undefined;
- if (!hasSource) return actor;
- // shortcut out if dataVersion flag is set to 1.2.4 or higher
- const hasDataVersion = actor?.flags?.sw5e?.dataVersion !== undefined;
- if (hasDataVersion && (actor.flags.sw5e.dataVersion === "1.2.4" || isNewerVersion("1.2.4", actor.flags.sw5e.dataVersion))) return actor;
- // Check to see what the source of NPC is
- const sourceId = actor.flags.core.sourceId;
- const coreSource = sourceId.substr(0,sourceId.length-17);
- const core_id = sourceId.substr(sourceId.length-16,16);
- if (coreSource === "Compendium.sw5e.monsters"){
- game.packs.get("sw5e.monsters").getEntity(core_id).then(monster => {
- const monsterData = monster.data.data;
- // copy movement[], senses[], powercasting, force[], tech[], powerForceLevel, powerTechLevel
- updateData["data.attributes.movement"] = monsterData.attributes.movement;
- updateData["data.attributes.senses"] = monsterData.attributes.senses;
- updateData["data.attributes.powercasting"] = monsterData.attributes.powercasting;
- updateData["data.attributes.force"] = monsterData.attributes.force;
- updateData["data.attributes.tech"] = monsterData.attributes.tech;
- updateData["data.details.powerForceLevel"] = monsterData.details.powerForceLevel;
- updateData["data.details.powerTechLevel"] = monsterData.details.powerTechLevel;
- // push missing powers onto actor
- let newPowers = [];
- for ( let i of monster.items ) {
- const itemData = i.data;
- if ( itemData.type === "power" ) {
- const itemCompendium_id = itemData.flags?.core?.sourceId.split(".").slice(-1)[0];
- let hasPower = !!actor.items.find(item => item.flags?.core?.sourceId.split(".").slice(-1)[0] === itemCompendium_id);
- if (!hasPower) {
- // Clone power to new object. Don't know if it is technically needed, but seems to prevent some weirdness.
- const newPower = JSON.parse(JSON.stringify(itemData));
+ newPowers.push(newPower);
+ }
+ }
+ }
- newPowers.push(newPower);
- }
- }
- }
+ // get actor to create new powers
+ const liveActor = game.actors.get(actor._id);
+ // create the powers on the actor
+ liveActor.createEmbeddedEntity("OwnedItem", newPowers);
- // get actor to create new powers
- const liveActor = game.actors.get(actor._id);
- // create the powers on the actor
- liveActor.createEmbeddedEntity("OwnedItem", newPowers);
+ // set flag to check to see if migration has been done so we don't do it again.
+ liveActor.setFlag("sw5e", "dataVersion", "1.2.4");
+ });
+ }
- // set flag to check to see if migration has been done so we don't do it again.
- liveActor.setFlag("sw5e", "dataVersion", "1.2.4");
- })
- }
-
-
- //merge object
- actorData = mergeObject(actorData, updateData);
- // Return the scrubbed data
- return actor;
+ //merge object
+ actorData = mergeObject(actorData, updateData);
+ // Return the scrubbed data
+ return actor;
}
-
/**
* Migrate the actor speed string to movement object
* @private
*/
function _migrateActorMovement(actorData, updateData) {
- const ad = actorData.data;
+ const ad = actorData.data;
- // Work is needed if old data is present
- const old = actorData.type === 'vehicle' ? ad?.attributes?.speed : ad?.attributes?.speed?.value;
- const hasOld = old !== undefined;
- if ( hasOld ) {
+ // Work is needed if old data is present
+ const old = actorData.type === "vehicle" ? ad?.attributes?.speed : ad?.attributes?.speed?.value;
+ const hasOld = old !== undefined;
+ if (hasOld) {
+ // If new data is not present, migrate the old data
+ const hasNew = ad?.attributes?.movement?.walk !== undefined;
+ if (!hasNew && typeof old === "string") {
+ const s = (old || "").split(" ");
+ if (s.length > 0)
+ updateData["data.attributes.movement.walk"] = Number.isNumeric(s[0]) ? parseInt(s[0]) : null;
+ }
- // If new data is not present, migrate the old data
- const hasNew = ad?.attributes?.movement?.walk !== undefined;
- if ( !hasNew && (typeof old === "string") ) {
- const s = (old || "").split(" ");
- if ( s.length > 0 ) updateData["data.attributes.movement.walk"] = Number.isNumeric(s[0]) ? parseInt(s[0]) : null;
+ // Remove the old attribute
+ updateData["data.attributes.-=speed"] = null;
}
-
- // Remove the old attribute
- updateData["data.attributes.-=speed"] = null;
- }
- return updateData
+ return updateData;
}
/* -------------------------------------------- */
@@ -372,58 +380,58 @@ function _migrateActorMovement(actorData, updateData) {
* @private
*/
function _migrateActorPowers(actorData, updateData) {
- const ad = actorData.data;
+ const ad = actorData.data;
- // If new Force & Tech data is not present, create it
- let hasNewAttrib = ad?.attributes?.force?.level !== undefined;
- if ( !hasNewAttrib ) {
- updateData["data.attributes.force.known.value"] = 0;
- updateData["data.attributes.force.known.max"] = 0;
- updateData["data.attributes.force.points.value"] = 0;
- updateData["data.attributes.force.points.min"] = 0;
- updateData["data.attributes.force.points.max"] = 0;
- updateData["data.attributes.force.points.temp"] = null;
- updateData["data.attributes.force.points.tempmax"] = null;
- updateData["data.attributes.force.level"] = 0;
- updateData["data.attributes.tech.known.value"] = 0;
- updateData["data.attributes.tech.known.max"] = 0;
- updateData["data.attributes.tech.points.value"] = 0;
- updateData["data.attributes.tech.points.min"] = 0;
- updateData["data.attributes.tech.points.max"] = 0;
- updateData["data.attributes.tech.points.temp"] = null;
- updateData["data.attributes.tech.points.tempmax"] = null;
- updateData["data.attributes.tech.level"] = 0;
- }
-
- // If new Power F/T split data is not present, create it
- const hasNewLimit = ad?.powers?.power1?.foverride !== undefined;
- if ( !hasNewLimit ) {
- for (let i = 1; i <= 9; i++) {
- // add new
- updateData["data.powers.power" + i + ".fvalue"] = getProperty(ad.powers,"power" + i + ".value");
- updateData["data.powers.power" + i + ".fmax"] = getProperty(ad.powers,"power" + i + ".max");
- updateData["data.powers.power" + i + ".foverride"] = null;
- updateData["data.powers.power" + i + ".tvalue"] = getProperty(ad.powers,"power" + i + ".value");
- updateData["data.powers.power" + i + ".tmax"] = getProperty(ad.powers,"power" + i + ".max");
- updateData["data.powers.power" + i + ".toverride"] = null;
- //remove old
- updateData["data.powers.power" + i + ".-=value"] = null;
- updateData["data.powers.power" + i + ".-=override"] = null;
+ // If new Force & Tech data is not present, create it
+ let hasNewAttrib = ad?.attributes?.force?.level !== undefined;
+ if (!hasNewAttrib) {
+ updateData["data.attributes.force.known.value"] = 0;
+ updateData["data.attributes.force.known.max"] = 0;
+ updateData["data.attributes.force.points.value"] = 0;
+ updateData["data.attributes.force.points.min"] = 0;
+ updateData["data.attributes.force.points.max"] = 0;
+ updateData["data.attributes.force.points.temp"] = null;
+ updateData["data.attributes.force.points.tempmax"] = null;
+ updateData["data.attributes.force.level"] = 0;
+ updateData["data.attributes.tech.known.value"] = 0;
+ updateData["data.attributes.tech.known.max"] = 0;
+ updateData["data.attributes.tech.points.value"] = 0;
+ updateData["data.attributes.tech.points.min"] = 0;
+ updateData["data.attributes.tech.points.max"] = 0;
+ updateData["data.attributes.tech.points.temp"] = null;
+ updateData["data.attributes.tech.points.tempmax"] = null;
+ updateData["data.attributes.tech.level"] = 0;
}
- }
- // If new Bonus Power DC data is not present, create it
- const hasNewBonus = ad?.bonuses?.power?.forceLightDC !== undefined;
- if ( !hasNewBonus ) {
- updateData["data.bonuses.power.forceLightDC"] = "";
- updateData["data.bonuses.power.forceDarkDC"] = "";
- updateData["data.bonuses.power.forceUnivDC"] = "";
- updateData["data.bonuses.power.techDC"] = "";
- }
- // Remove the Power DC Bonus
- updateData["data.bonuses.power.-=dc"] = null;
+ // If new Power F/T split data is not present, create it
+ const hasNewLimit = ad?.powers?.power1?.foverride !== undefined;
+ if (!hasNewLimit) {
+ for (let i = 1; i <= 9; i++) {
+ // add new
+ updateData["data.powers.power" + i + ".fvalue"] = getProperty(ad.powers, "power" + i + ".value");
+ updateData["data.powers.power" + i + ".fmax"] = getProperty(ad.powers, "power" + i + ".max");
+ updateData["data.powers.power" + i + ".foverride"] = null;
+ updateData["data.powers.power" + i + ".tvalue"] = getProperty(ad.powers, "power" + i + ".value");
+ updateData["data.powers.power" + i + ".tmax"] = getProperty(ad.powers, "power" + i + ".max");
+ updateData["data.powers.power" + i + ".toverride"] = null;
+ //remove old
+ updateData["data.powers.power" + i + ".-=value"] = null;
+ updateData["data.powers.power" + i + ".-=override"] = null;
+ }
+ }
+ // If new Bonus Power DC data is not present, create it
+ const hasNewBonus = ad?.bonuses?.power?.forceLightDC !== undefined;
+ if (!hasNewBonus) {
+ updateData["data.bonuses.power.forceLightDC"] = "";
+ updateData["data.bonuses.power.forceDarkDC"] = "";
+ updateData["data.bonuses.power.forceUnivDC"] = "";
+ updateData["data.bonuses.power.techDC"] = "";
+ }
- return updateData
+ // Remove the Power DC Bonus
+ updateData["data.bonuses.power.-=dc"] = null;
+
+ return updateData;
}
/* -------------------------------------------- */
@@ -433,112 +441,115 @@ function _migrateActorPowers(actorData, updateData) {
* @private
*/
function _migrateActorSenses(actor, updateData) {
- const ad = actor.data;
- if ( ad?.traits?.senses === undefined ) return;
- const original = ad.traits.senses || "";
- if ( typeof original !== "string" ) return;
+ const ad = actor.data;
+ if (ad?.traits?.senses === undefined) return;
+ const original = ad.traits.senses || "";
+ if (typeof original !== "string") return;
- // Try to match old senses with the format like "Darkvision 60 ft, Blindsight 30 ft"
- const pattern = /([A-z]+)\s?([0-9]+)\s?([A-z]+)?/;
- let wasMatched = false;
+ // Try to match old senses with the format like "Darkvision 60 ft, Blindsight 30 ft"
+ const pattern = /([A-z]+)\s?([0-9]+)\s?([A-z]+)?/;
+ let wasMatched = false;
- // Match each comma-separated term
- for ( let s of original.split(",") ) {
- s = s.trim();
- const match = s.match(pattern);
- if ( !match ) continue;
- const type = match[1].toLowerCase();
- if ( type in CONFIG.SW5E.senses ) {
- updateData[`data.attributes.senses.${type}`] = Number(match[2]).toNearest(0.5);
- wasMatched = true;
+ // Match each comma-separated term
+ for (let s of original.split(",")) {
+ s = s.trim();
+ const match = s.match(pattern);
+ if (!match) continue;
+ const type = match[1].toLowerCase();
+ if (type in CONFIG.SW5E.senses) {
+ updateData[`data.attributes.senses.${type}`] = Number(match[2]).toNearest(0.5);
+ wasMatched = true;
+ }
}
- }
- // If nothing was matched, but there was an old string - put the whole thing in "special"
- if ( !wasMatched && !!original ) {
- updateData["data.attributes.senses.special"] = original;
- }
+ // If nothing was matched, but there was an old string - put the whole thing in "special"
+ if (!wasMatched && !!original) {
+ updateData["data.attributes.senses.special"] = original;
+ }
- // Remove the old traits.senses string once the migration is complete
- updateData["data.traits.-=senses"] = null;
- return updateData;
+ // Remove the old traits.senses string once the migration is complete
+ updateData["data.traits.-=senses"] = null;
+ return updateData;
}
+/* -------------------------------------------- */
+
/**
* Migrate the actor details.type string to object
* @private
*/
function _migrateActorType(actor, updateData) {
- const ad = actor.data;
- const original = ad.details?.type;
- if ( typeof original !== "string" ) return;
+ const ad = actor.data;
+ const original = ad.details?.type;
+ if (typeof original !== "string") return;
- // New default data structure
- let data = {
- "value": "",
- "subtype": "",
- "swarm": "",
- "custom": ""
- }
+ // New default data structure
+ let data = {
+ value: "",
+ subtype: "",
+ swarm: "",
+ custom: ""
+ };
- // Specifics
- // (Some of these have weird names, these need to be addressed individually)
- if (original === "force entity") {
- data.value = "force";
- data.subtype = "storm";
- } else if (original === "human") {
- data.value = "humanoid";
- data.subtype = "human";
- } else if (["humanoid (any)", "humanoid (Villainous"].includes(original)) {
- data.value = "humanoid";
- } else if (original === "tree") {
- data.value = "plant";
- data.subtype = "tree";
- } else if (original === "(humanoid) or Large (beast) force entity") {
- data.value = "force";
- } else if (original === "droid (appears human)") {
- data.value = "droid";
- } else {
- // Match the existing string
- const pattern = /^(?:swarm of (?[\w\-]+) )?(?[^(]+?)(?:\((?[^)]+)\))?$/i;
- const match = original.trim().match(pattern);
- if (match) {
+ // Specifics
+ // (Some of these have weird names, these need to be addressed individually)
+ if (original === "force entity") {
+ data.value = "force";
+ data.subtype = "storm";
+ } else if (original === "human") {
+ data.value = "humanoid";
+ data.subtype = "human";
+ } else if (["humanoid (any)", "humanoid (Villainous"].includes(original)) {
+ data.value = "humanoid";
+ } else if (original === "tree") {
+ data.value = "plant";
+ data.subtype = "tree";
+ } else if (original === "(humanoid) or Large (beast) force entity") {
+ data.value = "force";
+ } else if (original === "droid (appears human)") {
+ data.value = "droid";
+ } else {
+ // Match the existing string
+ const pattern = /^(?:swarm of (?[\w\-]+) )?(?[^(]+?)(?:\((?[^)]+)\))?$/i;
+ const match = original.trim().match(pattern);
+ if (match) {
+ // Match a known creature type
+ const typeLc = match.groups.type.trim().toLowerCase();
+ const typeMatch = Object.entries(CONFIG.SW5E.creatureTypes).find(([k, v]) => {
+ return (
+ typeLc === k ||
+ typeLc === game.i18n.localize(v).toLowerCase() ||
+ typeLc === game.i18n.localize(`${v}Pl`).toLowerCase()
+ );
+ });
+ if (typeMatch) data.value = typeMatch[0];
+ else {
+ data.value = "custom";
+ data.custom = match.groups.type.trim().titleCase();
+ }
+ data.subtype = match.groups.subtype?.trim().titleCase() || "";
- // Match a known creature type
- const typeLc = match.groups.type.trim().toLowerCase();
- const typeMatch = Object.entries(CONFIG.SW5E.creatureTypes).find(([k, v]) => {
- return (typeLc === k) ||
- (typeLc === game.i18n.localize(v).toLowerCase()) ||
- (typeLc === game.i18n.localize(`${v}Pl`).toLowerCase());
- });
- if (typeMatch) data.value = typeMatch[0];
- else {
- data.value = "custom";
- data.custom = match.groups.type.trim().titleCase();
- }
- data.subtype = match.groups.subtype?.trim().titleCase() || "";
+ // Match a swarm
+ const isNamedSwarm = actor.name.startsWith(game.i18n.localize("SW5E.CreatureSwarm"));
+ if (match.groups.size || isNamedSwarm) {
+ const sizeLc = match.groups.size ? match.groups.size.trim().toLowerCase() : "tiny";
+ const sizeMatch = Object.entries(CONFIG.SW5E.actorSizes).find(([k, v]) => {
+ return sizeLc === k || sizeLc === game.i18n.localize(v).toLowerCase();
+ });
+ data.swarm = sizeMatch ? sizeMatch[0] : "tiny";
+ } else data.swarm = "";
+ }
- // Match a swarm
- const isNamedSwarm = actor.name.startsWith(game.i18n.localize("SW5E.CreatureSwarm"));
- if (match.groups.size || isNamedSwarm) {
- const sizeLc = match.groups.size ? match.groups.size.trim().toLowerCase() : "tiny";
- const sizeMatch = Object.entries(CONFIG.SW5E.actorSizes).find(([k, v]) => {
- return (sizeLc === k) || (sizeLc === game.i18n.localize(v).toLowerCase());
- });
- data.swarm = sizeMatch ? sizeMatch[0] : "tiny";
- } else data.swarm = "";
+ // No match found
+ else {
+ data.value = "custom";
+ data.custom = original;
+ }
}
- // No match found
- else {
- data.value = "custom";
- data.custom = original;
- }
- }
-
- // Update the actor data
- updateData["data.details.type"] = data;
- return updateData;
+ // Update the actor data
+ updateData["data.details.type"] = data;
+ return updateData;
}
/* -------------------------------------------- */
@@ -547,42 +558,41 @@ function _migrateActorType(actor, updateData) {
* @private
*/
function _migrateItemClassPowerCasting(item, updateData) {
- if (item.type === "class"){
- switch (item.name){
- case "Consular":
- updateData["data.powercasting"] = {
- progression: "consular",
- ability: ""
- };
- break;
- case "Engineer":
-
- updateData["data.powercasting"] = {
- progression: "engineer",
- ability: ""
- };
- break;
- case "Guardian":
- updateData["data.powercasting"] = {
- progression: "guardian",
- ability: ""
- };
- break;
- case "Scout":
- updateData["data.powercasting"] = {
- progression: "scout",
- ability: ""
- };
- break;
- case "Sentinel":
- updateData["data.powercasting"] = {
- progression: "sentinel",
- ability: ""
- };
- break;
+ if (item.type === "class") {
+ switch (item.name) {
+ case "Consular":
+ updateData["data.powercasting"] = {
+ progression: "consular",
+ ability: ""
+ };
+ break;
+ case "Engineer":
+ updateData["data.powercasting"] = {
+ progression: "engineer",
+ ability: ""
+ };
+ break;
+ case "Guardian":
+ updateData["data.powercasting"] = {
+ progression: "guardian",
+ ability: ""
+ };
+ break;
+ case "Scout":
+ updateData["data.powercasting"] = {
+ progression: "scout",
+ ability: ""
+ };
+ break;
+ case "Sentinel":
+ updateData["data.powercasting"] = {
+ progression: "sentinel",
+ ability: ""
+ };
+ break;
+ }
}
- }
- return updateData;
+ return updateData;
}
/* -------------------------------------------- */
@@ -594,42 +604,45 @@ function _migrateItemClassPowerCasting(item, updateData) {
* @private
*/
async function _migrateItemPower(item, actor, updateData) {
- // if item is not a power shortcut out
- if (item.type !== "power") return updateData;
+ // if item is not a power shortcut out
+ if (item.type !== "power") return updateData;
- console.log(`Checking Actor ${actor.name}'s ${item.name} for migration needs`);
- // check for flag.core, if not there is no compendium power so exit
- const hasSource = item?.flags?.core?.sourceId !== undefined;
- if (!hasSource) return updateData;
+ console.log(`Checking Actor ${actor.name}'s ${item.name} for migration needs`);
+ // check for flag.core, if not there is no compendium power so exit
+ const hasSource = item?.flags?.core?.sourceId !== undefined;
+ if (!hasSource) return updateData;
- // shortcut out if dataVersion flag is set to 1.2.4 or higher
- const hasDataVersion = item?.flags?.sw5e?.dataVersion !== undefined;
- if (hasDataVersion && (item.flags.sw5e.dataVersion === "1.2.4" || isNewerVersion("1.2.4", item.flags.sw5e.dataVersion))) return updateData;
-
- // Check to see what the source of Power is
- const sourceId = item.flags.core.sourceId;
- const coreSource = sourceId.substr(0, sourceId.length - 17);
- const core_id = sourceId.substr(sourceId.length - 16, 16);
-
- //if power type is not force or tech exit out
- let powerType = "none";
- if (coreSource === "Compendium.sw5e.forcepowers") powerType = "sw5e.forcepowers";
- if (coreSource === "Compendium.sw5e.techpowers") powerType = "sw5e.techpowers";
- if (powerType === "none") return updateData;
+ // shortcut out if dataVersion flag is set to 1.2.4 or higher
+ const hasDataVersion = item?.flags?.sw5e?.dataVersion !== undefined;
+ if (
+ hasDataVersion &&
+ (item.flags.sw5e.dataVersion === "1.2.4" || isNewerVersion("1.2.4", item.flags.sw5e.dataVersion))
+ )
+ return updateData;
+
+ // Check to see what the source of Power is
+ const sourceId = item.flags.core.sourceId;
+ const coreSource = sourceId.substr(0, sourceId.length - 17);
+ const core_id = sourceId.substr(sourceId.length - 16, 16);
+
+ //if power type is not force or tech exit out
+ let powerType = "none";
+ if (coreSource === "Compendium.sw5e.forcepowers") powerType = "sw5e.forcepowers";
+ if (coreSource === "Compendium.sw5e.techpowers") powerType = "sw5e.techpowers";
+ if (powerType === "none") return updateData;
const corePower = duplicate(await game.packs.get(powerType).getEntity(core_id));
console.log(`Updating Actor ${actor.name}'s ${item.name} from compendium`);
const corePowerData = corePower.data;
// copy Core Power Data over original Power
updateData["data"] = corePowerData;
- updateData["flags"] = {"sw5e": {"dataVersion": "1.2.4"}};
+ updateData["flags"] = {sw5e: {dataVersion: "1.2.4"}};
return updateData;
-
-
- //game.packs.get(powerType).getEntity(core_id).then(corePower => {
- //})
+ //game.packs.get(powerType).getEntity(core_id).then(corePower => {
+
+ //})
}
/* -------------------------------------------- */
@@ -643,10 +656,10 @@ async function _migrateItemPower(item, actor, updateData) {
* @private
*/
function _migrateItemAttunement(item, updateData) {
- if ( item.data.data.attuned === undefined ) return updateData;
- updateData["data.attunement"] = CONFIG.SW5E.attunementTypes.NONE;
- updateData["data.-=attuned"] = null;
- return updateData;
+ if (item.data?.attuned === undefined) return updateData;
+ updateData["data.attunement"] = CONFIG.SW5E.attunementTypes.NONE;
+ updateData["data.-=attuned"] = null;
+ return updateData;
}
/* -------------------------------------------- */
@@ -657,43 +670,41 @@ function _migrateItemAttunement(item, updateData) {
* @private
*/
export async function purgeFlags(pack) {
- const cleanFlags = (flags) => {
- const flags5e = flags.sw5e || null;
- return flags5e ? {sw5e: flags5e} : {};
- };
- await pack.configure({locked: false});
- const content = await pack.getContent();
- for ( let entity of content ) {
- const update = {_id: entity.id, flags: cleanFlags(entity.data.flags)};
- if ( pack.entity === "Actor" ) {
- update.items = entity.data.items.map(i => {
- i.flags = cleanFlags(i.flags);
- return i;
- })
+ const cleanFlags = (flags) => {
+ const flags5e = flags.sw5e || null;
+ return flags5e ? {sw5e: flags5e} : {};
+ };
+ await pack.configure({locked: false});
+ const content = await pack.getContent();
+ for (let entity of content) {
+ const update = {_id: entity.id, flags: cleanFlags(entity.data.flags)};
+ if (pack.entity === "Actor") {
+ update.items = entity.data.items.map((i) => {
+ i.flags = cleanFlags(i.flags);
+ return i;
+ });
+ }
+ await pack.updateEntity(update, {recursive: false});
+ console.log(`Purged flags from ${entity.name}`);
}
- await pack.updateEntity(update, {recursive: false});
- console.log(`Purged flags from ${entity.name}`);
- }
- await pack.configure({locked: true});
+ await pack.configure({locked: true});
}
/* -------------------------------------------- */
-
/**
* Purge the data model of any inner objects which have been flagged as _deprecated.
* @param {object} data The data to clean
* @private
*/
export function removeDeprecatedObjects(data) {
- for ( let [k, v] of Object.entries(data) ) {
- if ( getType(v) === "Object" ) {
- if (v._deprecated === true) {
- console.log(`Deleting deprecated object key ${k}`);
- delete data[k];
- }
- else removeDeprecatedObjects(v);
+ for (let [k, v] of Object.entries(data)) {
+ if (getType(v) === "Object") {
+ if (v._deprecated === true) {
+ console.log(`Deleting deprecated object key ${k}`);
+ delete data[k];
+ } else removeDeprecatedObjects(v);
+ }
}
- }
- return data;
+ return data;
}
diff --git a/module/pixi/ability-template.js b/module/pixi/ability-template.js
index d72cb886..6799eaec 100644
--- a/module/pixi/ability-template.js
+++ b/module/pixi/ability-template.js
@@ -1,134 +1,132 @@
-import { SW5E } from "../config.js";
+import {SW5E} from "../config.js";
/**
* A helper class for building MeasuredTemplates for 5e powers and abilities
* @extends {MeasuredTemplate}
*/
export default class AbilityTemplate extends MeasuredTemplate {
+ /**
+ * A factory method to create an AbilityTemplate instance using provided data from an Item5e instance
+ * @param {Item5e} item The Item object for which to construct the template
+ * @return {AbilityTemplate|null} The template object, or null if the item does not produce a template
+ */
+ static fromItem(item) {
+ const target = getProperty(item.data, "data.target") || {};
+ const templateShape = SW5E.areaTargetTypes[target.type];
+ if (!templateShape) return null;
- /**
- * A factory method to create an AbilityTemplate instance using provided data from an Item5e instance
- * @param {Item5e} item The Item object for which to construct the template
- * @return {AbilityTemplate|null} The template object, or null if the item does not produce a template
- */
- static fromItem(item) {
- const target = getProperty(item.data, "data.target") || {};
- const templateShape = SW5E.areaTargetTypes[target.type];
- if ( !templateShape ) return null;
+ // Prepare template data
+ const templateData = {
+ t: templateShape,
+ user: game.user.data._id,
+ distance: target.value,
+ direction: 0,
+ x: 0,
+ y: 0,
+ fillColor: game.user.color
+ };
- // Prepare template data
- const templateData = {
- t: templateShape,
- user: game.user.data._id,
- distance: target.value,
- direction: 0,
- x: 0,
- y: 0,
- fillColor: game.user.color
- };
+ // Additional type-specific data
+ switch (templateShape) {
+ case "cone":
+ templateData.angle = CONFIG.MeasuredTemplate.defaults.angle;
+ break;
+ case "rect": // 5e rectangular AoEs are always cubes
+ templateData.distance = Math.hypot(target.value, target.value);
+ templateData.width = target.value;
+ templateData.direction = 45;
+ break;
+ case "ray": // 5e rays are most commonly 1 square (5 ft) in width
+ templateData.width = target.width ?? canvas.dimensions.distance;
+ break;
+ default:
+ break;
+ }
- // Additional type-specific data
- switch ( templateShape ) {
- case "cone":
- templateData.angle = CONFIG.MeasuredTemplate.defaults.angle;
- break;
- case "rect": // 5e rectangular AoEs are always cubes
- templateData.distance = Math.hypot(target.value, target.value);
- templateData.width = target.value;
- templateData.direction = 45;
- break;
- case "ray": // 5e rays are most commonly 1 square (5 ft) in width
- templateData.width = target.width ?? canvas.dimensions.distance;
- break;
- default:
- break;
+ // Return the template constructed from the item data
+ const cls = CONFIG.MeasuredTemplate.documentClass;
+ const template = new cls(templateData, {parent: canvas.scene});
+ const object = new this(template);
+ object.item = item;
+ object.actorSheet = item.actor?.sheet || null;
+ return object;
}
- // Return the template constructed from the item data
- const cls = CONFIG.MeasuredTemplate.documentClass;
- const template = new cls(templateData, {parent: canvas.scene});
- const object = new this(template);
- object.item = item;
- object.actorSheet = item.actor?.sheet || null;
- return object;
- }
+ /* -------------------------------------------- */
- /* -------------------------------------------- */
+ /**
+ * Creates a preview of the power template
+ */
+ drawPreview() {
+ const initialLayer = canvas.activeLayer;
- /**
- * Creates a preview of the power template
- */
- drawPreview() {
- const initialLayer = canvas.activeLayer;
+ // Draw the template and switch to the template layer
+ this.draw();
+ this.layer.activate();
+ this.layer.preview.addChild(this);
- // Draw the template and switch to the template layer
- this.draw();
- this.layer.activate();
- this.layer.preview.addChild(this);
+ // Hide the sheet that originated the preview
+ if (this.actorSheet) this.actorSheet.minimize();
- // Hide the sheet that originated the preview
- if ( this.actorSheet ) this.actorSheet.minimize();
+ // Activate interactivity
+ this.activatePreviewListeners(initialLayer);
+ }
- // Activate interactivity
- this.activatePreviewListeners(initialLayer);
- }
+ /* -------------------------------------------- */
- /* -------------------------------------------- */
+ /**
+ * Activate listeners for the template preview
+ * @param {CanvasLayer} initialLayer The initially active CanvasLayer to re-activate after the workflow is complete
+ */
+ activatePreviewListeners(initialLayer) {
+ const handlers = {};
+ let moveTime = 0;
- /**
- * Activate listeners for the template preview
- * @param {CanvasLayer} initialLayer The initially active CanvasLayer to re-activate after the workflow is complete
- */
- activatePreviewListeners(initialLayer) {
- const handlers = {};
- let moveTime = 0;
+ // Update placement (mouse-move)
+ handlers.mm = (event) => {
+ event.stopPropagation();
+ let now = Date.now(); // Apply a 20ms throttle
+ if (now - moveTime <= 20) return;
+ const center = event.data.getLocalPosition(this.layer);
+ const snapped = canvas.grid.getSnappedPosition(center.x, center.y, 2);
+ this.data.update({x: snapped.x, y: snapped.y});
+ this.refresh();
+ moveTime = now;
+ };
- // Update placement (mouse-move)
- handlers.mm = event => {
- event.stopPropagation();
- let now = Date.now(); // Apply a 20ms throttle
- if ( now - moveTime <= 20 ) return;
- const center = event.data.getLocalPosition(this.layer);
- const snapped = canvas.grid.getSnappedPosition(center.x, center.y, 2);
- this.data.x = snapped.x;
- this.data.y = snapped.y;
- this.refresh();
- moveTime = now;
- };
+ // Cancel the workflow (right-click)
+ handlers.rc = (event) => {
+ this.layer.preview.removeChildren();
+ canvas.stage.off("mousemove", handlers.mm);
+ canvas.stage.off("mousedown", handlers.lc);
+ canvas.app.view.oncontextmenu = null;
+ canvas.app.view.onwheel = null;
+ initialLayer.activate();
+ this.actorSheet.maximize();
+ };
- // Cancel the workflow (right-click)
- handlers.rc = event => {
- this.layer.preview.removeChildren();
- canvas.stage.off("mousemove", handlers.mm);
- canvas.stage.off("mousedown", handlers.lc);
- canvas.app.view.oncontextmenu = null;
- canvas.app.view.onwheel = null;
- initialLayer.activate();
- this.actorSheet.maximize();
- };
+ // Confirm the workflow (left-click)
+ handlers.lc = (event) => {
+ handlers.rc(event);
+ const destination = canvas.grid.getSnappedPosition(this.data.x, this.data.y, 2);
+ this.data.update(destination);
+ canvas.scene.createEmbeddedDocuments("MeasuredTemplate", [this.data]);
+ };
- // Confirm the workflow (left-click)
- handlers.lc = event => {
- handlers.rc(event);
- const destination = canvas.grid.getSnappedPosition(this.data.x, this.data.y, 2);
- this.data.update(destination);
- canvas.scene.createEmbeddedDocuments("MeasuredTemplate", [this.data]);
- };
+ // Rotate the template by 3 degree increments (mouse-wheel)
+ handlers.mw = (event) => {
+ if (event.ctrlKey) event.preventDefault(); // Avoid zooming the browser window
+ event.stopPropagation();
+ let delta = canvas.grid.type > CONST.GRID_TYPES.SQUARE ? 30 : 15;
+ let snap = event.shiftKey ? delta : 5;
+ this.data.update({direction: this.data.direction + snap * Math.sign(event.deltaY)});
+ this.refresh();
+ };
- // Rotate the template by 3 degree increments (mouse-wheel)
- handlers.mw = event => {
- if ( event.ctrlKey ) event.preventDefault(); // Avoid zooming the browser window
- event.stopPropagation();
- let delta = canvas.grid.type > CONST.GRID_TYPES.SQUARE ? 30 : 15;
- let snap = event.shiftKey ? delta : 5;
- this.data.update({direction: this.data.direction + (snap * Math.sign(event.deltaY))});
- this.refresh();
- };
-
- // Activate listeners
- canvas.stage.on("mousemove", handlers.mm);
- canvas.stage.on("mousedown", handlers.lc);
- canvas.app.view.oncontextmenu = handlers.rc;
- canvas.app.view.onwheel = handlers.mw;
- }
+ // Activate listeners
+ canvas.stage.on("mousemove", handlers.mm);
+ canvas.stage.on("mousedown", handlers.lc);
+ canvas.app.view.oncontextmenu = handlers.rc;
+ canvas.app.view.onwheel = handlers.mw;
+ }
}
diff --git a/module/settings.js b/module/settings.js
index 2adde8d3..3b765c69 100644
--- a/module/settings.js
+++ b/module/settings.js
@@ -1,145 +1,144 @@
-export const registerSystemSettings = function() {
+export const registerSystemSettings = function () {
+ /**
+ * Track the system version upon which point a migration was last applied
+ */
+ game.settings.register("sw5e", "systemMigrationVersion", {
+ name: "System Migration Version",
+ scope: "world",
+ config: false,
+ type: String,
+ default: game.system.data.version
+ });
- /**
- * Track the system version upon which point a migration was last applied
- */
- game.settings.register("sw5e", "systemMigrationVersion", {
- name: "System Migration Version",
- scope: "world",
- config: false,
- type: String,
- default: game.system.data.version
- });
+ /**
+ * Register resting variants
+ */
+ game.settings.register("sw5e", "restVariant", {
+ name: "SETTINGS.5eRestN",
+ hint: "SETTINGS.5eRestL",
+ scope: "world",
+ config: true,
+ default: "normal",
+ type: String,
+ choices: {
+ normal: "SETTINGS.5eRestPHB",
+ gritty: "SETTINGS.5eRestGritty",
+ epic: "SETTINGS.5eRestEpic"
+ }
+ });
- /**
- * Register resting variants
- */
- game.settings.register("sw5e", "restVariant", {
- name: "SETTINGS.5eRestN",
- hint: "SETTINGS.5eRestL",
- scope: "world",
- config: true,
- default: "normal",
- type: String,
- choices: {
- "normal": "SETTINGS.5eRestPHB",
- "gritty": "SETTINGS.5eRestGritty",
- "epic": "SETTINGS.5eRestEpic",
- }
- });
+ /**
+ * Register diagonal movement rule setting
+ */
+ game.settings.register("sw5e", "diagonalMovement", {
+ name: "SETTINGS.5eDiagN",
+ hint: "SETTINGS.5eDiagL",
+ scope: "world",
+ config: true,
+ default: "555",
+ type: String,
+ choices: {
+ 555: "SETTINGS.5eDiagPHB",
+ 5105: "SETTINGS.5eDiagDMG",
+ EUCL: "SETTINGS.5eDiagEuclidean"
+ },
+ onChange: (rule) => (canvas.grid.diagonalRule = rule)
+ });
- /**
- * Register diagonal movement rule setting
- */
- game.settings.register("sw5e", "diagonalMovement", {
- name: "SETTINGS.5eDiagN",
- hint: "SETTINGS.5eDiagL",
- scope: "world",
- config: true,
- default: "555",
- type: String,
- choices: {
- "555": "SETTINGS.5eDiagPHB",
- "5105": "SETTINGS.5eDiagDMG",
- "EUCL": "SETTINGS.5eDiagEuclidean",
- },
- onChange: rule => canvas.grid.diagonalRule = rule
- });
+ /**
+ * Register Initiative formula setting
+ */
+ game.settings.register("sw5e", "initiativeDexTiebreaker", {
+ name: "SETTINGS.5eInitTBN",
+ hint: "SETTINGS.5eInitTBL",
+ scope: "world",
+ config: true,
+ default: false,
+ type: Boolean
+ });
- /**
- * Register Initiative formula setting
- */
- game.settings.register("sw5e", "initiativeDexTiebreaker", {
- name: "SETTINGS.5eInitTBN",
- hint: "SETTINGS.5eInitTBL",
- scope: "world",
- config: true,
- default: false,
- type: Boolean
- });
+ /**
+ * Require Currency Carrying Weight
+ */
+ game.settings.register("sw5e", "currencyWeight", {
+ name: "SETTINGS.5eCurWtN",
+ hint: "SETTINGS.5eCurWtL",
+ scope: "world",
+ config: true,
+ default: true,
+ type: Boolean
+ });
- /**
- * Require Currency Carrying Weight
- */
- game.settings.register("sw5e", "currencyWeight", {
- name: "SETTINGS.5eCurWtN",
- hint: "SETTINGS.5eCurWtL",
- scope: "world",
- config: true,
- default: true,
- type: Boolean
- });
+ /**
+ * Option to disable XP bar for session-based or story-based advancement.
+ */
+ game.settings.register("sw5e", "disableExperienceTracking", {
+ name: "SETTINGS.5eNoExpN",
+ hint: "SETTINGS.5eNoExpL",
+ scope: "world",
+ config: true,
+ default: false,
+ type: Boolean
+ });
- /**
- * Option to disable XP bar for session-based or story-based advancement.
- */
- game.settings.register("sw5e", "disableExperienceTracking", {
- name: "SETTINGS.5eNoExpN",
- hint: "SETTINGS.5eNoExpL",
- scope: "world",
- config: true,
- default: false,
- type: Boolean,
- });
+ /**
+ * Option to automatically collapse Item Card descriptions
+ */
+ game.settings.register("sw5e", "autoCollapseItemCards", {
+ name: "SETTINGS.5eAutoCollapseCardN",
+ hint: "SETTINGS.5eAutoCollapseCardL",
+ scope: "client",
+ config: true,
+ default: false,
+ type: Boolean,
+ onChange: (s) => {
+ ui.chat.render();
+ }
+ });
- /**
- * Option to automatically collapse Item Card descriptions
- */
- game.settings.register("sw5e", "autoCollapseItemCards", {
- name: "SETTINGS.5eAutoCollapseCardN",
- hint: "SETTINGS.5eAutoCollapseCardL",
- scope: "client",
- config: true,
- default: false,
- type: Boolean,
- onChange: s => {
- ui.chat.render();
- }
- });
+ /**
+ * Option to allow GMs to restrict polymorphing to GMs only.
+ */
+ game.settings.register("sw5e", "allowPolymorphing", {
+ name: "SETTINGS.5eAllowPolymorphingN",
+ hint: "SETTINGS.5eAllowPolymorphingL",
+ scope: "world",
+ config: true,
+ default: false,
+ type: Boolean
+ });
- /**
- * Option to allow GMs to restrict polymorphing to GMs only.
- */
- game.settings.register('sw5e', 'allowPolymorphing', {
- name: 'SETTINGS.5eAllowPolymorphingN',
- hint: 'SETTINGS.5eAllowPolymorphingL',
- scope: 'world',
- config: true,
- default: false,
- type: Boolean
- });
-
- /**
- * Remember last-used polymorph settings.
- */
- game.settings.register('sw5e', 'polymorphSettings', {
- scope: 'client',
- default: {
- keepPhysical: false,
- keepMental: false,
- keepSaves: false,
- keepSkills: false,
- mergeSaves: false,
- mergeSkills: false,
- keepClass: false,
- keepFeats: false,
- keepPowers: false,
- keepItems: false,
- keepBio: false,
- keepVision: true,
- transformTokens: true
- }
- });
- game.settings.register("sw5e", "colorTheme", {
- name: "SETTINGS.SWColorN",
- hint: "SETTINGS.SWColorL",
- scope: "world",
- config: true,
- default: "light",
- type: String,
- choices: {
- "light": "SETTINGS.SWColorLight",
- "dark": "SETTINGS.SWColorDark"
- }
- });
+ /**
+ * Remember last-used polymorph settings.
+ */
+ game.settings.register("sw5e", "polymorphSettings", {
+ scope: "client",
+ default: {
+ keepPhysical: false,
+ keepMental: false,
+ keepSaves: false,
+ keepSkills: false,
+ mergeSaves: false,
+ mergeSkills: false,
+ keepClass: false,
+ keepFeats: false,
+ keepPowers: false,
+ keepItems: false,
+ keepBio: false,
+ keepVision: true,
+ transformTokens: true
+ }
+ });
+ game.settings.register("sw5e", "colorTheme", {
+ name: "SETTINGS.SWColorN",
+ hint: "SETTINGS.SWColorL",
+ scope: "world",
+ config: true,
+ default: "light",
+ type: String,
+ choices: {
+ light: "SETTINGS.SWColorLight",
+ dark: "SETTINGS.SWColorDark"
+ }
+ });
};
diff --git a/module/templates.js b/module/templates.js
index a27bdf71..e810b6da 100644
--- a/module/templates.js
+++ b/module/templates.js
@@ -3,34 +3,33 @@
* Pre-loaded templates are compiled and cached for fast access when rendering
* @return {Promise}
*/
-export const preloadHandlebarsTemplates = async function() {
- return loadTemplates([
+export const preloadHandlebarsTemplates = async function () {
+ return loadTemplates([
+ // Shared Partials
+ "systems/sw5e/templates/actors/parts/active-effects.html",
- // Shared Partials
- "systems/sw5e/templates/actors/parts/active-effects.html",
+ // Actor Sheet Partials
+ "systems/sw5e/templates/actors/oldActor/parts/actor-traits.html",
+ "systems/sw5e/templates/actors/oldActor/parts/actor-inventory.html",
+ "systems/sw5e/templates/actors/oldActor/parts/actor-features.html",
+ "systems/sw5e/templates/actors/oldActor/parts/actor-powerbook.html",
+ "systems/sw5e/templates/actors/oldActor/parts/actor-notes.html",
- // Actor Sheet Partials
- "systems/sw5e/templates/actors/oldActor/parts/actor-traits.html",
- "systems/sw5e/templates/actors/oldActor/parts/actor-inventory.html",
- "systems/sw5e/templates/actors/oldActor/parts/actor-features.html",
- "systems/sw5e/templates/actors/oldActor/parts/actor-powerbook.html",
- "systems/sw5e/templates/actors/oldActor/parts/actor-notes.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-biography.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-core.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-crew.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-active-effects.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-features.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-inventory.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-force-powerbook.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-tech-powerbook.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-resources.html",
+ "systems/sw5e/templates/actors/newActor/parts/swalt-traits.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-biography.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-core.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-crew.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-active-effects.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-features.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-inventory.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-force-powerbook.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-tech-powerbook.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-resources.html",
- "systems/sw5e/templates/actors/newActor/parts/swalt-traits.html",
-
- // Item Sheet Partials
- "systems/sw5e/templates/items/parts/item-action.html",
- "systems/sw5e/templates/items/parts/item-activation.html",
- "systems/sw5e/templates/items/parts/item-description.html",
- "systems/sw5e/templates/items/parts/item-mountable.html"
- ]);
+ // Item Sheet Partials
+ "systems/sw5e/templates/items/parts/item-action.html",
+ "systems/sw5e/templates/items/parts/item-activation.html",
+ "systems/sw5e/templates/items/parts/item-description.html",
+ "systems/sw5e/templates/items/parts/item-mountable.html"
+ ]);
};
diff --git a/module/token.js b/module/token.js
index db811603..873372cc 100644
--- a/module/token.js
+++ b/module/token.js
@@ -3,11 +3,10 @@
* @extends {TokenDocument}
*/
export class TokenDocument5e extends TokenDocument {
-
/** @inheritdoc */
getBarAttribute(...args) {
const data = super.getBarAttribute(...args);
- if ( data && (data.attribute === "attributes.hp") ) {
+ if (data && data.attribute === "attributes.hp") {
data.value += parseInt(getProperty(this.actor.data, "data.attributes.hp.temp") || 0);
data.max += parseInt(getProperty(this.actor.data, "data.attributes.hp.tempmax") || 0);
}
@@ -15,19 +14,16 @@ export class TokenDocument5e extends TokenDocument {
}
}
-
/* -------------------------------------------- */
-
/**
* Extend the base Token class to implement additional system-specific logic.
* @extends {Token}
*/
export class Token5e extends Token {
-
/** @inheritdoc */
_drawBar(number, bar, data) {
- if ( data.attribute === "attributes.hp" ) return this._drawHPBar(number, bar, data);
+ if (data.attribute === "attributes.hp") return this._drawHPBar(number, bar, data);
return super._drawBar(number, bar, data);
}
@@ -41,7 +37,6 @@ export class Token5e extends Token {
* @private
*/
_drawHPBar(number, bar, data) {
-
// Extract health data
let {value, max, temp, tempmax} = this.document.actor.data.data.attributes.hp;
temp = Number(temp || 0);
@@ -58,42 +53,50 @@ export class Token5e extends Token {
// Determine colors to use
const blk = 0x000000;
- const hpColor = PIXI.utils.rgb2hex([(1-(colorPct/2)), colorPct, 0]);
+ const hpColor = PIXI.utils.rgb2hex([1 - colorPct / 2, colorPct, 0]);
const c = CONFIG.SW5E.tokenHPColors;
// Determine the container size (logic borrowed from core)
const w = this.w;
- let h = Math.max((canvas.dimensions.size / 12), 8);
- if ( this.data.height >= 2 ) h *= 1.6;
+ let h = Math.max(canvas.dimensions.size / 12, 8);
+ if (this.data.height >= 2) h *= 1.6;
const bs = Math.clamped(h / 8, 1, 2);
- const bs1 = bs+1;
+ const bs1 = bs + 1;
// Overall bar container
- bar.clear()
+ bar.clear();
bar.beginFill(blk, 0.5).lineStyle(bs, blk, 1.0).drawRoundedRect(0, 0, w, h, 3);
// Temporary maximum HP
if (tempmax > 0) {
const pct = max / effectiveMax;
- bar.beginFill(c.tempmax, 1.0).lineStyle(1, blk, 1.0).drawRoundedRect(pct*w, 0, (1-pct)*w, h, 2);
+ bar.beginFill(c.tempmax, 1.0)
+ .lineStyle(1, blk, 1.0)
+ .drawRoundedRect(pct * w, 0, (1 - pct) * w, h, 2);
}
// Maximum HP penalty
else if (tempmax < 0) {
const pct = (max + tempmax) / max;
- bar.beginFill(c.negmax, 1.0).lineStyle(1, blk, 1.0).drawRoundedRect(pct*w, 0, (1-pct)*w, h, 2);
+ bar.beginFill(c.negmax, 1.0)
+ .lineStyle(1, blk, 1.0)
+ .drawRoundedRect(pct * w, 0, (1 - pct) * w, h, 2);
}
// Health bar
- bar.beginFill(hpColor, 1.0).lineStyle(bs, blk, 1.0).drawRoundedRect(0, 0, valuePct*w, h, 2)
+ bar.beginFill(hpColor, 1.0)
+ .lineStyle(bs, blk, 1.0)
+ .drawRoundedRect(0, 0, valuePct * w, h, 2);
// Temporary hit points
- if ( temp > 0 ) {
- bar.beginFill(c.temp, 1.0).lineStyle(0).drawRoundedRect(bs1, bs1, (tempPct*w)-(2*bs1), h-(2*bs1), 1);
+ if (temp > 0) {
+ bar.beginFill(c.temp, 1.0)
+ .lineStyle(0)
+ .drawRoundedRect(bs1, bs1, tempPct * w - 2 * bs1, h - 2 * bs1, 1);
}
// Set position
- let posY = (number === 0) ? (this.h - h) : 0;
+ let posY = number === 0 ? this.h - h : 0;
bar.position.set(0, posY);
}
}
diff --git a/package-lock.json b/package-lock.json
index 759e9b50..b2fbf9ac 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1266,9 +1266,9 @@
}
},
"hosted-git-info": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
- "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
},
"image-size": {
"version": "0.5.5",
@@ -3068,9 +3068,9 @@
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
},
"y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE="
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+ "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ=="
},
"yargs": {
"version": "7.1.1",
diff --git a/packs/Icons/Archetypes/Teras Kasi Order.webp b/packs/Icons/Archetypes/Teras Kasi Order.webp
new file mode 100644
index 00000000..3f0a1585
Binary files /dev/null and b/packs/Icons/Archetypes/Teras Kasi Order.webp differ
diff --git a/packs/Icons/Force Powers/Defensive Technique.webp b/packs/Icons/Force Powers/Defensive Technique.webp
new file mode 100644
index 00000000..6736a7c0
Binary files /dev/null and b/packs/Icons/Force Powers/Defensive Technique.webp differ
diff --git a/packs/Icons/Force Powers/Kinetite.webp b/packs/Icons/Force Powers/Kinetite.webp
new file mode 100644
index 00000000..c8936b27
Binary files /dev/null and b/packs/Icons/Force Powers/Kinetite.webp differ
diff --git a/packs/Icons/Force Powers/Tapas.webp b/packs/Icons/Force Powers/Tapas.webp
new file mode 100644
index 00000000..14681378
Binary files /dev/null and b/packs/Icons/Force Powers/Tapas.webp differ
diff --git a/packs/Icons/Force Powers/Telepathic Link.webp b/packs/Icons/Force Powers/Telepathic Link.webp
new file mode 100644
index 00000000..4f1383fc
Binary files /dev/null and b/packs/Icons/Force Powers/Telepathic Link.webp differ
diff --git a/packs/Icons/Force Powers/Wakefulness.webp b/packs/Icons/Force Powers/Wakefulness.webp
new file mode 100644
index 00000000..9aeec48a
Binary files /dev/null and b/packs/Icons/Force Powers/Wakefulness.webp differ
diff --git a/packs/Icons/Martial Blasters/Shoulder Cannon.webp b/packs/Icons/Martial Blasters/Shoulder Cannon.webp
new file mode 100644
index 00000000..ec849135
Binary files /dev/null and b/packs/Icons/Martial Blasters/Shoulder Cannon.webp differ
diff --git a/packs/Icons/Simple Vibroweapons/Unarmed Strike.png b/packs/Icons/Simple Vibroweapons/Unarmed Strike.png
new file mode 100644
index 00000000..4b50289b
Binary files /dev/null and b/packs/Icons/Simple Vibroweapons/Unarmed Strike.png differ
diff --git a/packs/Icons/Tech Powers/Aid Droid.webp b/packs/Icons/Tech Powers/Aid Droid.webp
new file mode 100644
index 00000000..a8433e01
Binary files /dev/null and b/packs/Icons/Tech Powers/Aid Droid.webp differ
diff --git a/packs/Icons/Tech Powers/Alter Self.webp b/packs/Icons/Tech Powers/Alter Self.webp
new file mode 100644
index 00000000..a8433e01
Binary files /dev/null and b/packs/Icons/Tech Powers/Alter Self.webp differ
diff --git a/packs/Icons/Tech Powers/Mutate-Augment.webp b/packs/Icons/Tech Powers/Mutate-Augment.webp
new file mode 100644
index 00000000..a8433e01
Binary files /dev/null and b/packs/Icons/Tech Powers/Mutate-Augment.webp differ
diff --git a/packs/Icons/Tech Powers/Tri-Shot.webp b/packs/Icons/Tech Powers/Tri-Shot.webp
new file mode 100644
index 00000000..a8433e01
Binary files /dev/null and b/packs/Icons/Tech Powers/Tri-Shot.webp differ
diff --git a/packs/packs/adventuringgear.db b/packs/packs/adventuringgear.db
index 18aedea4..1e4f8991 100644
--- a/packs/packs/adventuringgear.db
+++ b/packs/packs/adventuringgear.db
@@ -52,7 +52,7 @@
{"name":"Traz","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"tool","data":{"description":{"value":"","chat":"","unidentified":""},"source":"PHB","quantity":1,"weight":6,"price":300,"attuned":false,"equipped":false,"rarity":"","identified":true,"ability":"int","chatFlavor":"","proficient":0,"attributes":{"spelldc":10},"damage":{"parts":[]}},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false,"effects":[]}},"img":"systems/sw5e/packs/Icons/Musical%20Instrument/Traz.webp","_id":"UQu4duMtxYEXKAbo"}
{"name":"Tent, two-person","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"loot","data":{"description":{"value":"","chat":"","unidentified":""},"source":"","quantity":1,"weight":5,"price":20,"attuned":false,"equipped":false,"rarity":"","identified":true,"attributes":{"spelldc":10},"damage":{"parts":[]}},"flags":{},"img":"systems/sw5e/packs/Icons/Utility/Tent.webp","_id":"UxL0trd3omeqzBk4"}
{"name":"Homing Beacon","permission":{"default":0,"vXYkFWX6qzvOu2jc":3},"type":"loot","data":{"description":{"value":"
A homing beacon is a device used to track starships or any other entity being transported. Homing beacons transmit using non-mass HoloNet transceivers able to be tracked through hyperspace. Homing beacons are small enough that they can easily be hidden inside a ship, or tucked into some crevice on its exterior.
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.
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.
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.
Those fighters who choose to become Adept Specialists tap into a latent Force-sensitivity to augment their martial prowess, blending the two to accelerate their bodies and blows. An adept speeds across the battlefield, attacking opponents in a flurry of blows before dashing off again.
\n
Forcecasting
\n
When you choose this specialty at 3rd level, you have learned powers, fragments of knowledge that imbue you with an abiding force ability. See chapter 10 for the general rules of forcecasting and chapter 11 for the force powers list.
\n
Force Powers Known
\n
You learn 4 force powers of your choice, and you learn more at higher levels, as shown in the Force Powers Known column of the Adept Specialist Forcecasting table. You may not learn a force power of a level higher than your Max Power Level, and you may learn a force power at the same time you learn its prerequisite.
\n
Force Points
\n
You have a number of force points equal to your fighter level, as shown in the Force Points column of the Adept Specialist Forcecasting table, + your Wisdom or Charisma modifier (your choice). You use these force points to cast force powers. You regain all expended force points when you finish a long rest.
\n
Max Power Level
\n
Many force powers can be overpowered, consuming more force points to create a greater effect. You can overpower these abilities to a maximum level, which increases at higher levels, as shown in the Max Power Level column of the Adept Specialist Forcecasting table.
\n
You may only cast force powers at 4th-level once. You regain the ability to do so after a long rest.
\n
Forcecasting Ability
\n
Your forcecasting ability varies based on the alignment of the powers you cast. You use your Wisdom for light side powers, Charisma for dark side powers, and Wisdom or Charisma for universal powers (your choice). You use this ability score modifier whenever a power refers to your forcecasting ability. In addition, you use this ability score modifier when setting the saving throw DC for a force power you cast and when making an attack roll with one.
\n
Force save DC = 8 + your proficiency bonus + your forcecasting ability modifier
\n
Force attack modifier = your proficiency bonus + your forcecasting ability modifier
\n
\n
\n
\n\n
\n
Adept Specialist Forcecasting
\n
\n
\n
Level
\n
Force Powers Known
\n
Force Points
\n
Max Power Level
\n
\n\n\n
\n
3rd
\n
4
\n
3
\n
1st
\n
\n
\n
4th
\n
6
\n
4
\n
1st
\n
\n
\n
5th
\n
7
\n
5
\n
1st
\n
\n
\n
6th
\n
8
\n
6
\n
1st
\n
\n
\n
7th
\n
10
\n
7
\n
2nd
\n
\n
\n
8th
\n
11
\n
8
\n
2nd
\n
\n
\n
9th
\n
12
\n
9
\n
2nd
\n
\n
\n
10th
\n
13
\n
10
\n
2nd
\n
\n
\n
11th
\n
14
\n
11
\n
2nd
\n
\n
\n
12th
\n
15
\n
12
\n
2nd
\n
\n
\n
13th
\n
17
\n
13
\n
3rd
\n
\n
\n
14th
\n
18
\n
14
\n
3rd
\n
\n
\n
15th
\n
19
\n
15
\n
3rd
\n
\n
\n
16th
\n
20
\n
16
\n
3rd
\n
\n
\n
17th
\n
22
\n
17
\n
4th
\n
\n
\n
18th
\n
23
\n
18
\n
4th
\n
\n
\n
19th
\n
24
\n
19
\n
4th
\n
\n
\n
20th
\n
25
\n
20
\n
4th
\n
\n\n
\n
\n
\n
Growing Momentum
\n
Also at 3rd level, you can cast the @Compendium[sw5e.forcepowers.tAs3ogXXwpDkpZvF]{Burst of Speed} force power targeting yourself at 1st-level without expending force points. At 10th level, when you do so, your speed increases by an additional 10 feet. At 18th level, when you do so, your speed increases by an additional 10 feet.
\n
You can use this feature a number of times equal to your Wisdom or Charisma modifier (your choice, a minimum of once). You regain any expended uses when you finish a long rest.
\n
Whirling Weapons
\n
Beginning at 7th level, your constant blur of motion and attacks becomes an unending barrage as you build momentum. Once on your turn when you miss with a weapon attack you can make another weapon attack, no action required.
\n
Focused Breathing
\n
At 10th level, you learn to recover some of your expended power quickly. When you use your Second Wind you also regain a number of force points equal to your Wisdom or Charisma modifier (your choice, a minimum of one).
\n
Unstoppable Force
\n
Starting at 15th level, you learn to completely ignore many of the most devastating impediments of combat. You can expend a use of Indomitable to gain the effect of the @Compendium[sw5e.forcepowers.BqGw2Mt7mBqqVclc]{Freedom of Movement} force power until the end of your next turn.
\n
Instant Acceleration
\n
At 18th level you reach the pinnacle of your training, moving faster than eyes or most sensors can track. When you use Action Surge feature, you can teleport up to 30 feet to an unoccupied space you can see. You can teleport before or after the additional action.
"},"source":"EC","activation":{"cost":null,"type":""},"actionType":"","damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"classCasterType":"Forcecaster"},"flags":{"dynamiceffects":{"equipActive":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Archetypes/Adept%20Specialist.webp","effects":[]}
{"_id":"6JrXY2jDqQiuuUGq","name":"Way of Negation","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"archetype","data":{"className":"Consular","description":{"value":"
Way of Negation
\n
Some force users seek mastery over the fundamentals of energy manipulation, known as tutaminis. Those consulars who follow the Way of Negation harness this power to limit the havoc that other force-wielders might wreak.
\n
Force Deflection
\n
At 3rd level, when you fail a saving throw, you can use your reaction to gain a +4 bonus to that saving throw.
\n
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 finish a short or long rest.
\n
Power Surge
\n
Starting at 6th level, you learn to simultaneously limit a creature's force powers and store that power within yourself to later strengthen your damaging force powers.
\n
You can store a maximum number of power surges equal to your Wisdom or Charisma modifier (your choice, minimum of one). Whenever you successfully end a force power with a power such as @Compendium[sw5e.forcepowers.XYHAKmU4gHSzRK3I]{Force Suppression} or @Compendium[sw5e.forcepowers.LhMmIUjsFrytp0wc]{Sever Force}, or use your Force Shield or Force Deflection features to successfully avoid an attack or succeed on a saving throw, you gain one power surge, as you redirect the flow of the Force into yourself.
\n
Once per turn, when you deal damage to a creature or object with a force power, you can spend one power surge to deal extra damage to that target. The extra damage is of the same type as the power's damage, and it equals half your consular level (rounded down).
\n
Whenever you finish a long rest, your number of power surges resets to one. If you end a short rest with no power surges, you gain one power surge.
\n
Enduring Focus
\n
At 10th level, you can casually deflect attacks while channeling your power. While you are concentrating on a Force power, you have a +2 bonus to your AC and all saving throws.
\n
Additionally, you can extend your Force Deflection to a creature within 5 feet of you when they fail a saving throw.
\n
Conflux
\n
At 14th level, when you use your Force Deflection feature, you can cause a ripple in the Force to expand from you. Up to three creatures of your choice that you can see within 60 feet of you each take force damage equal to half your consular level.
\n
Tutaminis Mastery
\n
At 18th level, when you use a Force-Empowered Casting option, you can spend a power surge to use it without spending additional force points.
Those fighters who choose to become Blademaster Specialists hone their focus to a blade's edge, becoming so in tune with their arsenal that it becomes both their weapon and their armor.
\n
Unarmored Defense
\n
When you choose this specialty at 3rd level, while you are wearing no armor and not wielding a shield, your AC equals 10 + your Dexterity modifier + your Strength modifier.
\n
Adaptive Fighting
\n
Also at 3rd level, you've learned to make adaptations to your fighting style on the fly. You have three such effects: Change Up, Draw, and Stow. When you use your Adaptive Fighting, you choose which effect to create.
\n
You can use this features a number of times equal to your Strength or Dexterity modifier (your choice, a minimum of once). You regain all expended uses when you complete a short or long rest.
\n
Change Up
\n
You can use your object interaction and expend a use of your Adaptive Fighting to change the Fighting Style option granted to you by your fighter class feature. You can't take a Fighting Style option more than once.
\n
Draw
\n
When you use your object interaction to draw one or more weapons, you can expend a use of your Adaptive Fighting (no action required) to make your weapon attacks with the weapon(s) score a critical hit on a roll of 19 or 20 until the start of your next turn.
\n
Stow
\n
When you use your object interaction to stow a weapon, you can expend a use of your Adaptive Fighting (no action required) to take the Disengage action.
\n
Dervish
\n
Beginning at 7th level, when you score a critical hit with a melee weapon attack, you regain a use of your Adaptive Fighting, to a maximum of your Strength or Dexterity modifier (your choice, minimum of one).
\n
Resilient Fighting
\n
At 10th level, when you expend a use of your Adaptive Fighting, you gain resistance to energy and kinetic damage dealt by weapons until the start of your next turn.
\n
Adrenaline Rush
\n
Starting at 15th level, when you use your Action Surge feature, you can take an extra bonus action on top of the additional action.
\n
Bladestorm
\n
At 18th level, you can use your action to make a single melee weapon attack against each creature within your reach. Make a separate attack roll against each target. The first attack gains a +1 bonus to its attack roll, and each attack after the first gains an additional +1 bonus to its attack roll, cumulatively, to a maximum bonus of +6. If you are wielding two light- or vibro-weapons, or a weapon with the double property, you also add this bonus to your damage rolls, and you can use your bonus action to engage in Two-Weapon Fighting.
\n
Once you've used this feature, you must complete a short or long rest before you can use it again.
Monks of the Teräs Käsi Order are the ultimate masters of unarmed martial arts combat. They learn techniques to draw focus from the defeat of their enemies, resist the mental assaults of the Force, and unleash powerful rushes of strikes to subdue their foes.
\n
Forredari Stance
\n
Teräs Käsi Order: 3rd level Your honed focus allows you to enter a stance of mental fortification and power. You can use your bonus action to enter this stance. When you do so, you unleash a flurry of blows on creatures of your choice that you can see within 10 feet of you. Each creature in the area must make a Dexterity saving throw (DC = 8 + your bonus to attacks with the weapon) or take the weapon's normal damage.
\n
This stance lasts for 1 minute. While you are in this stance, you gain the following benefits:
\n
\n
Death Weave. When you reduce a creature to 0 hit points, you gain temporary hit points equal to your Wisdom or Charisma modifier (your choice) + half your monk level (rounded down, minimum of 1).
\n
Gundark Slap. Once on each of your turns, when you hit a creature with an unarmed strike or a monk weapon, you can choose to make it unable to take reactions until the end of your next turn.
\n
Sleeping Krayt. You can use your Wisdom or Charisma modifier (your choice) instead of Strength whenever you would make a Strength check or a Strength saving throw. Additionally, you have advantage on saving throws against being charmed or frightened.
\n
\n
These effects end early if you are incapacitated or die. Once you've used this feature, you can't use it again until you finish a long rest.
\n
While you have no remaining uses of this feature, you can instead expend 1 focus point to use it. When you do so, your maximum focus points are reduced by 1 until you complete a long rest.
\n
Steel Hands Form
\n
Teräs Käsi Order: 6th level
\n
You can draw upon your focus to utilize an array of practiced techniques to strike your opponents with precision and power. You can use your bonus action to enter this stance, and when you do so, you can also enter your Forredari Stance as a part of this same bonus action. This form lasts for 1 minute. While you are in this stance, you gain the following benefits:
\n
\n
Charging Wampa. Once per round, when you are forced to make a saving throw against a force power, your movement speed increases by 10 feet until the end of your next turn.
\n
Nexu Grin. When a creature you can see within 10 feet of you casts a force power that requires a force attack roll against you or an an allied creature, you can use your reaction and expend 1 focus point to impose disadvantage on the attack roll. If the attack misses, and the higher of the two d20 rolls would also miss, the creature cannot cast that force power again until it completes a short or long rest.
\n
Screaming Squill. Once per turn, when you hit a creature that is concentrating on a force power and it makes a Constitution saving throw to maintain concentration, the DC for the check equals your focus save DC, unless the DC for the Constitution saving throw would be higher.
\n
\n
These effects end early if you are incapacitated or die. Once you've used this feature, you can't use it again until you finish a long rest.
\n
While you have no remaining uses of this feature, you can instead expend 1 focus point to use it. When you do so, your maximum focus points are reduced by 1 until you complete a long rest.
\n
Matter Over Mind
\n
Teräs Käsi Order: 11th level You tap into the greater power of your focus. While both your Forredari Stance and your Steel Hands Form are active, you gain the following benefits:
\n
\n
Dancing Dragonsnake. When you take force, lightning, or necrotic damage, you can use your reaction to deflect it. When you do so, the damage you take is reduced by 1d10 + your Wisdom or Charisma modifier (your choice) + your monk level.
\n
Aryx Slash. Once on each of your turns, when you hit a target with an unarmed strike or monk weapon, you can roll a Martial Arts die and deal additional psychic damage equal to the amount rolled.
\n
Piercing Gaze. When you would make an Insight check against a creature you know to wield the Force, you can use either your Wisdom or Charisma modifier for the roll, and you are considered to have expertise in the Insight skill. If you would already have expertise in the check, you instead have advantage on the roll.
\n
\n
Spitting Rawl
\n
Teräs Käsi Order: 17th level You have learned to harness your strikes in a blistering fury. On your turn, when a creature takes damage from you three times, you can make up to three additional unarmed strikes against the creature (no action required). The first additional unarmed strike costs 1 focus point and deals 1d12 additional psychic damage on a hit, and each unarmed strike after the first costs 1 additional focus point and deals 1d12 additional psychic damage on a hit, cumulatively.
"},"source":"EC","className":"Monk","classCasterType":""},"flags":{"core":{"sourceId":"Item.8ZPX84rNvnHaPbT5"}},"img":"systems/sw5e/packs/Icons/Archetypes/Teras%20Kasi%20Order.webp","effects":[],"_id":"8H3eJ7yWj6t54MP2"}
{"_id":"8UxY6Q7jXLR9tedX","name":"Kro Var Order","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"archetype","data":{"className":"Monk","description":{"value":"
Kro Var Order
\n
Monks of the Kro Var Order—known as shapers—utilize a unique power to bend the four elements to their will, creating effects as small as a floating flame to quakes that sunder the earth.
\n
Elemental Attunement
\n
Kro Var Order: 3rd, 11th, and 17th level
\n
You gain the ability to bend the elements to your will. As an action, you can manipulate these forces to create one of the following effects of your choice at a space within 10 feet of you:
\n
\n
Create a harmless, instantaneous sensory effect related to air, earth, fire, or water, such as a shower of sparks, a puff of wind, a spray of light mist, or a gentle rumbling of stone.
\n
Instantaneously light or snuff out a candle, a torch, or a small campfire.
\n
Chill or warm up to 1 pound of nonliving material for up to 1 hour.
\n
Cause earth, fire, water, or mist that can fit within a 1 foot cube to shape itself into a crude form you designate for 1 minute.
\n
\n
This range increases to 30 feet at 11th level and 60 feet at 17th level.
\n
Additionally, as a bonus action on your turn, you can spend 1 focus point to conjure a weapon made of one of the four elements—air, earth, fire, or water—which lasts for 1 minute. Your weapon takes an appearance of your choice, it can only be used by you, and you can't be disarmed of it while you are conscious. You are proficient in this weapon, which counts as a monk weapon for you and uses your Martial Arts die for its damage rolls. You can only have one of these weapons at a time, and if you summon a new one the old one immediately disappears.
\n
Air
\n
Your whistling weapon has the thrown property with a range of 20/60 and deals sonic damage on a hit. Additionally, when you hit a creature with the weapon, it is deafened until the end of its next turn.
\n
Earth
\n
Your earthen weapon takes the form of stone and deals kinetic damage on a hit. Additionally, when you hit a creature with it, you can force the target to make a Strength saving throw. On a failed save, the target is pushed back 5 feet. Lastly, while active, you can use Strength instead of Dexterity when determining your AC, as long as it doesn't already include that modifier.
\n
Fire
\n
Your flaming weapon sheds bright light in a 10-foot radius and dim light for an additional 10 feet, deals fire damage, and when you hit a creature with it, the creature takes additional damage equal to half your Wisdom or Charisma modifier (your choice, rounded up, minimum of one).
\n
Water
\n
Your watery weapon has the reach property, deals cold damage on a hit, and you can use your Wisdom or Charisma modifier (your choice) instead of Dexterity or Strength for its attack and damage rolls. You must use the same modifier for both rolls. Additionally, when you would make a melee weapon attack, you can instead use your weapon to wet a 5-foot square within your weapon's reach. The affected area is difficult terrain. Each creature who starts its turn in the square or enters it for the first time must make a Dexterity saving throw, falling prone on a failed save.
\n
Elemental Adept
\n
Kro Var Order: 6th, 11th, and 17th level
\n
You gain two of the following features. You gain an additional option at 11th and 17th level.
\n
You can use these features a combined number of times equal to your proficiency bonus, as shown in the monk table. You regain all expended uses when you complete a long rest.
\n
While you have no remaining uses of this feature, you can instead expend 2 focus points to use it. When you do so, your maximum focus points are reduced by 2 until you complete a long rest.
\n
Burning Ember Flourish
\n
You can use your action to choose an area of flame that you can see and that fits within a 5-foot cube within 60 feet. You can extinguish the fire in that area, and you create either fireworks or smoke when you do so.
\n
Fireworks. The target explodes with a dazzling display of colors. Each creature within 10 feet of the target must succeed on a Constitution saving throw or become blinded until the end of your next turn.
\n
Smoke. Thick black smoke spreads out from the target in a 20-foot radius, moving around corners. The area of the smoke is heavily obscured. The smoke persists for 1 minute or until a strong wind disperses it.
\n
Curtain of Unyielding Wind
\n
As an action, you can spend 2 focus points to call up a mighty gale, which swirls around you in a 10-foot radius and moves with you, remaining centered on you. The wind lasts for 10 minutes. The wind deafens both you and other creatures in its area. It extinguishes unprotected flames in its area that are torch-sized or smaller and hedges out vapor, gas, and fog that can be dispersed by strong wind. The area is difficult terrain for creatures other than you, and the attack rolls of ranged weapon attacks have disadvantage if the attacks pass in or out of the wind.
\n
Crushing Hand of the Mountain
\n
As an action, you can choose a 5-foot-square unoccupied space on the ground that you can see within 30 feet. A Medium hand made from soil and stone, which lasts for 1 minute, rises in that space and reaches for one Large or smaller creature you can see within 5 feet of it. The target must make a Strength saving throw. On a failed save, the target takes 2d6 kinetic damage and is restrained for the duration. As a bonus action on each of your turns, you can cause the hand to crush the restrained target, which must make a Strength saving throw. It takes 2d6 kinetic damage on a failed save or half as much damage on a successful one. To break out, the restrained creature can use its action to make a Strength check against your focus save DC. On a success, the target escapes and is no longer restrained by the hand. As an action, you can cause the hand to reach for a different creature or to move to a different unoccupied space within range. The hand releases a restrained target if you do either.
\n
Hatchling's Flame
\n
As an action, you focus your energy into a torrent of fire that streaks away from you. A line of roaring flame 30 feet long and 5 feet wide emanates from you in a direction you choose. Each creature in the line must make a Dexterity saving throw. A creature takes 3d8 fire damage on a failed save, or half as much damage on a successful one.
\n
Patient Bantha Listens
\n
You reach out to the ground beneath you. You can use your bonus action to gain tremorsense with a range of 30 feet and a burrow speed equal to your walking speed for up to 1 minute. Your movement leaves behind a tunnel that remains for as long as this ability is active, after which it collapses.
\n
Rush of the Shyrack
\n
As an action, you can spend 2 focus points to form a line of strong wind 60 feet long and 10 feet wide that blasts from you in a direction you choose for one minute or until you lose concentration or dismiss the effect (no action required). Each Large or smaller creature that starts its turn in the line must succeed on a Strength saving throw or be pushed 15 feet away from you in a direction following the line. Any creature in the line must spend 2 feet of movement for every 1 foot it moves when moving closer to you. The gust disperses gas or vapor, and it extinguishes candles, torches, and similar unprotected flames in the area. It causes protected flames, such as those of lanterns, to dance wildly and has a 50 percent chance to extinguish them. As a bonus action on each of your turns before the effect ends, you can change the direction in which the line blasts from you.
\n
Shape the Raincloud
\n
You can use your action to pull water from air and return it to the atmosphere. In an open container, you can create up to 20 gallons of drinkable water. You may also produce a rain that falls within a 30-foot cube and extinguishes open-air flames. You can destroy the same amount of water in an open container, or destroy a 30-foot cube of fog.
\n
Swarming Ice Rabbit
\n
As an action, you can cause a flurry of ice crystals to erupt from a point you can see within 90 feet. Each creature in a 5-foot-radius sphere centered on that point must make a Dexterity saving throw. On a failed save, a creature takes 3d6 cold damage and gains 1 slowed level until the start of your next turn. On a successful save, a creature takes half as much damage and isn't slowed.
\n
Elemental Master
\n
Kro Var Order: 11th and 17th level
\n
At 11th level, you gain one of the following features. You gain an additional option at 17th level.
\n
You can use these features a combined number of times equal to half your proficiency bonus, as shown in the monk table. You regain all expended uses when you complete a long rest.
\n
While you have no remaining uses of this feature, you can instead expend 3 focus points to use it. When you do so, your maximum focus points are reduced by 3 until you complete a long rest.
\n
Earth Reaches for Sky
\n
Prerequisite: Crushing Hand of the Mountain or Patient Bantha Listens
\n
As an action, you can choose a point you can see on the ground within 120 feet. A fountain of churned earth and stone erupts in a 20-foot cube centered on that point. Each creature in that area must make a Dexterity saving throw. A creature takes 3d12 kinetic damage on a failed save, or half as much damage on a successful one. Additionally, the ground in that area becomes difficult terrain until cleared. Each 5-foot-square portion of the area requires at least 1 minute to clear by hand.
\n
Ride the Wind
\n
Prerequisite: Curtain of Unyielding Wind or Rush of the Shyrack
\n
As an action, you can gain a flying speed equal to your movement speed for 10 minutes. You can hover while this technique is active, but when it ends, you fall if you are still aloft, unless you can stop the fall.
\n
River of Hungry Flame
\n
Prerequisite: Burning Ember Flourish or Hatchling's Flame
\n
As an action, you can create a wall of fire on a solid surface within 120 feet. You can make the wall up to 60 feet long, 20 feet high, and 1 foot thick, or a ringed wall up to 20 feet in diameter, 20 feet high, and 1 foot thick. The wall is opaque and lasts for 1 minute.
\n
When the wall appears, each creature within its area must make a Dexterity saving throw. On a failed save, a creature takes 5d8 fire damage, or half as much damage on a successful save.
\n
One side of the wall, chosen by you when you use this feature, deals 5d8 fire damage to each creature that ends its turn within 10 feet of that side of the wall. A creature takes the same damage when it enters the wall for the first time on a turn or ends its turn there. The other side of the wall deals no damage.
\n
Shape the Flowing River
\n
Prerequisite: Shape the Raincloud or Swarming Ice Rabbit
\n
As an action, you can control any freestanding water within 300 feet of you inside an area you choose that is a cube up to 100 feet on a side. You can choose from any of the following effects when you use this feature. As an action on your turn, you can repeat the same effect or choose a different one.
\n
Flood. You cause the water level of all standing water in the area to rise by as much as 20 feet. If the area includes a shore, the flooding water spills over onto dry land. If you choose an area in a large body of water, you instead create a 20-foot tall wave that travels from one side of the area to the other and then crashes down. Any Huge or smaller creatures in the wave's path are carried with it to the other side. Any Huge or smaller creatures struck by the wave have a 25 percent chance of being knocked prone. The water level remains elevated until the feature ends or you choose a different effect. If this effect produced a wave, the wave repeats on the start of your next turn while the flood effect lasts.
\n
Part Water. You cause water in the area to move apart and create a trench. The trench extends across the feature's area, and the separated water forms a wall to either side. The trench remains until the feature ends or you choose a different effect. The water then slowly fills in the trench over the course of the next round until the normal water level is restored.
\n
Redirect Flow. You cause flowing water in the area to move in a direction you choose, even if the water has to flow over obstacles, up walls, or in other unlikely directions. The water in the area moves as you direct it, but once it moves beyond the feature's area, it resumes its flow based on the terrain conditions. The water continues co move in the direction you chose until the feature ends or you choose a different effect.
\n
Whirlpool. This effect requires a body of water at least 50 feet square and 25 feet deep. You cause a whirlpool to form in the center of the area. The whirlpool forms a vortex that is 5 feet wide at the base, up to 50 feet wide at the top, and 25 feet tall. Any creature or object in the water and within 25 feet of the vortex is pulled 10 feet toward it. A creature can swim away from the vortex by making a Strength (Athletics) check against your feature save DC. When a creature enters the vortex for the first time on a turn or starts its turn there, it must make a Strength saving throw. On a failed save, the creature takes 2d8 kinetic damage and is caught in the vortex until the feature ends. On a successful save, the creature takes half damage, and isn't caught in the vortex. A creature caught in the vortex can use its action to try to swim away from the vortex as described above, but has disadvantage on the Strength (Athletics) check to do so. The first time each turn that an object enters the vortex, the object takes 2d8 kinetic damage; this damage occurs each round it remains in the vortex.
\n
Elemental Paragon
\n
Kro Var Order: 17th level
\n
You gain one of the following features.
\n
Once you've used the chosen feature, you must complete a long rest before you can use it again.
\n
While you have no remaining uses of this feature, you can instead expend 4 focus points to use it. When you do so, your maximum focus points are reduced by 4 until you complete a long rest.
\n
Archetype of Air
\n
Prerequisite: Ride the Wind
\n
As an action, you conjure a whirlwind around you, granting the following benefits until the start of your next turn:
\n
\n
Ranged attacks made against you have disadvantage.
\n
You gain a flying speed of 60 feet. If you are still flying when the technique ends, you fall, unless you can somehow prevent it.
\n
You can use your action to create a 15 foot cube of swirling wind centered on a point you can see within 60 feet of you. Each creature in that area must make a Constitution saving throw. A creature takes 2d10 kinetic damage on a failed save, or half as much damage on a successful one. If a Large or smaller creature fails the save, that creature is also pushed up to 10 feet away from the center of the cube.
\n
\n
At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.
\n
Figure of Flame
\n
Prerequisite: River of Hungry Flame
\n
As an action, you cause flames to race across your body, granting the following benefits until the start of your next turn:
\n
\n
You have resistance to fire damage.
\n
The flames shed bright light in a 30 foot radius and dim light for an additional 30 feet.
\n
Any creature that moves within 5 feet of you for the first time on a turn or ends its turn there takes 1d10 fire damage.
\n
You can use your action to create a line of fire 15 feet long and 5 feet wide extending from you in a direction you choose. Each creature in the line must make a Dexterity saving throw, taking 4d8 fire damage on a failed save or half as much on a successful one.
\n
\n
At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.
\n
Icon of Ice
\n
Prerequisite: Shape the Flowing River
\n
As an action, you cause frost to chill the area around you, granting the following benefits until the start of your next turn:
\n
\n
You have resistance to cold damage.
\n
You can move across difficult terrain created by ice or snow without spending extra movement.
\n
The ground in a 10 foot radius around you is icy and is difficult terrain for creatures other than you. The radius moves with you.
\n
You can use your action to create a 15 foot cone of freezing ice extending from your outstretched hand in a direction you choose. Each creature in the cone must make a Constitution saving throw. A creature takes 4d6 cold damage on a failed save or half as much damage on a successful one. A creature that fails its save against this effect gains 1 slowed level until the start of your next turn.
\n
\n
At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.
\n
Embodiment of Earth
\n
Prerequisite: Earth Reaches for Sky
\n
As an action, you cause rock to envelop you, granting the following benefits until the start of your next turn:
\n
\n
You have resistance to kinetic and energy damage.
\n
You can move across difficult terrain made of earth or stone without spending extra movement. You can move through solid earth or stone as if it were air without destabilizing it, but you can't end your movement there. If you do so, you are immediately shunted to the nearest unoccupied space that you can occupy and take force damage equal to twice the number of feet you are moved.
\n
You can use your action to create a small earthquake on the ground in a 15 foot radius centered on you. Other creatures on that ground must succeed on a Dexterity saving throw or be knocked prone.
\n
\n
At the start of each of your turns, you can use your bonus action to extend the benefits of this feature until the start of your next turn, to a maximum duration of 1 minute. This effect ends immediately if you are incapacitated or die.
\n
Avatar
\n
Kro Var Order: 17th level
\n
As an ultimate display of your mastery of the elements, you can spend 5 focus points as an action to have the elements of water, earth, fire, and air form a protective sphere around your body, gaining multiple benefits for 1 minute. While this ability is active, you have resistance to cold, energy, fire, kinetic, lightning, and sonic damage. You also gain a burrow, fly, and swim speed equal to your movement speed. Lastly, you can use any of the following abilities as a bonus action:
\n
\n
You create a small earthquake on the ground in a 15 foot radius around you. Each creature in that area must make a Dexterity saving throw. On a failed save, a creature takes 1 d6 kinetic damage and is knocked prone.
\n
You create a line of fire 15 feet long and 5 feet wide extending from you in a direction you choose. Each creature in the line must make a Dexterity saving throw. A creature takes 3d6 fire damage on a failed save, or half as much damage on a successful one.
\n
You create a 15 foot cube of swirling wind centered on a point you can see within 60 feet of you. Each creature in that area must make a Constitution saving throw. A creature takes 1 d10 kinetic damage on a failed save, or half as much damage on a successful one. If a Large or smaller creature fails the save, that creature is also pushed up to 10 feet away from the center of the cube.
\n
You create a 15 foot cone of ice shards extending from your outstretched hand in a direction you choose. Each creature in the cone must make a Constitution save throw. A creature takes 2d6 cold damage on a failed save, or half as much damage on a successful one. A creature that fails its save against this effect has its speed halved until the start of your next turn.
\n
"},"source":"EC","classCasterType":""},"flags":{"core":{"sourceId":"Item.O5AoHo3xLmzUywN0"},"dae":{"activeEquipped":false,"alwaysActive":false}},"img":"systems/sw5e/packs/Icons/Archetypes/Kro%20Var%20Order.webp","effects":[]}
{"_id":"9AQImD6JBpd9c1UK","name":"Path of the Corsair","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"archetype","data":{"className":"Sentinel","description":{"value":"
Path of the Corsair
\n
There may come a time when a sentinel finds themselves stranded, hunted, or in any situation where they must hide their nature as a force wielder. Those sentinels who follow the Path of the Corsair make use of alternative weaponry not commonly associated with force-wielders to great effect.
\n
Scavenger's Reach
\n
Starting when you choose this calling at 3rd level, you learn the @Compendium[sw5e.forcepowers.5o01ADUmNyzy470b]{Force Disarm} force power. Additionally, you can use your Kinetic Combat feature when you cast it as your action. Finally, when you cast the force disarm power, disarm a blaster weapon, and catch it, you can reload the weapon as a part of the same action.
\n
Corsair Weapons
\n
Also at 3rd level, you can use the force to quickly learn the use of unfamiliar weapons. When you hold a weapon that you are not proficient in, you can spend 1 force point (no action required) to gain proficiency with that weapon until the end of your next long rest. If that weapon is a blaster, you can use it to make Kinetic Combat attacks as long as the target of the attack is within the weapon's normal range.
\n
Additionally, when you throw a grenade, you can use Wisdom or Charisma instead of Strength when determining your throwing range.
\n
Force-Empowered Detonators
\n
At 7th level, you learn to infuse a number of small detonators with the Force. Over the course of a short or long rest, you can create a number of detonators equal to your Wisdom or Charisma modifier (your choice, minimum of one). Your detonators can only be used by you, and they lose their potency at the end of your next short or long rest.
\n
As a bonus action on each of your turns, you can throw one of your detonators at a point within range. Your detonators have a range equal to 30 feet + your Wisdom or Charisma modifier x 5. Make a universal ranged force attack. On a hit, the detonator adheres to the target, and if the target is a Large or smaller creature, it is pushed back 5 feet. On a miss, it falls to the ground. Hit or miss, the detonator then explodes. The target and each creature within 5 feet must make a Dexterity saving throw against your universal force save DC. If the detonator adhered to a target, the creature has disadvantage on the saving throw. A creature takes force damage equal to your Kinetic Combat Damage Die + your Wisdom or Charisma modifier (your choice) on a failed save, or half as much on a successful one.
\n
Energized Kinetics
\n
By 13th level, once per turn, when you deal damage with a Force-Empowered Detonator or your Double Strike feature, you can deal additional damage equal to your Kinetic Combat Damage Die. The damage type is force, lightning, necrotic, or psychic (your choice).
\n
Disorienting Detonations
\n
At 18th level, when a creature fails the saving throw against your Force-Empowered Detonators feature, you can spend 2 force points to subject it to the effects of one of the following force powers: @Compendium[sw5e.forcepowers.KCVdYOoxu0kfkSCn]{Affliction}, @Compendium[sw5e.forcepowers.bDdyZTL7KCiz2zXR]{Force Blind/Deafen}, @Compendium[sw5e.forcepowers.8UOBsZEV8esbx6IG]{Stun}, or @Compendium[sw5e.forcepowers.83VXTwWszl8bMlW6]{Stun Droid}. They automatically fail the saving throw for the selected power, but the effects only last until the end of your next turn.
Form IV, also know as Aggression Form, is a kinetically active form that relies on speed, acrobatics, and power. Those guardians who focus on Ataru Form utilize high energy tactics to confuse and distract their opponents, quickly moving about the battlefield.
\n
Form Basics
\n
When you choose this form as your focus at 3rd level, you learn the basics of the chosen form. You gain the @Compendium[sw5e.lightsaberform.yfCFM4d8xPdcsNKe]{Ataru Lightsaber Form}, detailed in Chapter 6 of the Player’s Handbook. If you already know this form, you can instead choose another lightsaber form. You can’t take a lightsaber form option more than once, even if you later get to choose again.
\n
The Way of the Hawk-Bat
\n
Also at 3rd level, as a bonus action, you you can take an aggressive stance, leaping around the battlefield for 1 minute. As a part of this bonus action, and as a bonus action on each of your turns, you can cast the @Compendium[sw5e.forcepowers.oPi4Y7zezP7MxNDK]{Force Jump power} at 1st-level without expending force points. Additionally, when you cast force jump, you have advantage on the first attack roll you make against each creature within 5 feet of where you land.
\n
This effect ends early if you are incapacitated or die. Once you've used this feature, you can't use it again until you finish a long rest.
\n
Channel the Force
\n
Lastly at 3rd level, you gain the following Channel the Force option.
\n
Retreating Leap
\n
When a creature makes a melee attack roll against you, you can expend a use of your Channel the Force and your reaction to jump 10 feet in a direction of your choice, imposing disadvantage on the roll. This movement does not provoke opportunity attacks. You can wait until after the attack roll is made, but before the DM determines whether the attack hits.
\n
Hawk-Bat Swoop
\n
At 7th level, you gain the ability to move along vertical surfaces without falIing during the move. If you end your turn in the air, you fall immediately to the ground.
\n
Additionally, you no longer take damage when falling from a distance no greater than your walking speed.
\n
Whirlwind Attack
\n
At 15th level, you can use your action to make melee attacks against any number of creatures within 5 feet of you, with a separate attack roll for each target.
\n
Master of Aggression
\n
At 20th level, your presence on the field of battle is as a graceful blur of deadly blades and daring acrobatics. Your Dexterity and Wisdom or Charisma scores (your choice) increase by 2. Your maximum for those scores increases by 2. Additionally, you can use your action to gain the following benefits for 1 minute:
\n
\n
You have resistance to kinetic and energy damage from unenhanced weapons.
\n
When an ally within 30 feet of you takes the Attack action, they can make one additional attack as a part of that same action.
\n
When you hit a creature with a weapon attack, you can move up to 10 feet. This movement does not provoke opportunity attacks.
\n
\n
This effect ends early if you are incapacitated or die. Once you've used this feature, you can't use it again until you finish a long rest.
Those operatives who choose the Sharpshooter Practice are bringers of death. Striking from a safe distance, the Sharpshooter uses precision shooting to control the battlefield and bring targets down quickly.
\n
Assume the Position
\n
Beginning at 3rd level, you don't need advantage on your attack roll to use your Sneak Attack if your target is greater than 30 feet from you and no enemies are within 5 feet of you. In addition, standing up from prone now only costs 5 feet of movement.
\n
Additionally, you gain proficiency with two martial blasters of your choice.
\n
Place Shot
\n
Also at 3rd level, you perfect the art of placing distant shots for maximum effectiveness in debilitating and controlling your enemies. When you deal Sneak Attack damage to a creature, you may choose to forgo two of your Sneak Attack dice to make the attack a placed shot.
\n
Some of your placed shots require your target to make a saving throw to resist the placed shot's effects. The saving throw DC is calculated as follows:
\n
Placed Shot save DC = 8 + your proficiency bonus + your Dexterity modifier
\n
Disarming Shot
\n
You attempt to disarm a creature with your attack. The target must succeed on a Strength saving throw or be forced to drop one item of your choice that it's holding. The object lands at its feet.
\n
Penetrating Shot
\n
You attempt to damage another target with the same attack. Choose a second target within 15 feet of and directly behind your initial target. If the original attack roll would hit the second target, it takes two dice worth of Sneak Attack damage.
\n
The damage is of the same type dealt by the original attack.
\n
Suppressive Shot
\n
You attempt to pin the target to its location. The target must succeed on a Wisdom saving throw or be frightened of you until the end of its next turn.
\n
Head Shot
\n
At 9th level, you are at your deadliest when your enemies are unaware of the danger they are in. You have advantage on attack rolls against any creature that hasn't taken a turn in combat yet.
\n
Additionally, any hit you score against a creature that is surprised is a critical hit.
\n
Distracting Shot
\n
Starting at 13th level, you are able to defend your compatriots from afar. When a friendly creature you can see within your weapon's normal range is the target of a ranged attack, or forced to make a saving throw, and the source of the effect is within your weapon's normal range, you can use your reaction to make a ranged weapon attack against the source. On a hit, instead of dealing damage, the target of your attack has disadvantage on the attack roll against your ally, or your ally has advantage on the saving throw to resist the effect.
\n
Double Tap
\n
At 17th level, you've learned to capitalize when you have the advantage. When you take the Attack action and make an attack with advantage, you can choose to forgo the advantage. If you do, you can make an additional attack against the target or another creature within 5 feet of it (no action required). Both attacks can benefit from your Sneak Attack damage, instead of only one.
With every conflict comes death and destruction. Followers of the Triage Technique excel at keeping their comrades in the fight with quick thinking and fastacting medicine.
\n
Triage Training
\n
Triage Technique: 3rd level
\n
You gain proficiency in the Medicine skill.
\n
Additionally, when you would use your action to make an ability check to stabilize a creature, expend a use of a traumakit, or use a medpac, you can instead use your bonus action.
\n
Mark of Triage
\n
Triage Technique: 3rd level
\n
You learn new ways to use your Ranger's Quarry.
\n
\n
While a hostile creature is the target of your Ranger's Quarry, you always know any conditions it is suffering from, and you know at roughly what percentage its current hit points is relative to its maximum. Additionally, if the target is within 60 feet of you. when it is forced to make a Constitution saving throw, you can use your reaction to force it to make the roll with disadvantage. Once you've used this feature, you must complete a short or long rest before you can use it again.
\n
While a friendly creature is the target of your Ranger's Quarry, you have advantage on Wisdom (Medicine) checks made to stabilize it. Additionally, if the target is within 60 feet of you, you can use your bonus action and roll your Ranger's Quarry and either restore hit points equal to the amount rolled, or grant temporary hit points equal to the amount rolled. Once a friendly creature has benefited from this ability, they can not do so again until they complete a short or long rest.
\n
\n
Double Dose
\n
Triage Technique: 7th level
\n
Your application of medicine does not interfere with your own ability to recover from injuries. When you restore hit points or grant temporary hit points to another creature with a tech power or class feature, you recover the same amount of hit points or gain the same number of temporary hit points.
\n
You can use this feature a number of times equal to your proficiency bonus, as shown in the scout table. You regain all expended uses when you complete a long rest.
\n
Experimental Infusion
\n
Triage Technique: 11th level
\n
When you target a creature with your Ranger's Quarry, you can grant one of the following additional effects of your choice:
\n
\n
Adrenaline/Tranquilizer. The creature's movement speed is doubled until the end of its next turn. Alternatively, it gains a level of slowed until the end of its next turn.
\n
Focus/Dizziness. The creature has either advantage or disadvantage (your choice) on the first ability check, attack roll, or saving throw it makes within the next minute.
\n
Toughen/Weaken. The creature gains temporary hit points equal to your scout level, which last for 1 minute. Alternatively, the creature must make a Constitution saving throw against your tech save DC. On a failure, it takes psychic damage equal to your scout level and it can't regain hit points until the start of your next turn.
\n
\n
You can use each feature once. You regain any expended uses when you complete a short or long rest.
\n
Cure-All
\n
Triage Technique: 15th level
\n
Your healing becomes even more potent When you restore hit points to a creature as a bonus action using your Mark of the Healer feature, you can also end one of the following conditions afflicting it: blinded, deafened, diseased, paralyzed, or poisoned.
Some scouts becomes legends written in blaster burns. Followers of the Deadeye Technique the art of the blaster shot and utilize their incredible focus to make shots that most would deem impossible. When everything depends on one shot, you want a Deadeye pulling the trigger.
\n
Due to their uncanny focus, Deadeyes can make shots that other marksmen would never dare to attempt. Deadeyes know how to make the most of ranged weapons and can use them to greater effect than other Scouts.
\n
Focused Superiority
\n
When you choose this technique at 3rd level, you learn maneuvers that are fueled by special dice called superiority dice.
\n
Maneuvers
\n
You know two maneuvers of your choice, which are detailed under \"Maneuvers\" below, and you earn more at higher levels, as shown in the Maneuvers Known column of the Deadeye Technique Focused Superiority table. Many maneuvers enhance an attack in some way. You can use only one maneuver per attack, and you may only use each maneuver once per turn.
\n
Each time you learn new maneuvers, you can also replace one maneuver you know with a different one.
\n
Superiority Dice
\n
You have two superiority dice, which are d6s, and you earn more at higher levels, as shown in the Superiority Dice column of the Deadeye Technique Focused Superiority table. 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.
\n
Saving Throws
\n
Some of your maneuvers require your target to make a saving throw to resist the maneuver's effects. The saving throw DC is calculated as follows:
\n
Maneuver save DC = 8 + your proficiency bonus + your Dexterity modifier
\n
\n
\n
\n\n
\n
Deadeye Technique Focused Superiority
\n
\n
\n
Level
\n
Focused Superiority
\n
Superiority Dice
\n
Maneuvers Known
\n
\n\n\n
\n
3rd
\n
d4
\n
2
\n
2
\n
\n
\n
4th
\n
d4
\n
2
\n
2
\n
\n
\n
5th
\n
d6
\n
2
\n
2
\n
\n
\n
6th
\n
d6
\n
2
\n
2
\n
\n
\n
7th
\n
d6
\n
3
\n
3
\n
\n
\n
8th
\n
d6
\n
3
\n
3
\n
\n
\n
9th
\n
d8
\n
3
\n
3
\n
\n
\n
10th
\n
d8
\n
3
\n
3
\n
\n
\n
11th
\n
d8
\n
4
\n
4
\n
\n
\n
12th
\n
d8
\n
4
\n
4
\n
\n
\n
13th
\n
d10
\n
4
\n
4
\n
\n
\n
14th
\n
d10
\n
4
\n
4
\n
\n
\n
15th
\n
d10
\n
5
\n
5
\n
\n
\n
16th
\n
d10
\n
5
\n
5
\n
\n
\n
17th
\n
d12
\n
5
\n
5
\n
\n
\n
18th
\n
d12
\n
5
\n
5
\n
\n
\n
19th
\n
d12
\n
5
\n
5
\n
\n
\n
20th
\n
d12
\n
5
\n
5
\n
\n\n
\n
\n
\n
Maneuvers
\n
The maneuvers are presented in alphabetical order.
\n
Crippling Shot
\n
When you hit a creature with a ranged weapon attack, you can expend a superiority die to cripple its movement. Add the number rolled to the damage of the ranged weapon attack. The creature must succeed on a Constitution saving throw or have its movement speed halved. At the end of each of its turns, the target can make a Constitution saving throw to end the effect.
\n
Daring Escape
\n
You can expend one superiority die to take the Disengage action as a bonus action until the end of your turn. Until the end of this turn, you have advantage on all Strength (Athletics) checks.
\n
Covering Fire
\n
When you hit a creature with a ranged weapon attack, you can expend one superiority die to maneuver one of your comrades into a more advantageous position. You add the superiority die to the attack's damage roll, and you choose a friendly creature who can see or hear you.
\n
That creature can use its reaction to move up to half its speed without provoking opportunity attacks from the target of your attack.
\n
Disarming Shot
\n
When you hit a creature with a ranged weapon attack, you can expend one superiority die to attempt to disarm the target, forcing it to drop one item of your choice that it's holding. Add the superiority die to the attack's damage roll, and the target must make a Strength saving throw. On a failed save, it drops the object you choose. The object lands at its feet.
\n
Distracting Shot
\n
When you hit a creature with a ranged weapon attack, you can expend one superiority die to distract the creature, giving your allies an opening. You add the superiority die to the attack's damage roll. The next attack roll against the target by an attacker other than you has advantage if the attack is made before the start of your next turn.
\n
Exploit Weakness
\n
When you hit a creature with a weapon attack, you can expend a superiority die and deal additional damage equal to the number rolled. This damage cannot be reduced in any way.
\n
Penetrating Shot
\n
When you hit a creature with a ranged weapon attack, you can expend one superiority die to attempt to damage another creature with the same attack. Choose up to two creatures within 15 feet of and directly behind your initial target. If the original attack roll would hit the second creature(s), it takes damage equal to the number you roll on your superiority die.
\n
The damage is of the same type dealt by the original attack.
\n
Precision Attack
\n
When you make a weapon attack roll against a creature, you can expend one superiority die to add it to the roll. You can use this maneuver before or after making the attack roll, but before any effects of the attack are applied.
\n
Return Fire
\n
When a creature misses you with a ranged attack, you can use your reaction and expend one superiority die to make a ranged weapon attack against the creature. If you hit, you add the superiority die to the attack's damage roll.
\n
Mark of the Deadeye
\n
Also at 3rd level, the range of your Ranger's Quarry feature doubles. Additionally, when making ranged weapon attacks against the target of your Ranger's Quarry, the normal and long range of your ranged weapons double.
\n
Cover to Cover
\n
Beginning at 7th level, attack rolls made against you on your turn are made with disadvantage.
\n
Deadeye Technique Focused Superiority
\n
Shoot First
\n
Starting at 11th level, you have learned that the person who shoots first is often the one who walks out alive. When you make a ranged weapon attack against a creature that has not yet acted during your first turn in combat and you have advantage on the roll, you can reroll one of the dice once.
\n
Additionally, on a hit, you deal an extra 1d6 damage of the same type as the weapon.
\n
Overwatch
\n
At 15th level, you have become a master at protecting your allies from afar. When a creature attempts to make an opportunity attack against an allied creature, or forces your ally to make a saving throw, you can use your reaction to make an attack roll against the enemy creature.
\n
If your attack hits, either impose disadvantage on the enemy creature's opportunity attack roll or grant advantage to any allies making the saving throw.
Those engineers who choose the Astrotech Engineering discipline focus on crafting and upgrading their droid companions.
\n
Bonus Proficiencies
\n
When you choose this discipline at 3rd level, you gain proficiency in astrotech's tools. Additionally, when you engage in crafting with astrotech's tools, the rate at which you craft doubles.
\n
Droid Companion
\n
Also at 3rd level, you learn to employ all the knowledge you've accumulated to create and customize your own personalized droid companion.
\n
Choose your droid, which is detailed at the end of this discipline. Over the course of 8 hours, which can be done during a long rest, you can expend 500 cr worth of materials to finally finish your droid.
\n
If your droid is irreparably destroyed, or you want to interface with a different droid, you can spend an additional 250 credits and 1 hour to change the target of this feature. You may only have one droid companion at a time.
\n
Your droid gains a variety of benefits while it is interfaced with you:
\n
\n
The droid obeys your commands as best it can. It acts on your turn, and you determine its actions, decisions, attitudes, and so on. If you are incapacitated or absent, your droid acts on its own.
\n
Your droid's level equals your engineer level, and for each engineer level you gain after 3rd, your droid companion gains an additional Hit Die and increases its hit points accordingly.
\n
Your droid has the proficiency bonus of a player character of the same level.
\n
Whenever you gain the Ability Score Improvement feature in this class, your droid's abilities also improve. Your droid can increase one ability score of your choice by 2, or it can increase two ability scores of your choice by 1. As normal, your droid can't increase an ability score above 20 using this feature unless its description specifies otherwise.
\n
Your droid can not wear armor, but you can have the armor professionally integrated into its chassis. Over the course of a long rest, you can expend materials equal to half the cost of the armor in order to integrate it into your droid. Your droid must be proficient in armor in order to have it integrated.
\n
Your droid is a valid target of the tracker droid interface tech power.
\n
\n
Additionally, you can modify your droid. Your droid companion has 4 modification slots, and it gains more at higher levels, as shown in the Modification Slots column of the engineer class table. For each modification installed, your tech point maximum is reduced by 1. Over the course of a long rest, you can replace or remove a number of modifications up to your Intelligence modifier (minimum of one).
\n
Potent Integration
\n
Lastly at 3rd level, when your droid makes an attack roll, you can use your reaction to expend one use of your Potent Aptitude to give it a boost. Roll the die and add it to both the attack and damage rolls, if the attack hits.
\n
Coordinated Attack
\n
Beginning at 6th level, when you take the Attack action, if your companion can see you, it can use its reaction to make a weapon attack against the same creature.
\n
Droid Defense
\n
At 14th level, while your droid can see you, it has advantage on all saving throws.
\n
Superior Droid Defense
\n
Starting at 18th level, whenever an attacker that your droid can see hits it with an attack, it can use its reaction to halve the attack's damage against it.
\n
Generating Your Droid
\n
Choosing your droid companion is an integral part of being an Astrotech Engineer. The class of droid you choose determines their features. Class II, III, and IV droids are all appropriate options, with their statistics listed below.
\n
Once you've selected your type of droid class, you assign your droid's ability scores using standard array (16, 14, 14, 12, 10, 8) as you see fit.
\n
Droid Features
\n
All droids share the following features.
\n
Resistances and Vulnerabilities
\n
\n
Droid Resistances: Your droid is resistant to necrotic, poison, and psychic damage, and immune to poison and disease.
\n
Droid Vulnerabilities: Your droid is vulnerable to ion damage. Additionally, your droid has disadvantage on saving throws against effects that would deal ion or lightning damage.
\n
\n
Traits
\n
\n
Creature Type: Droid
\n
Armor Integration: Your droid can not wear armor, but you can have the armor professionally integrated into its chassis. Over the course of a long rest, you can expend materials equal to half the cost of the armor in order to have it integrated. This work must be done by someone proficient with astrotech's tools. Your droid must be proficient in armor in order to have it integrated.
\n
\n
Class I Droid
\n
Class I droids are programmed for the mathematical, medical, or physical sciences. Subcategories of the first degree are medical droids, biological science droids, physical science droids, and mathematics droids.
\n
As a class I droid, your droid companion has the following features.
\n
Hit Points
\n
\n
Hit Dice: 1d8 per class I droid level
\n
Hit Points at 1st Level: 8 + your droid's Constitution modifier
\n
Hit Points at Higher Levels: 1d8 (or 5) + your droid's Constitution modifier per class I droid level after 1st
\n
\n
Proficiencies
\n
\n
Armor: Light armor plating
\n
Weapons: Simple blasters, simple vibroweapons
\n
Tools: None
\n
\n
\n
Languages: Class I droids can speak, read, and write Galactic Basic and one language of your choice. They can understand spoken and written Binary, but can not speak it
\n
Saving Throws: Wisdom, Intelligence
\n
Skills: Two Intelligence, Wisdom, or Charisma skills of your choice
\n
\n
Features
\n
\n
Size: Medium
\n
Speed: 25 ft.
\n
\n
Class II Droid
\n
Class II droids are programmed for engineering and other technical sciences. They differ from class I droids because they apply the science to real-life situations. Class II droids are rarely equipped with Basic vocabulators, instead communicating through Binary. There are five subcategories of class II droids. Astromech, exploration, environmental, engineering, and maintenance droids are all class II droids.
\n
As a class II droid, your droid companion has the following features.
\n
Hit Points
\n
\n
Hit Dice: 1d6 per class II droid level
\n
Hit Points at 1st Level: 6 + your droid's Constitution modifier
\n
Hit Points at Higher Levels: 1d6 (or 4) + your droid's Constitution modifier per class II droid level after 1st
\n
\n
Proficiencies
\n
\n
Armor: Light armor, medium armor
\n
Weapons: Simple blasters and simple vibroweapons with the light property
\n
Tools: Your choice of demolition's kit, security kit, or slicer's kit
\n
\n
\n
Languages: Class II droids can speak, read, and write Binary. They can understand spoken and written Galactic Basic and one language of your choice, but can not speak it
\n
Saving Throws: Dexterity, Intelligence
\n
Skills: Two of your choice
\n
\n
Features
\n
\n
Size: Small
\n
Speed: 25 ft.
\n
\n
Class III Droid
\n
Class III droids are programmed to interact with humans. They are said to be the most advanced droids ever invented. Protocol, servant, tutor, and child care droids are all class III droids.
\n
As a class III droid, your droid companion has the following features.
\n
Hit Points
\n
\n
Hit Dice: 1d8 per class III droid level
\n
Hit Points at 1st Level: 8 + your droid's Constitution modifier
\n
Hit Points at Higher Levels: 1d8 (or 5) + your droid's Constitution modifier per class III droid level after 1st
\n
\n
Proficiencies
\n
\n
Armor: Light armor
\n
Weapons: Simple blasters, simple vibroweapons
\n
Tools: None
\n
\n
\n
Languages: Class III droids can speak and understand all registered languages
\n
Saving Throws: Wisdom, Charisma
\n
Skills: None
\n
\n
Features
\n
\n
Size: Medium
\n
Speed: 25 ft.
\n
\n
Class IV Droid
\n
Class IV droids are programmed for military and security purposes. Such droids tend to perform tasks of violence or combat might be expected. Almost all class IV droids carry weapons. Armed combat droids are among the first droids ever created. Security, gladiator, battle, and assassin droids are all class IV droids.
\n
As a class IV droid, your droid companion has the following features.
\n
Hit Points
\n
\n
Hit Dice: 1d8 per class IV droid level
\n
Hit Points at 1st Level: 8 + your droid's Constitution modifier
\n
Hit Points at Higher Levels: 1d8 (or 5) + your droid's Constitution modifier per class IV droid level after 1st
\n
\n
Proficiencies
\n
\n
Armor: All armor
\n
Weapons: All blasters, All vibroweapons
\n
Tools: None
\n
\n
\n
Languages: Class IV droids can speak, read, and write Galactic Basic and one language of your choice. They can understand spoken and written Binary, but can not speak it
\n
Saving Throws: Strength, Dexterity
\n
Skills: None
\n
\n
Features
\n
\n
Size: Medium
\n
Speed: 30 ft.
\n
\n
Class V Droid
\n
Class V droids are programmed for menial and low-skill tasks. Such droids tend to perform basic tasks such as construction, lifting, maintenance, mining, sanitation, and transportation.
\n
As a class V droid, your droid companion has the following features.
\n
Hit Points
\n
\n
Hit Dice: 1d8 per class V droid level
\n
Hit Points at 1st Level: 8 + your droid's Constitution modifier
\n
Hit Points at Higher Levels: 1d8 (or 5) + your droid's Constitution modifier per class V droid level after 1st
\n
\n
Proficiencies
\n
\n
Armor: Light armor, medium armor
\n
Weapons: All vibroweapons, simple blasters
\n
Tools: One set of artisan's tools
\n
\n
\n
Languages: Class V droids can speak, read, and write Binary. They can understand spoken and written Galactic Basic and one language of your choice, but can not speak it
\n
Saving Throws: Strength, Constitution
\n
Skills: Athletics
\n
\n
Features
\n
\n
Size: Medium
\n
Speed: 30 ft.
\n
\n
Astrotech Modifications
\n
If a modification has prerequisites, you must meet them to install it. You can install the modification at the same time that you meet its prerequisites.
\n
Advanced Power Core
\n
Prerequisite: 7th level, d10 Hit Die You greatly improve the power core of your droid. Its Hit Die becomes a d12.
\n
Alarm Protocol
\n
You install an alarm module in your droid, granting the following benefits:
\n
\n
Your droid grants a +5 bonus to initiative to creatures within 5 feet of it.
\n
You and your droid can't be surprised while your droid is conscious.
\n
\n
Analysis Protocol
\n
Prerequisite: 7th level, Class I Droid Your droid can analyze a target, develop a plan on how to best overcome any potential obstacle, and execute that plan with ruthless efficiency. As a bonus action on your droid's turn, your droid can analyze a target it can see within 60 feet of it. For the next minute, or until it analyzes another target, it gains the following benefits:
\n
\n
When it analyzes a hostile creature, its attack and damage rolls made with weapons with the finesse property or blaster weapons against that target may use its Intelligence modifier instead of Strength or Dexterity.
\n
When it analyzes a friendly creature, the target can end your droid's Analysis Protocol on them (no action required) to add half your droid's Intelligence modifier (rounded down, minimum of +1) to one attack roll, ability check, or saving throw. Once a friendly creature has benefited from this ability, they can not do so again until they complete a short or long rest.
\n
\n
Arm Cannons
\n
You install dual arm cannons in your droid. The arm cannons have 2 charges. As an action, your droid can use charges to cast the overload tech power, using 1 charge per level. The saving throw is made against your droid's tech save DC (8 + your droid's proficiency bonus + your droid's Intelligence modifier).
\n
You can choose this modification multiple times. Each time you do so, the arm cannons gain another charge, to a maximum of 4. The arm cannons regain all charges after a long rest.
\n
Back-Up Protocol
\n
Prerequisite: 7th level You install an emergency protocol in your droid, prompting a quick reboot after critical damage is taken. If your droid would be reduced to 0 hit points, it instead is reduced to 1.
\n
Once your droid uses this feature, it must finish a short or long rest before it can use it again.
\n
Celerity Augment
\n
You augment your droid to move a little faster. Your droid's speed increases by 5 feet.
\n
You can choose this modification twice.
\n
Charisma Chip
\n
Prerequisite: Class III Droid You install a charisma chip in your droid. When an ally your droid can see makes an ability check, attack roll, or saving throw, your droid can use its reaction to give them advantage on the roll. It can do so before or after they roll the d20, but before the GM says the roll succeeds or fails. Once your droid uses this ability, it can't use it again until it finishes a short or long rest.
\n
Durability Module
\n
You enhance your droid's durability, granting the following benefits:
\n
\n
When your droid rolls a Hit Die to regain hit points, the minimum number of hit points your droid can regain from the roll equals twice your droid's Constitution modifier (minimum of 2).
\n
Your droid's hit point maximum increases by an amount equal to twice its level when you install this protocol. Whenever your droid gains a level thereafter, its hit point maximum increases by an additional 2 hit points.
\n
\n
Emergency Mode
\n
Prerequisite: 15th level Prerequisite: Back-Up Protocol You modify your droid's back-up protocol. When your droid's back-up protocol is initiated, it can immediately use its reaction to make one attack roll against a target within range. If the target is the source of the damage that reduced your droid to 0, the attack roll has advantage.
\n
Energy Shield
\n
You install an energy shield in your droid. The energy shield has 1 charge. As an action, your droid can use 1 charge to cast the @Compendium[sw5e.techpowers.c7vvcY0lZDii7SOI]{Energy Shield}tech power.
\n
You can choose this modification multiple times. Each time you do so, the energy shield gains another charge, to a maximum of 3. The energy shield regains all expended charges after a long rest.
\n
Expertise Protocol
\n
Prerequisite: 5th level You install a protocol in your droid that grants it expertise in a tool or skill. Choose a tool or skill that your droid is proficient in. Your droid gains expertise in it.
\n
False Combustion
\n
Prerequisite: Class II Droid You install a panic protocol in your droid. As a reaction in response to taking damage, your droid can feign an explosion. For 1 minute, your droid appears to be destroyed to all outward inspection. A creature can use its action to inspect the droid and make an Intelligence (Investigation) check against your droid's tech save DC (8 + your droid's proficiency bonus + your droid's Intelligence modifier). If it succeeds, it becomes aware that your droid is still functioning.
\n
Fighting Style Protocol
\n
Your droid adopts a particular style of fighting as its specialty. Choose one of the Fighting Style options, detailed in chapter 6. Your droid can't take a Fighting Style option more than once, even if it later gets to choose again.
\n
Flamethrower
\n
You install a flamethrower in your droid. The flamethrower has 1 charge. As an action, your droid can cast the @Compendium[sw5e.techpowers.HoshRCTHW8vntDCg]{Jet of Flame} tech power or use 1 charge to cast the flame sweep tech power at 1st level. The saving throw is made against your droid's tech save DC (8 + your droid's proficiency bonus + your droid's Intelligence modifier).
\n
You can choose this modification multiple times. Each time you do so, the flamethrower gains another charge, to a maximum of 3. If the flamethrower has multiple charges, you can use multiple charges to cast @Compendium[sw5e.techpowers.6aZ0FG6HwrUO28WF]{Flame Sweep} at a higher level, 1 point per charge. The flamethrower regains all expended charges after a long rest.
\n
Four-Armed Combatant
\n
Prerequisite: Class IV Droid You install two additional arms to improve your droid's combat capabilities, granting it four arms which it can use independently of one another. Your droid can only gain the benefit of items held by two of its arms at any given time, and once per round your droid can switch which arms it is benefiting from (no action required).
\n
While your droid has at least 3 arms free, it has a climbing speed equal to its walking speed.
\n
Heavy Plating
\n
Prerequisite: Medium Armor proficiency Your droid gains proficiency in heavy armor. If your droid is already proficient in heavy armor, instead kinetic and energy damage that your droid takes from unenhanced weapons is reduced by an amount equal to its proficiency bonus.
\n
Light Plating
\n
Your droid gains proficiency in light armor. If your droid is already proficient in light armor, instead your droid's speed increases by 5 feet while light armor is integrated.
\n
Martial Protocol
\n
Prerequisite: 7th level, Class IV Droid Your droid has martial training that allows it to perform special combat maneuvers. It gains the following benefits:
\n
\n
It learns two maneuvers of your choice from among those available to the fighter class. If a maneuver it uses requires its target to make a saving throw to resist the maneuver's effects, the saving throw DC equals 8 + your droid's proficiency bonus + your droid's Strength or Dexterity modifier (your choice).
\n
Your droid has two superiority dice, which are d4s. These dice are used to fuel its maneuvers. A superiority die is expended when your droid uses it. It regain all of its expended superiority dice when you finish a short or long rest.
\n
\n
Medium Plating
\n
Prerequisite: Light Armor proficiency Your droid gains proficiency in medium armor. If your droid is already proficient in medium armor, the maximum Dexterity bonus your droid can add to AC increases to 3 from 2 while medium armor is integrated.
\n
Memory Protocol
\n
Prerequisite: Class I Droid Your droid can recall anything it has read in the past month that it understood. This includes but is not limited to books, maps, signs, and lists.
\n
Observant Protocol
\n
Prerequisite: 7th level Prerequisite: Alarm Protocol You modify the alarm module in your droid, granting the following benefits:
\n
\n
If your droid can see a creature's mouth while it is speaking a language it understands, your droid can interpret what it's saying by reading its lips.
\n
Your droid is considered to have advantage when determining its passive Wisdom (Perception) and passive Intelligence (Investigation) scores.
\n
\n
Performance Protocol
\n
Prerequisite: 7th level, Class III Droid You modify your droid's charisma chip, granting the following benefits:
\n
\n
Your droid has advantage on Charisma (Performance) checks.
\n
Your droid can also use its bonus action to motivate an ally within 30 feet of it. Until the start of your droid's next turn, the ally can add the droid's Charisma modifier (minimum of +1) to the first attack roll, ability check, or saving throw they make. Your droid can use this feature a number of time equal to its Charisma modifier, and it regains all expended uses after it completes a long rest.
\n
\n
Powerful Droid
\n
Prerequisite: Class V Droid Your droid count as one size larger when determining your carrying capacity and the weight you can push, drag, or lift.
\n
Powerful Grip
\n
Prerequisite: 7th level, Class V Droid When your droid hits a creature with a melee weapon attack on its turn and has a free hand, it can use a bonus action to attempt to grapple the target. If it does so, and the grapple succeeds, your droid can make one additional attack against the target (no action required).
\n
Premium Power Core
\n
You improve the power core of your droid. Its Hit Die becomes a d8.
\n
Proficiency Protocol
\n
You install a protocol in your droid that grants it proficiency in a tool or skill. Your droid gains proficiency in a tool or skill of your choice.
\n
Prototype Power Core
\n
Prerequisite: d8 Hit Die You further improve the power core of your droid. Its Hit Die becomes a d10.
\n
Repulsor Coil
\n
Prerequisite: 7th level, Class II Droid You install repulsor coils in your droid's legs. Your droid gains a flying speed equal to its walking speed.
\n
Sensor Augmentation
\n
You augment your droid with an advanced sensor, granting the following benefits:
\n
\n
Your droid has advantage on Wisdom (Perception) and Intelligence (Investigation) checks made to detect the presence of secret doors.
\n
Your droid has advantage on saving throws made to avoid or resist traps.
\n
Your droid has resistance to the damage dealt by traps.
\n
Your droid can search for traps while traveling at a normal pace, instead of only at a slow pace.
\n
\n
Stun Ray
\n
You install a stun ray in your droid. The stun ray has 1 charge. As an action, your droid can use 1 charge to cast the @Compendium[sw5e.techpowers.qHu258wCccbyajwo]{Hold Droid} or @Compendium[sw5e.techpowers.zXCnz8vBWC4fhvfw]{Paralyze Humanoid} tech power. The saving throw is made against your droid's tech save DC (8 + your droid's proficiency bonus + your droid's Intelligence modifier).
\n
You can choose this modification multiple times. Each time you do so, the stun ray gains another charge, to a maximum of 3. The stun ray regains all expended charges after a long rest.
\n
Techcasting Protocol
\n
Your droid learns two at-will tech powers, and one 1st-level tech power, which it casts at its lowest level. Once your droid casts it, your droid must finish a long rest before it can cast it again. Intelligence is your droid's techcasting ability for these powers. It does not require use of a wristpad for these powers.
\n
Toughness Module
\n
Prerequisite: 11th level Prerequisite: Durability Module You modify the durability module in your droid, granting the following benefit:
\n
\n
Your droid becomes proficient in Constitution saving throws. If it is already proficient, it becomes proficient in another saving throw of your choice.
\n
Whenever your droid takes the Dodge action in combat, it can spend one Hit Die to heal itself. Roll the die, add its Constitution modifier, and it regains a number of hit points equal to the total (minimum of one).
Those engineers who choose the Astrotech Engineering discipline focus on utilizing their vast knowledge of droid technology to confuse, confound, and destroy enemy tech, droids and constructs.
\n
Bonus Proficiencies
\n
Astrotech Engineering: 3rd level
\n
You gain proficiency in astrotech's implements. Additionally, when you engage in crafting with astrotech's implements, the rate at which you craft doubles.
\n
Electronic Warfare Platform
\n
Astrotech Engineering: 3rd, 9th, and 17th level
\n
You learn to modify your astrotech's implements into a mobile electronic warfare platform. Over the course of a long rest, you can modify your astrotech's implements. You must have astrotech's implements in order to perform this modification.
\n
Your electronic warfare platform is enhanced, requires attunement, can only be used by you, and counts as a tech focus for your tech powers while you are attuned to it. Your electronic warfare platform has 4 modification slots, and it gains more at higher levels, as shown in the Modification Slots column of the engineer table. For each modification installed in excess of your proficiency bonus, your tech point maximum is reduced by 1. Over the course of a long rest, you can install, replace, or remove a number of modifications up to your Intelligence modifier (minimum of one).
\n
Some modification effects require saving throws. When you use such an effect from this class, the DC equals your tech save DC.
\n
Your electronic warfare platform comes equipped with electromagnetic projection and sensing systems, enabling three fields: ionizing, jamming, and targeting. As a bonus action, you can activate a field, which lasts for 1 minute, causing an effect determined by the field. Only one field can be active at a time, and you can end your field at any time on your turn, no action required. The range of your barriers increases to 15 feet at 9th level and 30 feet at 17th level. You can use these fields a combined number of times equal to your proficiency bonus, as shown in the engineer table. You regain all expended uses when you complete a long rest.
\n
Ionizing Field
\n
Whenever a droid or construct starts its turn within 5 feet of you, it gains 4 slowed levels and takes ion damage equal to half your engineer level (rounded down).
\n
Jamming Field
\n
Whenever you or a friendly creature within 10 feet of you are forced to make a saving throw by a tech power, the creature gains a bonus to the saving throw equal to your Intelligence modifier (minimum of +1).
\n
Targeting Field
\n
You and friendly creatures within 5 feet of you gain a bonus to the first ranged weapon damage rolls you make each round equal to your Intelligence modifier (minimum of+1).
\n
Potent Electromagnetism
\n
Astrotech Engineering: 3rd level
\n
Once per round, when you deal damage to a droid or construct, you can expend one use of your Potent Aptitude to deal an extra 2d6 damage to that target. The damage is the same type as the source of the damage.
\n
The damage increases when you reach certain levels in this class, increasing to 3d6 at 5th level, 5d6 at 10th level, and 8d6 at 15th level.
\n
Direct Controller
\n
Astrotech Engineering: 6th level
\n
Your mastery of droids improves your ability to manipulate them. When you cast a power that could affect only droids or constructs, and you only affect droids with the power, you can choose to treat the power as if cast at your Max Power Level.
\n
You can use this feature a number of times equal to your proficiency bonus, as shown in the engineer table. You regain all expended uses when you complete a long rest.
\n
Systems Hijack
\n
Astrotech Engineering: 14th level
\n
All droids, constructs, and creatures wearing or holding a techcasting focus within 120 feet are viable targets for any tech powers which you cast with a range of touch.
\n
Electromagnetic Burst
\n
Astrotech Engineering: 18th level
\n
As an action, you can end your field in an electromagnetic burst of power with an effect determined by the field you were generating.
\n
Once you've used this feature, you must complete a long rest before you can use it again.
\n
Ionizing Burst
\n
Choose up to 10 creatures of your choice that are within 60 feet. Each must make a Constitution saving throw. On a failed save, a target takes 14d6 ion damage and is stunned. On a success, it takes half damage and isn't stunned.
\n
Jamming Burst
\n
Choose up to 10 creatures of your choice that are within 60 feet. Once in the next minute, when a chosen creature fails a saving throw caused by a tech power or is hit by an attack power, the creature can choose to succeed on the saving throw or have the attack miss instead.
\n
Targeting Burst
\n
Choose up to 10 creatures of your choice that are within 60 feet. Each creature must succeed on a Constitution saving throw against your tech save DC or be blinded for 1d4+1 turns.
\n
Astrotech Modifications
\n
If a modification has prerequisites, you must meet them to install it. You can install the modification at the same time that you meet its prerequisites.
\n
AI Amplifier
\n
Prerequisite: 5th level
\n
You gain a +1 bonus to melee tech attack rolls. This bonus increases to +2 at 9th level and +3 at 13th level.
\n
AI Rangefinder
\n
Prerequisite: 5th level
\n
You gain a +1 bonus to ranged tech attack rolls. This bonus increases to +2 at 9th level and +3 at 13th level.
\n
Advanced Hardening
\n
Prerequisite: 15th level, Hardening
\n
You have resistance to ion damage.
\n
Advanced Grounding System
\n
Prerequisite: 15th level, Prototype Grounding System
While your jamming field is active, any hostile creature within the field must make a Constitution saving throw at the end of each of its turns to maintain concentration on the power.
While your ionizing field is active, your tech powers and class features ignore resistance to ion damage, and immunity to ion damage is instead treated as resistance from any creature within range of your field.
\n
Additionally, when you use your Ionizing Phased Array feature, you create a fourth blast.
While your targeting field is active, as an action, you can allow a number of allies within the field up to your Intelligence modifier (minimum of one) to use their reaction to make a ranged weapon attack against a single target you can see.
\n
Once you've used this feature, you must complete a short or long rest before you can use it again.
\n
Droid Restraints
\n
When you would install a restraining bolt, you can do so in half the time. Additionally, when determining the save DC of a restraining bolt you control, you can use your tech save DC, if it would be higher than the item's DC.
\n
Flashlight Attachment
\n
You affix a targeted light to your electronic warfare platform. As a bonus action, you can toggle the light on or off. While on, your electronic warfare platform sheds bright light in a 60-foot cone.
\n
Frailcasting Controller
\n
Prerequisite: 5th level
\n
You gain a +1 bonus to the tech save DC of powers you cast that require a Strength or Constitution saving throw. This bonus increases to +2 at 9th level and +3 at 13th level.
\n
Grounding System
\n
You have advantage on saving throws against lightning damage.
\n
Hacked Communications
\n
As a bonus action, you may choose any number of creatures that you can see within 60 feet of you that have commlinks, headcomms, or other such communications devices. Each creature must succeed on a Constitution saving throw or take sonic damage equal to your Intelligence modifier (minimum of one). Additionally, on a failed save, their communication devices are disabled until rebooted.
\n
Once you've used this feature, you must complete a short or long rest before you can use it again.
\n
Hardening
\n
You have advantage on saving throws against ion damage.
\n
Intelligence Core Override
\n
Prerequisite: 9th level
\n
You can cast the override interface tech power at 5th level without spending tech points.
\n
Once you've used this feature, you must complete a long rest before you can use it again.
\n
Ionizing Phased Array
\n
Prerequisite: 5th level
\n
While your ionizing field is active, as an action, you can send forth blasts of directed ionic energy. Make two ranged tech attacks against targets within the field. These attacks can target the same creature or different ones. Make separate attack rolls for each blast. The attack deals 1d6 ion damage on a hit.
\n
Jamming Phased Array
\n
While your jamming field is active, as an action, you can choose a number of creatures concentrating on a power equal to your Intelligence modifier (a minimum of one) within your field, and force them to make a Concentration saving throw. If you cause at least one creature to lose concentration on a power using this feature, you can use your reaction to make all creatures that lost concentration take ion damage equal to your Intelligence modifier.
\n
Miniaturized Repulsor Coils
\n
Your electronic warfare platform can store 20 lb., not exceeding 1 cubic foot, which does not count towards your encumbrance.
\n
Prototype Transmitter
\n
Prerequisite: 7th level
\n
You further tweak your transmitter design, extending the area of your fields. When you activate a field you may choose to double the radius of your field.
\n
Once you've used this feature, you must complete a long rest before you can use it again.
\n
Prototype Grounding System
\n
Prerequisite: 7th level, Grounding System
\n
You have immunity to the shocked condition.
\n
Prototype Jamming Phased Array
\n
Prerequisite: 7th level, Jamming Phased Array
\n
While your jamming field is active, when a creature within your field attempts to cast a tech power, you can use your reaction to cast the tech override power at 3rd level without spending tech points. When you cast this power using this feature and you make the techcasting ability check as a part of this casting, you add your proficiency bonus to the check.
\n
Once you've used this feature, you must complete a short or long rest before you can use it again.
\n
Prototype Ionizing Phased Array
\n
Prerequisite: 7th level, Ionizing Phased Array
\n
While your ionizing field is active, when you cast a tech power or use a class feature that affects other creatures within the radius of your field, you can choose a number of them equal to 1 + the power's level. The chosen creatures automatically succeed on their saving throws against the power, and they take no damage if they would normally take half damage on a successful save.
\n
Additionally, when you use your Ionizing Phased Array feature, you create a third blast.
While your targeting field is active, as an action, you can cast the scramble interface power at 3rd level without spending tech points.
\n
Once you've used this feature, you must complete a short or long rest before you can use it again.
\n
Redundant Circuits
\n
Prerequisite: 15th level
\n
You can have two fields active at a time.
\n
Rendcasting Controller
\n
Prerequisite: 5th level
\n
You gain a +1 bonus to the tech save DC of powers you cast that requires a Dexterity or Intelligence saving throw. This bonus increases to +2 at 9th level and +3 at 13th level.
\n
Sensor Scramblers
\n
Prerequisite: 5th level
\n
All creatures within 10 feet of you become undetectable to electronic sensors and cameras. Anything these creatures are wearing or carrying is also undetectable, so long as it's on the creature's person. The creatures are still visible to regular vision.
\n
Once you've used this feature, you must complete a long rest before you can use it again.
\n
Stealth Field Generator
\n
Prerequisite: 7th level
\n
You integrate a portable, personal cloaking device into your electronic warfare platform. Activating or deactivating the generator requires a bonus action and, while active, you have advantage on Dexterity (Stealth) ability checks that rely on sight. The generator lasts for 1 minute. This effect ends early if you make an attack or cast a force or tech power.
\n
Once the generator has been activated, it can't be activated again until you finish a short or long rest.
\n
Targeting Phased Array
\n
Prerequisite: 5th level
\n
While your targeting field is active, as an action, you can choose a number of creatures equal to your Intelligence modifier you can see within 60 feet (a minimum of one creature), and force them to make a Dexterity saving throw. On a failed save, all ranged weapon attacks made by allies within your field against the target have advantage until the beginning of your next turn.
\n
Truelight Attachment
\n
Prerequisite: 11th level, Flashlight Attachment
\n
You modify your electronic warfare platform with a toggle allowing you to briefly gain enhanced sight. As a bonus action, you can activate the truesight feature of your electronic warfare platform. When toggled on, for the next minute your electronic warfare platform now automatically dispel illusions and can detect invisibility, as with truesight.
\n
Once you've used this feature, you must complete a short or long rest before you can use it again.
\n
Withercasting Controller
\n
Prerequisite: 5th level
\n
You gain a +1 bonus to the tech save DC of powers you cast that requires a Wisdom or Charisma saving throw. This bonus increases to +2 at 9th level and +3 at 13th level.
\n
X-Ray Targeting
\n
Prerequisite: 5th level
\n
You tweak your sensors to find weak points in thick armor. Your weapon attacks and tech powers deal double damage against constructs.
The Cyclone Approach empowers the berserker’s ability to fight with weapons in each hand. Followers of this approach learn to move quickly to avoid attacks and can become a whirlwind of fury and steel, cleaving through hordes of enemies.
\n
Dual Wielder
\n
When you choose this approach at 3rd level, when you engage in Two-Weapon Fighting, you can add your Strength or Dexterity modifier (your choice) to the damage of your Two-Weapon Fighting attack as long as it doesn’t already include that modifier.
\n
Double Swing
\n
Also at 3rd level, once on each of your turns when you miss with an attack while raging, you can immediately make a melee attack with the weapon in your other hand.
\n
Twisting Winds
\n
At 6th level, your unpredictable movement makes you harder to hit and pin down. When you make a saving throw or ability checks to avoid being knocked prone, pushed, grappled, or restrained, it gains a bonus equal to your Strength or Dexterity modifier (your choice) as long as it doesn’t already include that modifier.
\n
Mighty Leap
\n
Starting at 10th level, the distance you can jump is doubled, and you do not provoke attacks of opportunity if you leave a hostile creature’s reach while jumping.
\n
Tornado
\n
At 14th level, you can become a tornado of attacks. When you take the Attack action on your turn, you can forgo one of your regular attacks to make a melee attack against any number of creatures within 5 feet of you, with a separate attack roll for each target. If you are wielding a separate melee weapon in each hand, each successful hit against a target deals damage equal to the damage dice of both weapons + your ability modifier + any other modifiers.
\n
You can use this feature a number of times equal to your Strength modifier (a minimum of once). You regain all expended uses when you finish a short or long rest.
Many academics develop an affinity for nature, studying the vast fauna that inhabit the different planets throughout the galaxy. Those scholars who choose the Zoologist Pursuit capitalize on their knowledge of animals, developing a strong bond with a companion with whom they gain an advantage on the battlefield.
\n
Wilderness Expert
\n
When you choose this pursuit at 3rd level, you gain proficiency your choice of Animal Handling or Nature skills. Additionally, when you make a Wisdom (Animal Handling) check, you gain a bonus to the check equal to your Intelligence modifier.
\n
Beast Companion
\n
Also at 3rd level, you learn to employ all the knowledge you've accumulated to forge a powerful bond with your own personal beast companion.
\n
Choose your beast, which is detailed at the end of this pursuit. Over the course of 8 hours, which can be done during a long rest, you can expend 500 cr worth of herbs and food to call forth an animal from the wilderness to serve as your companion.
\n
If your beast dies, or you want to bond with a different creature, you must first break the bond with your current beast companion. You may only have one beast companion at a time.
\n
Your beast gains a variety of benefits while it is bonded to you:
\n
\n
The beast obeys your commands as best it can. It acts on your turn, and you determine its actions, decisions, attitudes, and so on. If you are incapacitated or absent, your beast acts on its own.
\n
Your beast's level equals your scholar level, and for each scholar level you gain after 3rd, your beast companion gains an additional hit die and increases its hit points accordingly.
\n
Your beast has the proficiency bonus of a player character of the same level.
\n
Whenever you gain the Ability Score Improvement feature in this class, your beast's abilities also improve. Your beast can increase one ability score of your choice by 2, or it can increase two ability scores of your choice by 1. As normal, your beast can't increase an ability score above 20 using this feature unless its description specifies otherwise.
\n
While your beast is the target of your Critical Analysis feature, it gains a bonus to ability checks, armor class, attack rolls, damage rolls, and saving throws equal to half your Intelligence modifier (rounded up).
\n
\n
Additional Maneuvers
\n
Lastly at 3rd level, you gain access to new maneuvers which reflect the progress of your studies into the biology and behavior of animals. Whenever you learn a new maneuver, you can choose from any of the following as well. The maneuvers are listed in alphabetical order.
\n
Loyal Bond
\n
Whenever you are hit with an attack, you can expend one superiority die to command your companion to immediately use its reaction and move up to its speed directly towards you. If it ends this movement within 5 feet of you, roll the superiority die. Your companion takes the damage instead of you, subtracting the amount you rolled from the total.
\n
Go Get 'Em
\n
While your companion is moving, you can expend a superiority die and add 5 times the number rolled to its movement speed.
\n
Pin Down
\n
When your beast attempts to grapple or knock a creature prone, you can expend a superiority die to give it direction as long as it can see or hear you. Roll a superiority die and add it to your beast's Strength (Athletics) check.
\n
Primal Endurance
\n
As an action, you can expend a superiority die to improve your beast's defense. Roll the die and add it to your beast's AC until the beginning of your next turn.
\n
Sic 'Em
\n
As an action, you can command your beast to savage a nearby enemy. Your beast can use its reaction to immediately move up to 10 feet and make one attack, adding the superiority dice to the damage roll on a hit.
\n
Spine-Chilling Howls
\n
As an action, you can expend one superiority die to command your beast to frighten another creature. The target must then succeed on a Wisdom saving throw against your Maneuver save DC or become frightened of both you and your beast for 1 minute.
\n
Wild Senses
\n
Whenever you make a Wisdom (Perception) or a Wisdom (Survival) check, you can request the aid of your beast by expending a superiority die, adding the number rolled to the check. You can use this maneuver before or after making the ability check, but before the results of the ability check are determined.
\n
Vicious Hunting
\n
Beginning at 6th level, your beast companion's strikes count as enhanced for the purpose of overcoming resistance and immunity to unenhanced attacks and damage.
\n
Creature Comprehension
\n
Starting at 9th level, when your beast makes an attack roll, ability check, or saving throw, you may expend a superiority die and apply the benefits of a maneuver you know from this class, as if you have taken the action yourself.
\n
Feral Ferocity
\n
Once you've reached 17th level, you have learned how to push your beast beyond its limits. If your beast is within 30 feet of you and can see or hear you, you can command it to enter a furious state. While raging, your beast gains the following benefits:
\n
\n
Your beast has advantage on Strength checks and Strength saving throws if it is size Medium or larger.
\n
Your beast has advantage on Dexterity checks and Dexterity saving throws if it is size Small or smaller.
\n
When your hits with an attack, it deals bonus damage equal to your Intelligence modifier.
\n
Your beast has resistance to kinetic and energy damage.
\n
\n
Your beast's furious state lasts for 1 minute. It ends early if your beast is knocked unconscious. You can end your beast's furious state as a bonus action.
\n
Once you've used this feature, you can't use it again until you finish a long rest.
\n
Discoveries (Zoologist)
\n
When you select this pursuit, you gain access to new discoveries which reflect your studies in biology and behaviour of alien lifeforms. Whenever you learn a new discovery, you can choose from any of the following as well. The discoveries are listed in alphabetical order.
\n
Advantageous Companion
\n
When you make a Charisma (Intimidation) check against a creature that can see your beast companion, and your companion is size Medium or larger, you make the check with advantage.
\n
When you make a Charisma (Persuasion) check against a creature that can see your beast companion, and your companion is size Small or Tiny, you make the check with advantage.
\n
Colossal Companion
\n
Prerequisite: 15th level
\n
You can attempt to temporarily take control of a Huge beast. With the use of 10,000 cr worth of herbs and food, you can make a DC 15 Animal Handling check. On a success, the creature becomes your companion for 1d4 hours and gains the benefits of your Beast Companion feature. You can attempt to extend the duration by one hour by making additional Animal Handling checks. The DC for the first check is 20, and increases by 5 on each subsequent check. On a failure, the creature becomes hostile to you if it wasn't already and becomes immune to this feature for 24 hours.
\n
Holocam Attachment
\n
You have learned how to safely attach a holocam on the head of the companion. You learn the tracker droid interface tech power, and your beast becomes a valid target of this power.
\n
Neat Tricks
\n
Prerequisite: 5th level
\n
Your beast gains proficiency in one Strength or Dexterity skill of your choice. If your beast's size is Medium or larger and the chosen skill uses Strength, it has expertise in the chosen skill. If your beast's size is Small or smaller and the chosen skill uses Dexterity, it has expertise in the chosen skill.
\n
Protective Friend
\n
If a creature makes a melee attack against you or your companion, and your companion is within 5 feet of you, you can use your reaction to impose disadvantage on the attack roll.
\n
The More The Merrier
\n
Prerequisite: 7th level
\n
Whenever you attempt to call forth an animal as your companion, you can instead spend 1,000 cr worth of components and call forth a swarm of Tiny creatures. The swarm is composed of a number of creatures equal to your scholar level + your Intelligence modifier, and is size Medium. All of the creatures within the swarm act as a single creature.
\n
Generating Your Beast
\n
Choosing your beast companion is an integral part of being a Zoologist Scholar. Your beast takes a form of your choosing. Alternatively, your GM can choose what form your beast takes based on your environment.
\n
Once you've selected your type of beast, you assign your beast companion's ability scores using standard array (16, 14, 14, 12, 10, 8) as you see fit.
\n
Beast Features
\n
All beasts share the following traits.
\n
Hit Points
\n
\n
Hit Dice: 1d4 per beast companion level
\n
Hit Points at 1st Level: 4 + your beast's Constitution modifier
\n
Hit Points at Higher Levels: 1d4 (or 3) + your beast's Constitution modifier per beast level after 1st
\n
\n
Proficiencies
\n
\n
Languages: Your beast can understand simple commands spoken in two languages of your choice, as well as hand signals, but it can not speak
\n
Saving Throws: Choose one from Strength, Intelligence, or Charisma, and another from Dexterity, Constitution, or Wisdom
\n
Skills: Choose two from Acrobatics, Athletics, Intimidation, Perception, Performance, Survival, and Stealth
\n
\n
Features
\n
\n
Armor Class: 10 + your beast's Dexterity modifier
\n
Bestial Traits: Your beast companion four bestial traits of your choice. It gains an additional trait at 5th level (5), 8th level (6), 11th level (7), 14th level (8), and 17th level (9). Whenever you gain a level in this class, you can exchange one trait for another one.
\n
Natural Weapon: Your beast companion attacks with a natural weapon, such as claws or a bite. On a hit, it deals 1d4 kinetic damage.
\n
Size: Tiny
\n
Speed: 20 ft.
\n
Type: Beast
\n
\n
Bestial Traits
\n
The traits are presented in alphabetical order.
\n
Aerial
\n
Your beast companion has a flying speed equal to its walking speed, and opportunity attacks made against it have disadvantage.
\n
Amphibious
\n
Your beast companion has a swimming speed equal to its walking speed, and it can breathe air and water.
\n
Burrower
\n
Your beast companion has a burrowing speed equal to its walking speed, and it has blindsight out to 10 feet.
\n
Charger
\n
If your beast moves at least half its speed straight towards a target before making a melee attack, it deals an additional 1d8 damage on a hit.
\n
Climber
\n
Your beast companion has a climbing speed equal to its walking speed, and it has advantage on Strength saving throws and Strength (Athletics) checks that involve climbing.
\n
Darkvision
\n
Your beast companion is accustomed to low-light environments. Your beast can see in dim light within 60 feet as if it were bright light, and in darkness as if it were dim light. Your beast can't discern color in darkness, only shades of gray.
\n
Evasive
\n
Your beast companion can take the Disengage action as a bonus action.
\n
Force Adept
\n
Prerequisite: Force Sensitive Your beast companion knows one 2nd-level force power of your choice, and once per long rest it can cast it at 2nd-level without expending force points. Your beast's forcecasting ability is Wisdom or Charisma (depending on power alignment).
\n
Force Resistance
\n
Your beast companion has advantage on saving throws against force powers.
\n
Force Sensitive
\n
Your beast companion knows one 1st-level force power of your choice, and once per long rest it can cast it at 1st-level without expending force points. Your beast's forcecasting ability is Wisdom or Charisma (depending on power alignment).
\n
Grappler
\n
When your beast hits with a melee weapon attack, it can use a bonus action to attempt to grapple the target. On a success, the target is both grappled and restrained, and your beast can't attack again while it has a creature grappled.
\n
Heavy Hide
\n
Your beast companion's armor class becomes 14.
\n
Keen Hearing
\n
Your beast companion has advantage on Wisdom (Perception) checks that rely on hearing.
\n
Keen Sight
\n
Your beast companion has advantage on Wisdom (Perception) checks that rely on sight.
\n
Keen Smell
\n
Your beast companion has advantage on Wisdom (Perception) checks that rely on smell.
\n
Light Hide
\n
Your beast companion's armor class becomes 11 + it's Dexterity modifier.
\n
Medium Hide
\n
Your beast companion's armor class becomes 13 + it's Dexterity modifier, to a maximum of +2.
\n
Natural Camouflage
\n
When your beast companion attempts to hide, it can opt to not move on its turn. If it avoids moving, it is considered lightly obscured until it moves.
\n
Nimble Weapon
\n
Your beast companion can use Dexterity instead of Strength for its attack and damage rolls.
\n
Pack Tactics
\n
Your beast companion has advantage on an attack roll against a creature if at least one ally of your beast companion is within 5 feet of the creature and the ally isn't incapacitated.
\n
Pouncer
\n
If your beast moves at least half its speed straight toward a creature and hits it with a melee attack, the creature must make a Strength saving throw (DC = 8 + your beast's proficiency bonus + its Strength modifier). If the creature is larger than your beast, it makes this save with advantage. On a failed save, the creature is knocked prone, and your beast can make one additional attack against it as a bonus action.
\n
Powerful Build
\n
Your beast companion counts as one size larger when determining its carrying capacity and the weight it can push, drag, or lift.
\n
Rampager
\n
If your beast reduces a creature to 0 hit points with a melee attack on its turn, your beast and take a bonus action to move up to half its speed and make a melee attack.
\n
Ranged Weapon
\n
Your beast companion has a natural ranged weapon, such as a spitter or or tail spikes. It has a normal range of 30 feet and a long range of 90 feet, and on a hit it deal kinetic damage equal to its natural weapon damage die.
\n
Reach Weapon
\n
Your beast companion has a natural weapon with reach, such as a tail or wings. It has the reach property, and on a hit it deals kinetic damage equal to its natural weapon damage die.
\n
Size: Huge
\n
Prerequisite: Size Large Your beast companion’s size is Huge. Its hit points increase by an amount equal to its level + 1, its Hit Die becomes a d12, its natural weapon damage die becomes a d12, and its walking speed increases to 40.
\n
Size: Large
\n
Prerequisite: Size Medium Your beast companion's size is Large. Its hit points increase by an amount equal to its level + 1, its Hit Die becomes a d10, its natural weapon damage die becomes a d10, and it's walking speed increases to 35.
\n
Size: Medium
\n
Prerequisite: Size Small Your beast companion's size is Medium. Its hit points increase by an amount equal to its level + 1, its Hit Die becomes a d8, its natural weapon damage die becomes a d8, and its walking speed increases to 30.
\n
Size: Small
\n
Your beast companion's size is Small. Its hit points increase by an amount equal to its level + 1, its Hit Die becomes a d6, its natural weapon damage die becomes a d6, and it's walking speed increases to 25.
\n
Sturdy-Legged
\n
Your beast companion's long jump is up to 20 feet and its high jump is up to 10 feet, with or without a running start, and it has advantage on Strength and Dexterity saving throws made against effects that would knock it prone.
\n
Swift
\n
Your beast companion can take the Dash action as a bonus action.
\n
Tremorsense
\n
Your beast companion gains tremorsense out to 30 feet.
\n
Venomous Weapon
\n
When your beast companion deals damage to a creature, it must make a Constitution saving throw (DC = 8 + your beast's proficiency bonus + your beast's Constitution modifier) or become poisoned until the end of its next turn.
Form I, also known as Determination Form, uses wild, unpredictable attacks designed to distract and disarm their foes. Those guardians who focus on Shii-Cho Form make seemingly random, yet deliberate, attacks to knock their opponents off-balance.
\n
Form Basics
\n
When you choose this form as your focus at 3rd level, you learn the basics of the chosen form. You gain the @Compendium[sw5e.lightsaberform.rUL9jO0rPLWqOliO]{Shii-Cho Lightsaber Form}, detailed in Chapter 6 of the Player’s Handbook. If you already know this form, you can instead choose another lightsaber form. You can't take a lightsaber form option more than once, even if you later get to choose again.
\n
The Way of the Sarlaac
\n
Also at 3rd level, as a bonus action, you can enter a frenetic stance for one minute. While in this stance, the first time you hit a creature with a melee weapon attack on your turn, it has disadvantage on the next melee attack roll it makes against you before the start of your next turn. Additionally, if that creature is within 5 feet of you, it must make a Strength saving throw (DC = 8 + your proficiency bonus + your Strength or Dexterity modifier). On a failed save, it is pushed back 5 feet, and you can immediately move into the space it just vacated without provoking opportunity attacks.
\n
This effect ends early if you are incapacitated or die. Once you've used this feature, you can't use it again until you finish a long rest.
\n
Channel the Force
\n
Lastly at 3rd level, you gain the following Channel the Force option.
\n
Disarming Slash
\n
When you hit a creature with a melee weapon attack, you can expend a use of your Channel the Force (no action required) to attempt to disarm the target, forcing it to drop one item of your choice that it's holding. The creature must make a Strength saving throw. On a failed save, it drops the object you choose. If you are within 5 feet of the target, and you have a free hand, you can catch the item. Otherwise, the object lands at its feet.
\n
Unpredictable Motion
\n
Beginning at 7th level, while you are wielding a melee weapon, opportunity attacks against you are made at disadvantage.
\n
Sarlaac Sweep
\n
Starting at 15th level, when a creature moves to within 5 feet of you, you can use your reaction to make a melee weapon attack against that creature. If the attack hits, you can attempt to damage another creature within 5 feet of the original target and within your reach. If the original attack roll would hit the second creature, it takes damage equal to your Strength or Dexterity modifier (your choice). The damage is of the same type dealt by the original attack.
\n
Master of Determination
\n
At 20th level, the erratic fluidity of your movement confounds even the most determined of foes. Your Strength or Dexterity and Wisdom or Charisma scores (your choice) increase by 2. Your maximum for these scores increases by 2. Additionally, you can use your action to gain the following benefits for 1 minute:
\n
\n
You have resistance to kinetic and energy damage from unenhanced weapons.
\n
Attack rolls made against you can't have advantage.
\n
When more than one creature is within 5 feet of you, you gain a bonus to your Armor Class equal to the number of creatures within 5 feet of you, up to your Wisdom or Charisma modifier (your choice, minimum of one).
\n
When you use your Sarlaac Sweep feature, you have advantage on the attack roll, and you can apply the bonus damage to every creature within 5 feet of you.
\n
\n
This effect ends early if you are incapacitated or die. Once you've used this feature, you can't use it again until you finish a long rest.
Choose up to two willing creatures that you can see within range. Until the power ends, each targets’ speed is doubled, they gain a +2 bonus to AC, they have advantage on Dexterity saving throws, and they gain an additional action on each of their turns. That action can be used only to take the Attack (one weapon attack only), Dash, Disengage, Hide, or the Use an Object Action.
\n
When the power ends, each target can’t move or take actions until after its next turn, as a wave of lethargy sweeps over it.
\n
Force Potency. When you cast this power using a force slot of 8th-level or higher, you can target one additional creature for each slot level above 7th.
Terrifying darkness spreads from a point you choose within range to fill a 60-foot-radius sphere until the power ends. The darkness spreads around corners. A creature with darkvision can’t see through this darkness. Unenhanced light, as well as light created by powers of 8th level or lower, can’t illuminate the area.
\n
Shrieks, gibbering, and mad laughter can be heard within the sphere. Whenever a creature starts its turn in the sphere, it must make a Wisdom saving throw, taking 8d8 psychic damage on a failed save, or half as much damage on a successful one.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":"Have Shroud of Darkenss"},"duration":{"value":10,"units":"minute"},"target":{"value":60,"units":"ft","type":"radius"},"range":{"value":150,"long":null,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"ability":"","actionType":"save","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["8d8","psychic"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":8,"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":"none","formula":""},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"consume":{"type":"","target":"","amount":null}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Maddening%20Darkness.webp","effects":[]}
{"_id":"2MaAEt5XSnjEurWK","name":"Valor","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
Prerequisite: Resistance
\n
You bless up to three creatures of your choice within range. Whenever a target makes an attack roll or a saving throw before the power ends, the target can roll a d4 and add the number rolled to the attack roll or saving throw.
\n
Force Potency. When you cast this power using a force slot of 2nd level or higher, you can target one additional creature for each slot level above 1st.
You use the Force to control your body's functions. For the duration, you gain the following benefits:
\n
\n
You ignore the effects of any levels of exhaustion you have.
\n
You do not need to eat, drink, or sleep. You can't be forced to sleep by any means. To gain the benefits of a long rest, you can spend all 8 hours doing light activity, such as reading and keeping watch.
\n
\n
If you still have any levels of exhaustion when this power ends, you must make a DC 15 Constitution saving throw. On a failed save, you gain one level of exhaustion.
","chat":"","unidentified":""},"requirements":"","source":"EC","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":8,"units":"hour"},"target":{"value":null,"width":null,"units":"","type":""},"range":{"value":null,"long":null,"units":"self"},"uses":{"value":"0","max":"0","per":""},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":2,"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":""}},"flags":{"core":{"sourceId":"Item.ROvBWSja1cjiDOO0"}},"img":"systems/sw5e/packs/Icons/Force%20Powers/Wakefulness.webp","effects":[],"_id":"2obXjKljRPeuoqcl"}
{"_id":"3IoaQSSoAtFsoavO","name":"Master Force Barrier","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
Prerequisite: Improved Force Barrier
\n
This power massively bolsters your allies with toughness and resolve. Creatures of your choice in a 30-foot radius around you when you cast this power gain the following benefits:
\n
\n
The creature sheds dim light in a 5-foot radius.
\n
The creature has advantage on all saving throws
\n
Other creatures have disadvantage on attack rolls against them.
\n
When a dark side creature hits them with a melee attack, that creature must make a Constitution saving throw or be blinded until the power ends.
Choose one or more creatures or objects not being worn or carried within 60 feet that weigh up to a combined total of 15 pounds. The creatures or objects immediately move 60 feet in a direction of your choice. If the creatures or objects end this movement in the air, they immediately fall to the ground. If the creatures or objects collide with any one target during its travel, both the creatures or objects and the target take 3d8 kinetic damage. If the target is a creature, it must make a Dexterity saving throw. On a failed save, it takes 3d8 kinetic damage, or half as much on a successful one.
\n
Force Potency. When you cast this power using a force slot of 2nd level or higher, the maximum weight increases by 15 pounds and the damage increases by 1d8 for each slot level above 1st.
Drawing on the deepest fears of a group of creatures, you create illusory creatures in their minds, manifesting their worst nightmares as an implacable threat visible only to them. Each creature in a 30-foot-radius sphere is frightened for the duration of the power. At the end of each of the frightened creature’s turns, it must succeed on a Wisdom saving throw or take 5d10 psychic damage. On a successful save, the power ends for that creature. This power has no effect on droids or constructs.
You touch a willing creature and put it into a cataleptic state that is indistinguishable from death.
\n
For the power’s duration, or until you use an action to touch the target and dismiss the power, the target appears dead to all outward inspection and to powers used to determine the target’s status. The target is blinded and incapacitated, and its speed drops to 0. The target has resistance to all damage except psychic damage. If the target is diseased or poisoned when you cast the power, or becomes diseased or poisoned while under the power’s effect, the disease and poison have no effect until the power ends. This power has no effect on droids or constructs.
You return a dead creature you touch to life, provided that it has been dead no longer than 10 minutes. If the creature’s soul is both willing and at liberty to rejoin the body, the creature returns to life with 1 hit point.
\n
This power also neutralizes any poisons and cures diseases that affected the creature at the time it died.
\n
This power closes all mortal wounds, but it doesn’t restore missing body parts. If the creature is lacking body parts or organs integral for its survival, its head for instance, the power automatically fails.
\n
Coming back from the dead is an ordeal. The target takes a -4 penalty to all attack rolls, saving throws, and ability checks. Every time the target finishes a long rest, the penalty is reduced by 1 until it disappears.
You project a phantasmal image of a creature’s worst fears. Each creature in a 30-foot cone must succeed on a Wisdom saving throw or drop whatever it is holding and become frightened for the duration. This power has no effect on constructs or droids.
\n
While frightened by this power, a creature must take the Dash action and move away from you by the safest available route on each of its turns, unless there is nowhere to move. If the creature ends its turn in a location where it doesn’t have line of sight to you, the creature can make a Wisdom saving throw. On a successful save, the power ends for that creature.
Choose a point you can see on the ground within range. A fountain of churned earth and stone erupts in a 20-foot cube centered on that point. Each creature in that area must make a Dexterity saving throw. A creature takes 3d12 kinetic damage on a failed save, or half as much damage on a successful one. Additionally, the ground in that area becomes difficult terrain until cleared. Each 5-foot-square portion of the area requires at least 1 minute to clear by hand.
\n
Force Potency. When you cast this power using a force slot of 4th level or higher, the damage increases by 1d12 for each slot level above 3rd.
Choose a point you can see on the ground within range. A fountain of churned earth and stone erupts in a 20-foot cube centered on that point. Each creature in that area must make a Dexterity saving throw. A creature takes 3d12 kinetic damage on a failed save, or half as much damage on a successful one. Additionally, the ground in that area becomes difficult terrain until cleared. Each 5-foot-square portion of the area requires at least 1 minute to clear by hand.
\n
Force Potency. When you cast this power using a force slot of 4th level or higher, the damage increases by 1d12 for each slot level above 3rd.
You select a weapon or object being worn or carried by a Large or smaller creature within range. The creature must make a Strength or Dexterity saving throw (the creature chooses the ability to use). If the item is being worn, this save is made with disadvantage. On a failed save, the creature takes 1d4 force damage and the item is pulled directly to you. If you have a free hand, you catch the weapon. Otherwise, it lands at your feet.
\n
This power’s damage increases by 1d4 when you reach 5th level (2d4), 11th level (3d4), and 17th level (4d4).
You stir the Force around you, creating a turbulent field of telekinetic energy that buffets enemies around you. The field extends out to a distance of 15 feet around you for the duration.
\n
When you cast this power, you can designate any number of creatures you can see to be unaffected by it. An affected creature’s speed is halved in the area, and when the creature enters the area for the first time on a turn or starts its turn there, it must make a Constitution saving throw. On a failed save, the creature takes 3d8 force damage. On a successful save, the creature takes half as much damage.
\n
Force Potency. When you cast this power using a force power slot of 4th level or higher, the damage increases by 1d8 for each slot level above 3rd.
Your power with the Force deepens a creature’s understanding of its own talent. You touch one willing creature and give it expertise in one skill of your choice; until the power ends, the creature doubles its proficiency bonus for ability checks it makes that use the chosen skill.
\n
You must choose a skill in which the target is proficient and that isn’t already benefiting from an effect, such as Expertise, that doubles its proficiency bonus.
You touch one willing creature. Once before the power ends, the target can roll a d4 and add the number rolled to one ability check of its choice. It can roll the die before or after making the ability check. The power then ends.
You forge a telepathic link among up to eight willing creatures of your choice within range, psychically linking each creature to all the others for the duration. Droids, constructs, and creatures with Intelligence scores of 2 or less aren’t affected by this power.
\n
Until the power ends, the targets can communicate telepathically through the bond whether or not they have a common language. The communication is possible over any distance, though it can’t extend beyond a single planet.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":1,"units":"hour"},"target":{"value":8,"units":"","type":"creature"},"range":{"value":30,"long":null,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"consume":{"type":"","target":"","amount":null},"ability":null,"actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":5,"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":true},"scaling":{"mode":"none","formula":""}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Force%20Meld.webp","effects":[]}
{"_id":"CJR5SlWKoaCtY1bq","name":"Spare the Dying","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
You touch a living creature that has 0 hit points. The creature becomes stable. This power has no effect on droids or constructs.
You establish a telepathic link with one willing humanoid you touch. Until the power ends, whenever you and the target can see each other, each of you can communicate with the other via telepathy.
\n
You don’t need to share a language with a creature for it to understand your telepathic utterances, and the creature understands you even if it lacks a language. The creature can respond to you telepathically as well, but it must understand at least one language in order to communicate this way.
\n
Force Potency. When you cast this power using a force slot of 3rd level or higher, the duration increases to Concentration, up to 1 hour, and if either you or the creature you are linked to are surprised, while both of you can see each other, the surprised creature can still act normally during the surprise round, as if it were not surprised.
Each creature in a 30-foot cube within range must make a Wisdom saving throw. On a failed save, the creature becomes charmed for the duration. While charmed by this power, the creature is incapacitated and has a speed of 0.
\n
The power ends for an affected creature if it takes any damage or if someone else uses an action to shake the creature out of its stupor. This power has no effect on droids or constructs.
As a part of the action used to cast this power, you must make a ranged force attack with a lightweapon or vibroweapon against one target within the power’s range, otherwise the power fails. On a hit, the target takes 6d8 damage of the same type as the weapon’s damage and must make a Constitution saving throw against an additional effect depending on your choice of casting ability:
\n
Wisdom. The target takes an additional 4d6 force damage and it gains four levels of slowed until the end of its next turn. On a success, the target takes half as much damage and its speed isn’t reduced.
\n
Charisma. The target takes an additional 4d6 necrotic damage and cannot regain hit points until the end of its next turn. On a success, the target takes half as much damage and its healing capability is unaffected.
\n
The weapon then immediately returns to your hand.
\n
Force Potency. When you cast this power using a force slot of 6th level or higher, the force or necrotic damage increases by 1d6 for each slot above 5th.
You cause a tremor in the ground within range. Each creature other than you in a 5-foot-radius sphere centered on that point must make a Dexterity saving throw. On a failed save, a creature takes 1d6 kinetic damage and is knocked prone. On a successful save, the creature takes half as much damage and isn’t knocked prone. If the ground in that area is loose earth or stone, it becomes difficult terrain until cleared, with each 5-foot-diameter portion requiring at least 1 minute to clear by hand.
\n
Force Potency. When you cast this power using a force slot of 2nd level or higher, the damage increases by 1d6 for each slot level above 1st.
In response to being attacked, you raise your weapon to attempt to deflect. When you you use this power, the damage you take from the attack is reduced by 1d6. If you reduce the damage to 0, you’re wielding a lightweapon or vibroweapon, and the damage is energy or ion, you can reflect the attack at a target within range as part of the same reaction. Make a ranged force attack at a target you can see. The attack has a normal range of 20 feet and a long range of 60 feet. On a hit, the target takes the triggering attack’s normal damage.
\n
If you would have resistance to the triggering damage, resistance is applied before the damage reduction.
\n
The power’s damage reduction increases by 1d6 when you reach 5th level (2d6), 11th level (3d6), and 17th level (4d6).
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"reaction","cost":1,"condition":"which you take in response to being hit by a ranged attack"},"duration":{"value":null,"units":"inst"},"target":{"value":null,"units":"","type":"self"},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":"0","per":""},"ability":"","actionType":"other","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"1d6","save":{"ability":"","dc":null,"scaling":"power"},"level":0,"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":"atwill","formula":"1d6"},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"consume":{"type":"","target":"","amount":null}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Saber%20Reflect.webp","effects":[]}
+{"name":"Tapas","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"power","data":{"description":{"value":"
You use the Force to inure yourself to the elements. For the duration, you are considered adapted to hot and cold climates.
You unleash the power of your mind to blast the intellect of up to ten creatures of your choice that you can see within range. Creatures that have an Intelligence score of 2 or lower are unaffected.
\n
Each target must make an Intelligence saving throw. On a failed save, a target takes 14d6 psychic damage and is stunned. On a successful save, a target takes half as much damage and isn’t stunned.
\n
A stunned target can make a Wisdom saving throw at the end of each of its turns. On a successful save, the stunning effect ends.
Choose up to five creatures you can see within range. Make a melee force attack against each one. On hit, a target takes 6d10 force damage. You can then teleport to an unoccupied space you can see within 5 feet of one of the creatures you chose.
You exude an aura out to 5 feet that boosts the morale and overall battle prowess you and your allies while simultaneously reducing the opposition’s combat-effectiveness by eroding their will to fight.
\n
Whenever you or a friendly creature within your meditation makes an attack roll or a saving throw, they can roll a d4 and add the number rolled to the attack roll or saving throw.
\n
Whenever a hostile creature enters your meditation or starts its turn there, it must make a Charisma saving throw. On a failed save, it must roll a d4 and subtract the number rolled from each attack roll or saving throw it makes before the end of your next turn. On a successful save, it is immune to this power for 1 day.
Until the power ends, your movement doesn’t provoke opportunity attacks.
\n
Once before the power ends, you can give yourself advantage on one weapon attack roll on your turn. That attack deals an extra 1d8 force damage on a hit. Whether you hit or miss, your walking speed increases by 30 feet until the end of that turn.
You unleash a blast of psychic energy at a target within range. If the target can hear you (though it need not understand you), it must succeed on an Intelligence saving throw. On a failed save, it takes 3d6 psychic damage and must immediately use its reaction, if available, to move as far as its speed allows away from you. The creature doesn’t move into obviously dangerous ground, such as a fire or a pit. On a successful save, the target takes half as much damage and doesn’t have to move away. A deafened creature automatically succeeds on the save.
\n
Force Potency. When you cast this power using a force slot of 2nd level or higher, the damage increases by 1d6 for each slot level above 1st.
Choose a creature that you can see within range. The target must succeed on a Wisdom saving throw or be paralyzed for the duration. At the end of each of its turns, the target can make another Wisdom saving throw. On a success, the power ends on the target. This power has no effect on droids or constructs.
\n
Force Potency. When you cast this power using a force slot of 6th level or higher, you can target an additional creature for each slot level above 5th. The creatures must be within 30 feet of each other when you target them.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":1,"units":"minute"},"target":{"value":1,"units":"","type":"creature"},"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":"wis","dc":null,"scaling":"power"},"level":5,"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":"level","formula":"1 additional creature"},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"consume":{"type":"","target":"","amount":null}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Stasis.webp","effects":[]}
-{"_id":"HPtgWP83jKSyFWFp","name":"Aura of Purity","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
Prerequisite: Restoration
\n
Purifying energy radiates from you in a 30-foot radius. Until the power ends, the aura moves with you, centered on you. Each nonhostile creature in the aura (including you) can’t become diseased, has resistance to poison damage, and has advantage on saving throws against effects that cause any of the following conditions: blinded, charmed, deafened, frightened, paralyzed, poisoned, and stunned.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":10,"units":"minute"},"target":{"value":30,"units":"ft","type":"radius"},"range":{"value":null,"long":null,"units":"self"},"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":4,"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/Aura%20of%20Purity.webp","effects":[]}
+{"_id":"HPtgWP83jKSyFWFp","name":"Aura of Purity","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
Prerequisite: Restoration
\n
Purifying energy radiates from you in a 30-foot radius. Until the power ends, the aura moves with you, centered on you. Each nonhostile creature in the aura (including you) can’t become diseased, has resistance to poison damage, and has advantage on saving throws against effects that cause any of the following conditions: blinded, charmed, deafened, frightened, paralyzed, poisoned, and stunned.
In response to being attacked, you attempt to deflect the attack with the Force. When you use this power, the damage you take from the attack is reduced by 1d10. If you reduce the damage to 0 and the damage is energy, force, ion, kinetic, lightning, necrotic, or sonic, you can reflect the attack at a target within range as part of the same reaction. Make a ranged force attack at a target you can see. The attack has a normal range of 30 feet and a long range of 90 feet. On a hit, the target takes the triggering attack’s normal damage.
\n
Force Potency. When you cast this power using a force slot of 2nd level or higher, the damage reduction increases by 1d10 for each slot level above 1st.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"reaction","cost":1,"condition":"which you take in response to being hit by a ranged attack"},"duration":{"value":null,"units":""},"target":{"value":null,"units":"","type":"self"},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":"0","per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"rpak","attackBonus":"0","chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"1d10","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":"1d10"}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Force%20Reflect.webp","effects":[]}
{"_id":"HqxcYlFOZJZ91a98","name":"Precognition","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
Prerequisite: Danger Sense
\n
Your mastery of the Force gives you a limited ability to see into the immediate future. For the duration, you can’t be surprised and you have advantage on attack rolls, ability checks, and saving throws. Additionally, other creatures have disadvantage on attack rolls against you for the duration.
Until the end of your next turn, you can use your forcecasting ability score instead of your Strength score when you jump, and always count as having made a running start before jumping.
Lightning arcs from your hands. Each creature in a 60-foot cone must make a Dexterity saving throw. A creatures takes 12d6 lightning damage on a failed save, or half as much on a successful one.
\n
Force Potency. When you cast this power using a force slot of 8th level or higher, the damage increases by 2d6 for each slot level above 7th.
You attune your senses to pick up the emotions of others for the duration. When you cast the power, and as your action on each turn until the power ends, you can focus your senses on one humanoid you can see within 30 feet of you. You instantly learn the target’s prevailing emotion, whether it’s love, anger, pain, fear, calm, or something else. If the target isn’t actually humanoid or it is immune to being charmed, you sense that it is calm.
For the duration, you sense the use of the Force, or its presence in an inanimate object within 30 feet of you. If you sense the Force in this way, you can use your action to determine the direction from which it originates and, if it’s in line of sight, you see a faint aura around the person or object from which the Force emanates.
\n
Force Potency. When you cast this power using a 3rd-level force slot, the range increases to 60 feet. When you use a 5th-level force slot, the range increases to 500 feet. When you use a 7th-level force slot, the range increases to 1 mile. When you use a 9th-level force slot, the range increases to 10 miles.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":10,"units":"minute"},"target":{"value":null,"units":"","type":"self"},"range":{"value":30,"long":null,"units":"ft"},"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":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/Sense%20Force.webp","effects":[]}
-{"_id":"OGLh7pBroWR6te2k","name":"Armor of Abeloth","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
A protective force surrounds you, manifesting as shimmering light that covers you and your gear. You gain 5 temporary hit points for the duration. If a creature hits you with a melee attack while you have these hit points, the creature takes 5 psychic damage.
\n
Force Potency. When you cast this power using a force slot of 2nd level or higher, both the temporary hit points and the psychic damage increase by 5 for each slot.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":1,"units":"hour"},"target":{"value":null,"units":"","type":"self"},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":"0","per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":1,"school":"drk","components":{"value":"","concentration":false},"materials":{"value":"","consumed":false,"cost":0,"supply":0},"preparation":{"mode":"prepared","prepared":false},"scaling":{"mode":"none","formula":""},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Armor%20of%20Abeloth.webp","effects":[]}
+{"_id":"OGLh7pBroWR6te2k","name":"Armor of Abeloth","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
A protective force surrounds you, manifesting as shimmering light that covers you and your gear. You gain 5 temporary hit points for the duration. If a creature hits you with a melee attack while you have these hit points, the creature takes 5 psychic damage.
\n
Force Potency. When you cast this power using a force slot of 2nd level or higher, both the temporary hit points and the psychic damage increase by 5 for each slot.
You compel one creature you can see within range to die instantly. If the creature you choose has 100 hit points or fewer, it dies. Otherwise, the power has no effect.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":"Have Ruin Power"},"duration":{"value":null,"units":"inst"},"target":{"value":1,"units":"","type":"creature"},"range":{"value":60,"long":null,"units":"ft"},"uses":{"value":0,"max":"0","per":""},"ability":"","actionType":"other","attackBonus":0,"chatFlavor":"Have over 100 HP left or Die!","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":9,"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/Kill.webp","effects":[]}
{"_id":"Oxb3dpusa4SmIKQd","name":"Improved Battle Meditation","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
Prerequisite: Battle Meditation
\n
You exude an aura out to 15 feet that boosts the morale and overall battle prowess you and your allies while simultaneously reducing the opposition’s combat-effectiveness by eroding their will to fight.
\n
Whenever you or a friendly creature within your meditation makes an attack roll or a saving throw, they can roll a d6 and add the number rolled to the attack roll or saving throw.
\n
Whenever a hostile creature enters your meditation or starts its turn there, it must make a Charisma saving throw. On a failed save, it must roll a d6 and subtract the number rolled from each attack roll or saving throw it makes before the end of your next turn. On a successful save, it is immune to this power for 1 day.
You shift your vision to see through use of the Force; colors fade and inanimate objects appear as shades of gray. You gain the following benefits.
\n
\n
Living things glow with the power of the Force. Those with an affinity for the light side glow blue, those with an affinity for the dark side glow red, and those with no attunement to either side of the Force glow yellow. How bright they glow is determined by how strong their connection to the Force is.
\n
You gain blindsight to 30 feet.
\n
You have advantage on Wisdom (Perception) checks that rely on sight against living targets within 30 feet.
This power assaults and twists creatures’ minds, spawning delusions and provoking uncontrolled action. Each creature in a 30-foot-radius sphere centered on you must succeed on a Wisdom saving throw when you cast this power or be affected by it.
\n
An affected target can’t take reactions and must roll a d8 at the start of each of its turns to determine its behavior for that turn. This power has no effect on constructs or droids.
\n
\n\n
\n
d8
\n
Behavior
\n
\n
\n
1
\n
The creature uses all its movement to move in a random direction. To determine the direction, roll a d8 and assign a direction to each die face. The creature doesn’t take an action this turn.
\n
\n
\n
2-6
\n
The creature doesn’t move or take actions this turn.
\n
\n
\n
7-8
\n
The creature uses its action to make a melee attack against a randomly determined creature within its reach. If there is no creature within its reach, the creature does nothing this turn.
\n
\n\n
\n
At the end of each of its turns, an affected target can make a Wisdom saving throw. If it succeeds, this effect ends for that target.
\n
Force Potency. When you cast this power using a power slot of 6th level or higher, the radius of the sphere increases by 5 feet for each force slot level above 5th.
Until the power ends or you use an action to dismiss it, you can disguise yourself through use of the Force in many ways. You can appear to be shorter or taller by about a foot and change the appearance of your body and weight, but you cannot change the basic structure of your body. This effect can include your clothes, weapons, and other belongings on your person.
\n
This effect is only visual, so any sort of physical contact will only interact with the real size and shape of you. A creature that uses its action to examine you can identify this effect with a successful Intelligence (Investigation) check against your force save DC. This power has no effect on droids or constructs.
You put your faith in the Force, feeling out the future and seeing whether your actions will lead to fortune or ruin. The GM chooses from the following possible omens:
\n
\n
Peace, for results which are not dangerous
\n
Danger, for results which are dangerous but perhaps still worth the danger
\n
Ruin, for results which are certain to end in death or tragedy
\n
\n
The power doesn’t take into account any possible circumstances that might change the outcome, such as the use of additional powers or the loss or gain of a companion.
\n
If you use this power two or more times before completing your next long rest, there is a cumulative 25 percent chance for each casting after the first that you get a neutral result regardless of the actual outcome.
You select a melee weapon you wield, or one melee weapon within range that is not worn or carried by a conscious creature, and use the Force to cause it to levitate, acting as an extension of your will for the duration or until you cast this power again. When you use this power, you can cause the weapon to move up to 20 feet and make a melee force attack against a creature within 5 feet of it. On a hit, the target takes 1d8 + your forcecasting ability modifier damage. The type is of the normal damage dealt by the weapon.
\n
While the weapon is animated, on each of your turns you can use a bonus action to move the weapon up to 20 feet and repeat the attack against a creature within 5 feet of it. At any time, you can end this force power to return the animated weapon to your hand.
\n
An enemy can attempt to gain control of the weapon by using its action to make a Strength (Athletics) check against your force save DC. On a success, the creature gains control of the weapon and the power ends.
\n
Force Potency. When you cast this power using a force slot of 3rd level or higher, the weapon’s damage increases by 1d8 for every two slot levels above 2nd.
You select a melee weapon you wield, or one melee weapon within range that is not worn or carried by a conscious creature, and use the Force to cause it to levitate, acting as an extension of your will for the duration or until you cast this power again. When you use this power, you can cause the weapon to move up to 20 feet and make a melee force attack against a creature within 5 feet of it. On a hit, the target takes 1d8 + your forcecasting ability modifier damage. The type is of the normal damage dealt by the weapon.
\n
While the weapon is animated, on each of your turns you can use a bonus action to move the weapon up to 20 feet and repeat the attack against a creature within 5 feet of it. At any time, you can end this force power to return the animated weapon to your hand.
\n
An enemy can attempt to gain control of the weapon by using its action to make a Strength (Athletics) check against your force save DC. On a success, the creature gains control of the weapon and the power ends.
\n
Force Potency. When you cast this power using a force slot of 3rd level or higher, the weapon’s damage increases by 1d8 for every two slot levels above 2nd.
You attempt to trap the mind of your target in a psychic cage. The target must make a Charisma saving throw. On a failed save, the creature’s mind is trapped. It can think, but it can’t have any contact with or perceive the outside world. If the creature takes damage, it makes another Charisma save. On a success, the power ends. This power has no effect on droids or constructs.
\n
Force Potency. When you cast this power using a force slot of 6th level or higher, after 1 minute of concentration the power’s duration becomes 24 hours and it no longer requires your concentration.
Up to three creatures of your choice that you can see within range must make Charisma saving throws. Whenever a target that fails this saving throw makes an attack roll or a saving throw before the power ends, the target must roll a d4 and subtract the number rolled from the attack roll or saving throw.
\n
Force Potency.When you cast this power using a force slot of 2nd level or higher, you can target one additional creature for each slot level above 1st.
Choose one creature, object, or force effect within range. Any force power of 3rd level or lower on the target ends. For each force power of 4th level or higher on the target, make an ability check using your forcecasting ability. The DC equals 10 + the power’s level. On a success, the power ends.
\n
Force Potency. When you cast this power using a force slot of 4th level or higher, you automatically end the effects of a force power on the target if the power’s level is equal to or less than the level of the force slot you used.
This power absorbs damage from incoming energy attacks, lessening its effect on you and distributing it throughout your body. You have resistance to the triggering damage type until the start of your next turn. Also, you gain 5 temporary hit points to potentially absorb the attack. These temporary hit points last until the start of your next turn.
\n
Force Potency. When you cast this power using a force slot of 2nd level or higher, the temporary hit points increases by 5 for each slot level above 1st.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"reaction","cost":1,"condition":"which you take when you take cold, energy, fire, ion, lightning, or sonic damage"},"duration":{"value":1,"units":"round"},"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 Temp HP"},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"consume":{"type":"","target":"","amount":null}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Disperse%20Force.webp","effects":[]}
{"_id":"ecDdTd9MW0z4h8Hb","name":"Sap Vitality","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
Make a melee force attack against a creature you can reach. On a hit, the target takes 3d10 necrotic damage.
\n
Force Potency. When you cast this power using a force slot of 2nd level or higher, the damage increases by 1d10 for each slot level above 1st.
You make a calming gesture, and up to three willing creatures of your choice that you can see within range fall unconscious for the power’s duration. The power ends on a target early if it takes damage or someone uses an action to shake or slap it awake. If a target remains unconscious for the full duration, that target gains the benefit of a short rest, and it can’t be affected by this power again until it finishes a long rest.
\n
Force Potency. When you cast this power using a force slot of 4th level or higher, you can target one additional willing creature for each slot level above 3rd.
A 5-foot-diameter sphere of compressed lightning appears in an unoccupied space of your choice within range and lasts for the duration. Any creature that ends its turn within 5 feet of the sphere must make a Dexterity saving throw. The creature takes 2d6 lightning damage on a failed save, or half as much damage on a successful one.
\n
As a bonus action, you can move the sphere up to 30 feet. If you ram the sphere into a creature, that creature must make a Dexterity saving throw, taking 2d6 kinetic damage on a failed save or half as much damage on a successful one, and the sphere stops moving this turn.
\n
When you move the sphere, you can direct it over barriers up to 5 feet tall and jump it across pits up to 10 feet wide. The sphere ignites flammable objects not being worn or carried, and it sheds bright light in a 20-foot radius and dim light for an additional 20 feet.
\n
Force Potency. When you cast this power with a force slot of 3rd level or higher, both the lightning and kinetic damage increase by 1d6 for each slot level above 2nd.
An immobile, faintly shimmering barrier springs into existence around you and remains for the duration. The barrier moves with you. Any force power of 3rd level or lower cast from outside the barrier can’t affect you, even if the power is cast using a higher level force slot. Such a power can target you, but the power has no effect on you. Similarly, the area within the barrier is excluded from the areas affected by such powers.
\n
Force Potency. When you cast this power using a force slot of 5th level or higher, the barrier blocks powers of one level higher for each slot level above 4th.
You create a seismic disturbance at a point on the ground that you can see within range. For the duration, an intense tremor rips through the ground in a 100-foot-radius circle centered on that point and shakes creatures and structures in contact with the ground in that area.
\n
The ground in the area becomes difficult terrain. Each creature on the ground that is concentrating must make a Constitution saving throw. On a failed save, the creature’s concentration is broken.
\n
When you cast this power and at the end of each turn you spend concentrating on it, each creature on the ground in the area must make a Dexterity saving throw. On a failed save, the creature is knocked prone.
\n
This power can have additional effects depending on the terrain in the area, as determined by the GM.
\n
Fissures. Fissures open throughout the power’s area at the start of your next turn after you cast the power. A total of 1d6 such fissures open in locations chosen by the GM. Each is 1d10 x 10 feet deep, 10 feet wide, and extends from one edge of the power’s area to the opposite side. A creature standing on a spot where a fissure opens must succeed on a Dexterity saving throw or fall in. A creature that successfully saves moves with the fissure’s edge as it opens.
\n
A fissure that opens beneath a structure causes it to automatically collapse (see below).
\n
Structures. The tremor deals 50 kinetic damage to any structure in contact with the ground in the area when you cast the power and at the start of each of your turns until the power ends. If a structure drops to 0 hit points, it collapses and potentially damages nearby creatures. A creature within half the distance of a structure’s height must make a Dexterity saving throw. On a failed save, the creature takes 5d6 kinetic damage, is knocked prone, and is buried in the rubble, requiring a DC 20 Strength (Athletics) check as an action to escape. The GM can adjust the DC higher or lower, depending on the nature of the rubble. On a successful save, the creature takes half as much damage and doesn’t fall prone or become buried.
You touch one willing creature. Once before the power ends, the target can roll a d4 and add the number rolled to one saving throw of its choice. It can roll the die before or after the saving throw. The power then ends.
You attempt to suppress strong emotions in a group of people. Each humanoid in a 20-foot-radius sphere centered on a point you choose within range must make a Charisma saving throw a creature can choose to fail this saving throw if it wishes. If a creature fails its saving throw, choose one of the following two effects.
\n
\n
You can suppress any effect causing a target to be charmed or frightened. When this power ends, any suppressed effect resumes, provided that its duration has not expired in the meantime.
\n
You can make a target indifferent about creatures of your choice that it is hostile toward. This indifference ends if the target is attacked or harmed by a power or if it witnesses any of its friends being harmed.
\n
\n
When the power ends, the creature becomes hostile again, unless the GM rules otherwise.
A beam of Force energy flashes out from your hand in a 5-foot-wide, 60-foot-long line. Each creature in the line must make a Constitution saving throw. On a failed save, a creature takes 8d6 force damage and is knocked prone. On a successful save, it takes half as much damage and isn’t knocked prone.
\n
You can create a new telekinetic gust as your action on your turn until the power ends.
\n
Force Potency. When you cast this power using a force slot of 7th level or higher, the damage increases by 2d6 for each slot level above 6th.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":""},"duration":{"value":1,"units":"minute"},"target":{"value":60,"units":"ft","type":"line","width":null},"range":{"value":null,"long":null,"units":"self"},"uses":{"value":0,"max":"0","per":""},"ability":"","actionType":"save","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["8d6","force"]],"versatile":""},"formula":"","save":{"ability":"con","dc":null,"scaling":"power"},"level":6,"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":"level","formula":"2d6"},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"consume":{"type":"","target":"","amount":null}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Telekinetic%20Burst.webp","effects":[]}
{"_id":"qkBzg8ZIJpglVMvi","name":"Beacon of Hope","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
Prerequisite: Heroism
\n
This power bestows hope and vitality. Choose any number of creatures within range. For the duration, each target has advantage on Wisdom saving throws and death saving throws, and regains the maximum number of hit points possible from any healing.
As part of the action used to cast this power, you must make a melee weapon attack against one creature within your reach, otherwise the power fails. On a hit, the target suffers the attack's normal effects, and you ward yourself from it through the Force.
\n
If the target forces you to make a saving throw before the start of your next turn, the target takes an additional 1d6 psychic damage, and you can roll 1d4 and add the number rolled to your saving throw. The power then ends.
\n
The power's damage increases when you reach higher levels. At 5th level, the melee attack deals an extra 1d6 force damage to the target, and the psychic damage the target takes for forcing you to make a saving throw increases to 2d6. Both damage rolls increase by 1d6 at 11th level and 17th level.
","chat":"","unidentified":""},"requirements":"","source":"EC","activation":{"type":"action","cost":1,"condition":"you must make a melee weapon attack against one creature within your reach, otherwise the power fails"},"duration":{"value":1,"units":"round"},"target":{"value":1,"width":null,"units":"","type":"creature"},"range":{"value":null,"long":null,"units":""},"uses":{"value":"0","max":"0","per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"mwak","attackBonus":"0","chatFlavor":"","critical":null,"damage":{"parts":[],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":0,"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":true},"scaling":{"mode":"none","formula":""}},"flags":{"core":{"sourceId":"Item.ielR5DiQGGDRsJB5"}},"img":"systems/sw5e/packs/Icons/Force%20Powers/Defensive%20Technique.webp","effects":[],"_id":"qv4hHFZKUwg7Ail2"}
{"_id":"qykEFT52bywaQrNO","name":"Force Technique","permission":{"default":0,"00LEX91CfLcf3HGf":3},"type":"power","data":{"description":{"value":"
You imbue your weapon with the purifying light of the Force. As part of the action used to cast this power, you must make a melee attack with a weapon against one creature within your weapon’s reach, otherwise the power fails. On a hit, the target suffers the attack’s normal effects, and it becomes wreathed in a glowing barrier of force energy until the start of your next turn. If the target willingly moves before then, it immediately takes 1d8 force damage, and the power ends.
\n
This power’s damage increases when you reach higher levels. At 5th level, the melee attack deals an extra 1d8 force damage to the target, and the damage the target takes for moving increases to 2d8. Both damage rolls increase by 1d8 at 11th level and 17th level.
","chat":"","unidentified":""},"source":"PHB","activation":{"type":"action","cost":1,"condition":"You must make a melee attack with a weapon against one creature within your weapon’s reach"},"duration":{"value":1,"units":"round"},"target":{"value":1,"units":"","type":"creature"},"range":{"value":null,"long":null,"units":""},"uses":{"value":0,"max":"0","per":""},"ability":"","actionType":"other","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["1d8",""]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":0,"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":"atwill","formula":"1d8"},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"consume":{"type":"","target":"","amount":null}},"flags":{},"img":"systems/sw5e/packs/Icons/Force%20Powers/Force%20Technique.webp","effects":[]}
{"_id":"rxvZoFgkC411tibT","name":"Break","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"power","data":{"description":{"value":"
You inflict 10 force damage to an object you can see within range that is not being worn or carried, generating an explosion of sound that can be heard up to 100 feet away. Even if the object is not destroyed, small shards of shrapnel fly at creatures within 5 feet of it. Each creature must make a Dexterity saving throw. On a failed save, a creature takes 1d4 kinetic damage.
\n
This power's kinetic damage increases by 1d4 when you reach 5th level (2d4), 11th level (3d4), and 17th level (4d4), and the power's force damage also increases by 10 at each of these levels.
You wrack the body of a creature that you can see with a virulent, disease-like condition. The target must make a Constitution saving throw. On a failed save, it takes 14d6 necrotic damage, or half as much damage on a successful save. The damage can’t reduce the target’s hit points below 1. If the target fails the saving throw, its hit point maximum is reduced for 1 hour by an amount equal to the necrotic damage it took. Any effect that removes a disease allows a creature’s hit point maximum to return to normal before that time passes.
\n
Force Potency. If you cast this power using a force slot of 7th level or higher, the power deals an extra 2d6 damage for each slot level above 6th.
Dugs are slender, powerfully built beings with a somewhat humanoid build and a unique method of walking that hailed from the high gravity world Malastare. Their primary means of locomotion is their strong arms, and their lower limbs and feet were used for grappling and other fine motor manipulation. They hardly ever walk on their lower limbs. Although most Dugs may walk on all four limbs, others like to use their strong arms as legs and their feet as hands like they would normally do.
Society and Culture
Due to their oppression under their Gran rulers who colonized Malastare, many Dugs often feel the need to throw around their strength in bids to establish dominance. As a result, they are known for their ill-tempered demeanor, and many are bullying thugs.\r\n\r\nOn their homeworld of Malastare, the vast majority of Dugs are little more than laborers toiling for the enrichment of the Gran. With the species excluded from much of the power and money on Malastare, many Dugs turn to swoop racing or bounty hunting as their only means to achieve fame and fortune. In all other areas, the Dugs are exploited.
Names
Dug names are often 3 syllables long, mostly through big sounds rather than harsh tones. There are harsher tones in their names as well though, often in the forms of x's and k's. Female Dugs have softer names, but no one would call them beautiful. Surnames are usually passed down through family or clan.
Ability Score Increase. Your Strength score increases by 2, and your Dexterity score increases by 1.
Age. Dugs reach adulthood in their early teens and live an average of 75 years. Their violent nature often leads to violent ends.
Alignment. Dugs' angry nature causes them to tend toward the dark side, though there are exceptions.
Size. Dugs typically stand between 3 and 4 feet tall. Regardless of your position in that range, your size is Small.
Speed. Your base walking speed is 25 feet.
Courageous. You have advantage on saving throws against being frightened.
Fisticuffs. Your unarmed strikes deal 1d4 kinetic damage. You can use your choice of your Strength or Dexterity modifier for the attack and damage rolls. You must use the same modifier for both rolls.
Fury of the Small. When you damage a creature with an attack or a power and the creature's size is larger than yours, you can cause the attack or power to deal extra damage to the creature. The extra damage equals your level. Once you use this trait, you can't use it again until you finish a short or long rest.
Menacing. You have proficiency in the Intimidation skill.
Strong and Small. You have a climbing speed of 25 feet.
Powerful Build. You count as two sizes larger when determining your carrying capacity and the weight you can push, drag, or lift.
Undersized. Your small stature makes it hard for you to wield bigger weapons. You can't use heavy shields. Additionally, you can't use martial weapons with the two-handed property unless it also has the light property, and if a martial weapon has the versatile property, you can only wield it in two hands.
Languages. You can speak, read, and write Galactic Basic and Dug.
"},"skinColorOptions":{"value":"Brown, purple, gray, or red"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Blue or yellow"},"distinctions":{"value":"Arms used as legs and legs used as arms"},"heightAverage":{"value":"3'2\""},"heightRollMod":{"value":"+2d6\""},"weightAverage":{"value":"50 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Malastare"},"slanguage":{"value":"Dug"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Dug","mode":"=","targetSpecific":false,"id":1,"itemId":"567S1i2cx4Cv10jT","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.str.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"567S1i2cx4Cv10jT","active":false,"_targets":[],"label":"Abilities Strength"},{"modSpecKey":"data.abilities.dex.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"567S1i2cx4Cv10jT","active":false,"_targets":[],"label":"Abilities Dexterity"},{"modSpecKey":"data.traits.size","value":"sm","mode":"=","targetSpecific":false,"id":4,"itemId":"567S1i2cx4Cv10jT","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"25","mode":"=","targetSpecific":false,"id":5,"itemId":"567S1i2cx4Cv10jT","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.skills.itm.value","value":"1","mode":"=","targetSpecific":false,"id":6,"itemId":"567S1i2cx4Cv10jT","active":false,"_targets":[],"label":"Skills Intimidation"},{"modSpecKey":"data.attributes.movement.climb","value":"25","mode":"=","targetSpecific":false,"id":7,"itemId":"567S1i2cx4Cv10jT","active":false,"_targets":[],"label":"Attributes Speed Special"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":8,"itemId":"567S1i2cx4Cv10jT","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"dug","mode":"+","targetSpecific":false,"id":9,"itemId":"567S1i2cx4Cv10jT","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Dug.webp","effects":[{"_id":"ZXNTACyNdeD1Y7ui","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Dug","mode":5,"priority":5},{"key":"data.abilities.str.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.dex.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"sm","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":25,"mode":5,"priority":5},{"key":"data.skills.itm.value","value":1,"mode":4,"priority":5},{"key":"data.attributes.movement.climb","value":25,"mode":5,"priority":5},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"dug","mode":0,"priority":0},{"key":"flags.sw5e.furyOfTheSmall","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.powerfulBuild","value":"1","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/Species/Dug.webp","label":"Dug","tint":"","transfer":true}]}
{"_id":"HyqiVZiyDKbiPHkM","name":"Cathar","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"
Biology and Appearance
\n
The Cathar have fur-covered bodies with thick manes as well as prominent, retractable claws that can deliver powerful killing attacks on foes and prey. Their bodies also possess rapid healing abilities. These traits make them the perfect hand-to-hand specialists. The Cathar species also has two subspecies, known as the Juhani and the Myr Rho. Both of these are notably less catlike than mainline Cathar. Cathar are born into a litter. The Cathar species is biologically similar to the Bothan species.
\n
Society and Culture
\n
On their homeworld, Cathar live in cities built into giant trees, and are organized into clans governed by elders. Stories of their great heroes were often carved into the trunks of these tree-homes for following generations to see. The Cathar mate for life, to the extent that when one mate dies, the survivor never has a relationship with another. Cathar clan society includes great pageants and celebrations, especially for their heroes. Their religion includes a ritual known as the \"Blood Hunt,\" in which Cathar warriors individually engaged in combat against entire nests of Kiltik in order to gain honor and purge themselves of inner darkness. The native language of the Cathar is Catharese, which included the emphasis of some spoken words with a growl.
\n
Names
\n
Cathar names can sound both melodic and fairly gutteral, but they almost always sound strong and fierce. Female names are typically longer than male names. Surnames are usually one syllable.
Ability Score Increase. Your Dexterity score increases by 2, and your Charisma score increases by 1.
\n
Age. Cathar reach adulthood in their late teens and live less than a century.
\n
Alignment. Cathar tend toward no particular alignment. The best and worst are found among them.
\n
Size. Cathar range from 5 to 7 feet tall, and can weigh up to 300 lbs. Regardless of your position in that range, your size is Medium.
\n
Speed. Your base walking speed is 30 feet.
\n
Darkvision. You have a cat's keen senses, especially in the dark. You can see in dim light within 60 feet of you as if it were bright light, and in darkness as if it were dim light. You can't discern color in darkness, only shades of gray.
\n
Leonine Agility. Your reflexes and agility allow you to move with a burst of speed. When you move on your turn in combat, you can double your speed until the end of the turn. Once you use this trait, you can't use it again until you move 0 feet on one of your turns.
\n
Cat's Claws. You have a climbing speed of 20 feet. Additionally, your unarmed strikes deal 1d4 kinetic damage. You can use your choice of your Strength or Dexterity modifier for the attack and damage rolls. You must use the same modifier for both rolls.
\n
Cat's Talent. You have proficiency in the Perception and Stealth skills.
\n
Languages. You can speak, read, and write Galactic Basic and Catharese.
"},"skinColorOptions":{"value":"Gold to yellow-brown with dark stripes"},"hairColorOptions":{"value":"Brown, black, or grey"},"eyeColorOptions":{"value":"Yellow or brown"},"distinctions":{"value":"Lion-like features"},"heightAverage":{"value":"4'9\""},"heightRollMod":{"value":"+2d12\""},"weightAverage":{"value":"130 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Cathar"},"slanguage":{"value":"Catharese"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"PHB"},"flags":{"dynamiceffects":{"equipActive":true,"effects":[{"modSpecKey":"data.details.species","value":"Cathar","mode":"=","targetSpecific":false,"id":1,"itemId":"Ku1ZIFLPqS4PTiFl","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.dex.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"Ku1ZIFLPqS4PTiFl","active":false,"_targets":[],"label":"Abilities Dexterity"},{"modSpecKey":"data.abilities.cha.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"Ku1ZIFLPqS4PTiFl","active":false,"_targets":[],"label":"Abilities Charisma"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"Ku1ZIFLPqS4PTiFl","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"Ku1ZIFLPqS4PTiFl","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.traits.senses","value":"Darkvision (60 ft.)","mode":"+","targetSpecific":false,"id":6,"itemId":"Ku1ZIFLPqS4PTiFl","active":false,"_targets":[],"label":"Traits Senses"},{"modSpecKey":"data.attributes.movement.climb","value":"20","mode":"+","targetSpecific":false,"id":7,"itemId":"Ku1ZIFLPqS4PTiFl","active":false,"_targets":[],"label":"Attributes Speed Special"},{"modSpecKey":"data.skills.prc.value","value":"1","mode":"+","targetSpecific":false,"id":8,"itemId":"Ku1ZIFLPqS4PTiFl","active":false,"_targets":[],"label":"Skills Perception"},{"modSpecKey":"data.skills.ste.value","value":"1","mode":"+","targetSpecific":false,"id":9,"itemId":"Ku1ZIFLPqS4PTiFl","active":false,"_targets":[],"label":"Skills Stealth"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":10,"itemId":"Ku1ZIFLPqS4PTiFl","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"catharese","mode":"+","targetSpecific":false,"id":11,"itemId":"Ku1ZIFLPqS4PTiFl","active":false,"_targets":[]}],"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Cathar.webp","effects":[{"_id":"6fYB2NZ236PqSl6p","flags":{"dae":{"transfer":true,"stackable":false,"specialDuration":[]}},"changes":[{"key":"data.details.species","value":"Cathar","mode":5,"priority":5},{"key":"data.abilities.dex.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.cha.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":30,"mode":5,"priority":5},{"key":"data.attributes.senses.darkvision","value":60,"mode":2,"priority":20},{"key":"data.attributes.movement.climb","value":20,"mode":2,"priority":20},{"key":"data.skills.prc.value","value":1,"mode":4,"priority":20},{"key":"data.skills.ste.value","value":1,"mode":4,"priority":20},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"catharese","mode":0,"priority":0},{"key":"flags.sw5e.nimbleAgility","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/Species/Cathar.webp","label":"Cathar","tint":"","transfer":true}]}
{"_id":"IM7NrBROnrDOgr0l","name":"Chagrian","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"
Biology and Appearance
\n
Chagrians are born as tadpoles in clutches of three or more and raised in tubs of water in a family's private home. During this time, their arms, legs, and air-breathing lungs develop. Adult Chagrians are truly amphibious, retaining their ability to breathe underwater while also able to function without difficulty in air. They also possess acute low-light vision.
\n
The average Chagrian stands taller than a Human. They are distinguished by two fleshy growths protruding from the sides of their heads, which they call lethorns. As they age, the lethorns thicken. Males also sport two horns growing from the top of their skulls. These were once used in underwater duels to attract a mate, and are seen as a sign of the males' strength and virility. Females lack the superior cranial horns, but had more pronounced and longer posterior head plates; these can reach halfway down their back. Chagrians also have very long black forked tongues.
\n
Society and Culture
\n
As a species, Chagrians are generally peaceful and law-abiding to the point of becoming stoic and obstinate. Many Chagrians are motivated only by basic desires such as sustenance, shelter, and healthcare. Chagrian government ensures that every citizen is cared and provided for, so the standard of living for the poorest Chagrian is high compared to the members of other species. Chagrians who expect violence often wear red.
\n
Names
\n
Chagrian names have a very melodic tone. Male names are typically shorter than female names. Surnames are familial.
Ability Score Increase. Your Dexterity score increases by 2, and your Wisdom score increases by 1.
\n
Age. Chagrians reach adulthood in their late teens and live an average of 75 years.
\n
Alignment. Chagrians' peace-loving nature causes them to tend toward the light side, though there are exceptions.
\n
Size. Chagrians typically stand between 5 and 6 feet tall and weigh 150 lbs. Regardless of your position in that range, your size is Medium.
\n
Speed. Your base walking speed is 30 feet.
\n
Amphibious. You can breathe air and water.
\n
Darkvision. You have keen eyesight, especially in the dark. You can see in dim light within 60 feet of you as if it were bright light, and in darkness as if it were dim light. You can't discern color in darkness, only shades of gray.
\n
Natural Resistance. You have advantage on saving throws against poison, and you have resistance against poison damage (explained in chapter 9).
\n
Swim. You have a swimming speed of 30 feet.
\n
Languages. You can speak, read, and write Galactic Basic and Chagri.
"},"skinColorOptions":{"value":"Light to dark blue"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Black"},"distinctions":{"value":"Horns (male), lethorns, black forked tongues"},"heightAverage":{"value":"5'5\""},"heightRollMod":{"value":"+2d8\""},"weightAverage":{"value":"120 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Champala"},"slanguage":{"value":"Chagri"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"effects":[{"modSpecKey":"data.details.species","value":"Chagrian","mode":"=","targetSpecific":false,"id":1,"itemId":"OeTZyxxYPu7ICMTX","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.dex.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"OeTZyxxYPu7ICMTX","active":false,"_targets":[],"label":"Abilities Dexterity"},{"modSpecKey":"data.abilities.wis.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"OeTZyxxYPu7ICMTX","active":false,"_targets":[],"label":"Abilities Wisdom"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"OeTZyxxYPu7ICMTX","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"OeTZyxxYPu7ICMTX","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.traits.senses","value":"Darkvision (60 ft.)","mode":"+","targetSpecific":false,"id":6,"itemId":"OeTZyxxYPu7ICMTX","active":false,"_targets":[],"label":"Traits Senses"},{"modSpecKey":"data.traits.dr.value","value":"poison","mode":"+","targetSpecific":false,"id":7,"itemId":"OeTZyxxYPu7ICMTX","active":false,"_targets":[],"label":"Traits Damage Resistance"},{"modSpecKey":"data.attributes.movement.swim","value":"30","mode":"+","targetSpecific":false,"id":8,"itemId":"OeTZyxxYPu7ICMTX","active":false,"_targets":[],"label":"Attributes Speed Special"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":9,"itemId":"OeTZyxxYPu7ICMTX","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"chagri","mode":"+","targetSpecific":false,"id":10,"itemId":"OeTZyxxYPu7ICMTX","active":false,"_targets":[]}],"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Chagrian.webp","effects":[{"_id":"yGJG8HBejLZV4hB0","flags":{"dae":{"transfer":true,"stackable":false,"specialDuration":[]}},"changes":[{"key":"data.details.species","value":"Chagrian","mode":5,"priority":5},{"key":"data.abilities.dex.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.wis.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":30,"mode":5,"priority":5},{"key":"data.attributes.senses.darkvision","value":60,"mode":2,"priority":20},{"key":"data.traits.dr.value","value":"poison","mode":0,"priority":0},{"key":"data.attributes.movement.swim","value":30,"mode":2,"priority":20},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"chagri","mode":0,"priority":0},{"key":"flags.sw5e.amphibious","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/Species/Chagrian.webp","label":"Chagrian","tint":"","transfer":true}]}
-{"_id":"J7HJQkcvghtwMAdF","name":"Anzellan","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"
Biology and Appearance
\n
The anzellans are a diminutive species hailing from the secluded planet Anzella. Their eyes have floating corneal micro-lenses that allow them to see microscopic details. Anzellans are a bubbly and receptive people. They are a jovial and trusting people that tend to welcome strangers with open arms. Due to their volcanic homeworld, anzellans are also adapted towards heat. This, coupled with their small size, make them well-suited to working in compact places.
\n
Society and Culture
\n
Anzella is a tropical planet covered in thousands of small volcanic islands. Many of these islands are developed as small villages, with the largest islands designed to accommodate larger species. Anzellan culture is generally based around tourism and crafting; in fact, anzellans are renowned craftsmen due to their discerning eyesight and ability to fit into small spaces. Anzellan government is generally casual. Each village has its own governing council of rotating members; these villages act independently from one another unless their decisions would affect more than a single island. In that case, all of the councils work together to come to a planet-wide decision.
\n
Names
\n
Anzellan names are rarely longer than two syllables, with a bouncy intonation to them. Their surnames are familial.
Ability Score Increase. Your Intelligence score increases by 2, and two other ability scores of your choice increase by 1.
Age. Anzellans are considered adults at ten years old. They are a short-lived species, however, that rarely lives longer than 60 years.
Alignment. Anzellans are a friendly and respectful people, which causes them to tend toward lawful light side, though there are exceptions.
Size. Anzellans stand between 1 and 2 feet tall and weigh around 10 lbs. Regardless of your position in that range, your size is Tiny.
Speed. Your base walking speed is 20 feet.
Crafters. You have proficiency in one tool of your choice.
Detail Oriented. You are practiced at scouring for details. You have advantage on Intelligence (Investigation) checks within 5 feet.
Pintsized. Your tiny stature makes it hard for you to wield bigger weapons. You can't use medium or heavy shields. Additionally, you can't wield weapons with the two-handed or versatile property, and you can only wield one-handed weapons in two hands unless they have the light property.
Puny. Anzellans are too small to pack much of a punch. You have disadvantage on Strength saving throws, and when determining your bonus to attack and damage rolls for weapon attacks using Strength, you can't add more than +3.
Small and Nimble. You are too small and fast to effectively target. You have a +1 bonus to AC, and you have advantage on Dexterity saving throws.
Tanned. You are naturally adapted to hot climates, as described in chapter 5 of the Dungeon Master's Guide.
Technician. You are proficient in the Technology skill.
Tinker. You have proficiency with tinker's tools. You can use these and spend 1 hour and 100 cr worth of materials to construct a Tiny Device (AC 5, 1 hp). You can take the Use an Object action to have your device cause one of the following effects: create a small explosion, create a repeating loud noise for 1 minute, create smoke for 1 minute, create a soothing melody for 1 minute. You can maintain a number of these devices up to your proficiency bonus at once, and a device stops functioning after 24 hours away from you. You can dismantle the device to reclaim the materials used to create it.
Languages. You can speak, read, and write Galactic Basic and Anzellan. Anzellan is characterized by its bouncy sound and emphasis on alternating syllables.
","source":"Expanded Content"},"skinColorOptions":{"value":"Brown, green, or tan"},"hairColorOptions":{"value":"Black, gray, or white"},"eyeColorOptions":{"value":"Black"},"distinctions":{"value":"Diminutive size, wispy eyebrows"},"heightAverage":{"value":"1'0\""},"heightRollMod":{"value":"+2d6\""},"weightAverage":{"value":"3 lb."},"weightRollMod":{"value":"x1 lb."},"homeworld":{"value":"Anzella"},"slanguage":{"value":"Anzellan"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"effects":[{"modSpecKey":"data.details.species","value":"Anzellan","mode":"=","targetSpecific":false,"id":1,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.int.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.traits.size","value":"tin","mode":"=","targetSpecific":false,"id":3,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"20","mode":"=","targetSpecific":false,"id":4,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.attributes.ac.min","value":"1","mode":"+","targetSpecific":false,"id":5,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Attributes Armor Class Min"},{"modSpecKey":"data.skills.tec.value","value":"1","mode":"+","targetSpecific":false,"id":6,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Skills Technology"},{"modSpecKey":"data.traits.toolProf.custom","value":"Tinker's tools","mode":"+","targetSpecific":false,"id":7,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Tool Prof Custom"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":8,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Language"},{"modSpecKey":"data.traits.languages.value","value":"anzellan","mode":"+","targetSpecific":false,"id":9,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[]}],"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Anzellan.webp","effects":[{"_id":"ZGdzAq1Gl4xaxDRD","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Anzellan","mode":5,"priority":5},{"key":"data.abilities.int.value","value":2,"mode":2,"priority":20},{"key":"data.traits.size","value":"grg","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":20,"mode":5,"priority":5},{"key":"data.attributes.ac.value","value":1,"mode":2,"priority":20},{"key":"data.skills.tec.value","value":1,"mode":4,"priority":20},{"key":"data.traits.toolProf.custom","value":"Tinker's tools","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"anzellan","mode":0,"priority":0},{"key":"flags.sw5e.detailOriented","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.pintsized","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.puny","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.tinker","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Anzellan.webp","label":"Anzellan","tint":"","transfer":true}]}
+{"_id":"J7HJQkcvghtwMAdF","name":"Anzellan","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"
Biology and Appearance
\n
The anzellans are a diminutive species hailing from the secluded planet Anzella. Their eyes have floating corneal micro-lenses that allow them to see microscopic details. Anzellans are a bubbly and receptive people. They are a jovial and trusting people that tend to welcome strangers with open arms. Due to their volcanic homeworld, anzellans are also adapted towards heat. This, coupled with their small size, make them well-suited to working in compact places.
\n
Society and Culture
\n
Anzella is a tropical planet covered in thousands of small volcanic islands. Many of these islands are developed as small villages, with the largest islands designed to accommodate larger species. Anzellan culture is generally based around tourism and crafting; in fact, anzellans are renowned craftsmen due to their discerning eyesight and ability to fit into small spaces. Anzellan government is generally casual. Each village has its own governing council of rotating members; these villages act independently from one another unless their decisions would affect more than a single island. In that case, all of the councils work together to come to a planet-wide decision.
\n
Names
\n
Anzellan names are rarely longer than two syllables, with a bouncy intonation to them. Their surnames are familial.
Ability Score Increase. Your Intelligence score increases by 2, and two other ability scores of your choice increase by 1.
Age. Anzellans are considered adults at ten years old. They are a short-lived species, however, that rarely lives longer than 60 years.
Alignment. Anzellans are a friendly and respectful people, which causes them to tend toward lawful light side, though there are exceptions.
Size. Anzellans stand between 1 and 2 feet tall and weigh around 10 lbs. Regardless of your position in that range, your size is Tiny.
Speed. Your base walking speed is 20 feet.
Crafters. You have proficiency in one tool of your choice.
Detail Oriented. You are practiced at scouring for details. You have advantage on Intelligence (Investigation) checks within 5 feet.
Pintsized. Your tiny stature makes it hard for you to wield bigger weapons. You can't use medium or heavy shields. Additionally, you can't wield weapons with the two-handed or versatile property, and you can only wield one-handed weapons in two hands unless they have the light property.
Puny. Anzellans are too small to pack much of a punch. You have disadvantage on Strength saving throws, and when determining your bonus to attack and damage rolls for weapon attacks using Strength, you can't add more than +3.
Small and Nimble. You are too small and fast to effectively target. You have a +1 bonus to AC, and you have advantage on Dexterity saving throws.
Tanned. You are naturally adapted to hot climates, as described in chapter 5 of the Dungeon Master's Guide.
Technician. You are proficient in the Technology skill.
Tinker. You have proficiency with tinker's tools. You can use these and spend 1 hour and 100 cr worth of materials to construct a Tiny Device (AC 5, 1 hp). You can take the Use an Object action to have your device cause one of the following effects: create a small explosion, create a repeating loud noise for 1 minute, create smoke for 1 minute, create a soothing melody for 1 minute. You can maintain a number of these devices up to your proficiency bonus at once, and a device stops functioning after 24 hours away from you. You can dismantle the device to reclaim the materials used to create it.
Languages. You can speak, read, and write Galactic Basic and Anzellan. Anzellan is characterized by its bouncy sound and emphasis on alternating syllables.
","source":"Expanded Content"},"skinColorOptions":{"value":"Brown, green, or tan"},"hairColorOptions":{"value":"Black, gray, or white"},"eyeColorOptions":{"value":"Black"},"distinctions":{"value":"Diminutive size, wispy eyebrows"},"heightAverage":{"value":"1'0\""},"heightRollMod":{"value":"+2d6\""},"weightAverage":{"value":"3 lb."},"weightRollMod":{"value":"x1 lb."},"homeworld":{"value":"Anzella"},"slanguage":{"value":"Anzellan"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"effects":[{"modSpecKey":"data.details.species","value":"Anzellan","mode":"=","targetSpecific":false,"id":1,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.int.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.traits.size","value":"tin","mode":"=","targetSpecific":false,"id":3,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"20","mode":"=","targetSpecific":false,"id":4,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.attributes.ac.min","value":"1","mode":"+","targetSpecific":false,"id":5,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Attributes Armor Class Min"},{"modSpecKey":"data.skills.tec.value","value":"1","mode":"+","targetSpecific":false,"id":6,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Skills Technology"},{"modSpecKey":"data.traits.toolProf.custom","value":"Tinker's tools","mode":"+","targetSpecific":false,"id":7,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Tool Prof Custom"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":8,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Language"},{"modSpecKey":"data.traits.languages.value","value":"anzellan","mode":"+","targetSpecific":false,"id":9,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[]}],"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Anzellan.webp","effects":[{"_id":"ZGdzAq1Gl4xaxDRD","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Anzellan","mode":5,"priority":5},{"key":"data.abilities.int.value","value":2,"mode":2,"priority":20},{"key":"data.traits.size","value":"tiny","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":20,"mode":5,"priority":5},{"key":"data.attributes.ac.value","value":1,"mode":2,"priority":20},{"key":"data.skills.tec.value","value":1,"mode":4,"priority":20},{"key":"data.traits.toolProf.custom","value":"Tinker's tools","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"anzellan","mode":0,"priority":0},{"key":"flags.sw5e.detailOriented","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.pintsized","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.puny","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.tinker","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Anzellan.webp","label":"Anzellan","tint":"","transfer":true}]}
{"_id":"JB327dJNFAiEOxyp","name":"Felucian","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"
Biology and Appearance
Felucians are a tall, bipedal species. Both their arms and legs end in four, large webbed digits with suction-cup fingertips. Springing from the underside of each forearm is a second short arm, ending in three large and agile fingers. A Felucian's head is a thick mass of long flexible tendrils featuring illuminated tips. The eyes and mouth appear as black holes or openings within this mass.
Society and Culture
Felucians are mysterious sentient beings native to the vast fungal swamps and jungles of Felucia. Though Felucia has long been colonized, the native Felucians avoided notice by living deep in the jungle. Such seclusion was easily maintained. Even the hardiest of colonists were loath to brave the perils of the dangerous wilderness without cause.\n\nThe Felucians are an unusual, amphibious species. They are highly adapted to surviving the wilds of their home planet, and fade easily into its confusing mass of plant life. They are equally at home on land or in the water, and they traverse the swamps with ease.\n\nAll Felucians are part of a single, planetwide tribe that is broken down into smaller villages and communities, each one led by shamans and chieftains. These shamans are very strong in the Force, using it to their own ends with incredible skill.
Names
Felucian names are usually two syllables and full of hard consonants. Surnames are a combination of tribe lineage.
Ability Score Increase. Your Constitution score increases by 2, and your Wisdom score increases by 1.
\n
Age. Felucians reach adulthood in their late teens and live less than a century.
\n
Alignment. Felucians' connection to the Living Force causes them to tend toward the light side, though there are exceptions.
\n
Size. Felucians typically stand over 6 feet tall and generally weigh about 200 lbs. Regardless of your position in that range, your size is Medium.
\n
Speed. Your base walking speed is 30 feet.
\n
Force Sensitive. You know the burst at-will Force power. When you reach 3rd level, you can cast the beast trick Force power once per day. When you reach 5th level, you can also cast the plant surge Force power once per day. Wisdom is your forcecasting ability for these powers.
\n
Amphibious. You can breathe air and water.
\n
Stealthy. You are proficient in the Stealth skill.
\n
Mask of the Wild. You can attempt to hide even when you are only lightly obscured by foliage, heavy rain, falling snow, mist, and other natural phenomena.
\n
Languages. You can speak, read, and write Galactic Basic, Felucianese, and one more language of your choice. Felucianese is characterized by guttural, whisper-like vowels, interspersed with hard clicks.
"},"skinColorOptions":{"value":"Gray, with blue, red, or yellow markings"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Red"},"distinctions":{"value":"Extra limb at elbow, innate Force-sensitivity"},"heightAverage":{"value":"5'8\""},"heightRollMod":{"value":"+2d6\""},"weightAverage":{"value":"165 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Felucia"},"slanguage":{"value":"Felucianese"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Felucian","mode":"=","targetSpecific":false,"id":1,"itemId":"aMOoVFBHoKmmBPe3","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.con.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"aMOoVFBHoKmmBPe3","active":false,"_targets":[],"label":"Abilities Constitution"},{"modSpecKey":"data.abilities.wis.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"aMOoVFBHoKmmBPe3","active":false,"_targets":[],"label":"Abilities Wisdom"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"aMOoVFBHoKmmBPe3","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"aMOoVFBHoKmmBPe3","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.skills.ste.value","value":"1","mode":"+","targetSpecific":false,"id":6,"itemId":"aMOoVFBHoKmmBPe3","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":7,"itemId":"aMOoVFBHoKmmBPe3","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"felucianese","mode":"+","targetSpecific":false,"id":8,"itemId":"aMOoVFBHoKmmBPe3","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Felucian.webp","effects":[{"_id":"0sYjEeYfNqJnGDdC","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Felucian","mode":5,"priority":5},{"key":"data.abilities.con.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.wis.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":0,"priority":5},{"key":"data.attributes.movement.walk","value":"30","mode":5,"priority":5},{"key":"data.skills.ste.value","value":1,"mode":4,"priority":20},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"felucianese","mode":0,"priority":0},{"key":"flags.sw5e.amphibious","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.maskOfTheWild","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Felucian.webp","label":"Felucian","tint":"","transfer":true}]}
{"_id":"JxGOgqePQT2ztJ64","name":"Zeltron","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"
Biology and Appearance
Zeltrons are one of the few near-human species that differentiated from the baseline stock enough to be considered a new species of the Human genus, rather than simply a subspecies. They possess two biological traits of note. The first is that they all produce potent pheromones, similar to the Falleen species, which enhanced their attractiveness and likeability. The second is a limited telepathic ability, used to project emotions onto others, as well as allowing them to read and even feel the emotions of others; some Zeltrons have been hired by the Exchange for this ability. Because of their telepathic ability, positive emotions such as happiness, love and pleasure are very important to them, while negative ones such as anger, fear, or depression are shunned.
Society and Culture
Zeltron culture is highly influenced by sexuality and the pursuit of pleasure in general. Most of their art and literature is devoted to the subject, producing some of the raciest pieces in the galaxy. Zeltrons are known to dress in wildly colorful or revealing attire. It's common to see Zeltrons wearing shockingly bright shades of neon colors in wildly designed bikinis, or nearly skin tight clothing of other sorts with bizarre color designs, patterns, and symbols.
Names
Zeltron names often have an air of mystique to them, to evoke sensuality. For a Zeltron, a beautiful face is nothing without an equally beautiful name. It's not uncommon for a Zeltron to forsake their familial surname in favor of a more attractive-sounding one.
Ability Score Increase. Your Charisma score increases by 2, and your Constitution score increases by 1.
Age. Zeltron reach adulthood in their late teens and live about 80 years.
Alignment. Zeltron are a deeply sensual, hedonistic species, causing them to tend toward chaotic balanced or dark side alignments, though there are exceptions.
Size. Zeltron tend to be slender and statuesque, typically standing between 5 and 6 feet tall and rarely weighing more than 150 lb. Regardless of your position in that range, your size is Medium.
Speed. Your base walking speed is 30 feet.
Charismatic. You have proficiency with Deception or Persuasion (your choice).
Enthralling Pheromones. You can use your pheromones to influence individuals of both sexes. Whenever you roll a 1 on a Charisma (Persuasion) check, you can reroll the die and must use the new roll. Additionally, once per short or long rest, you can treat a d20 roll of 9 or lower on a Charisma check as a 10. This feature has no effect on droids or constructs.
Natural Empathy. Zeltron's limited telepathy allow them to sense mood shifts in those around them. You have advantage on Wisdom (Insight) checks to determine emotions against humanoids and beasts within 10 feet of you.
Two Livered. Zeltron have two livers, which makes them adept at filtering toxins. You have advantage on saving throws against poison, and you have resistance against poison damage (explained in chapter 9).
Languages. You can speak, read, and write Galactic Basic and one language of your choice.
"},"skinColorOptions":{"value":"Light pink to deep crimson"},"hairColorOptions":{"value":"Blue, brown, pink, or red"},"eyeColorOptions":{"value":"Hazel, silver, amber"},"distinctions":{"value":"Capable of producing powerful pheromones"},"heightAverage":{"value":"4'8\""},"heightRollMod":{"value":"+2d10\""},"weightAverage":{"value":"90 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Zeltros"},"slanguage":{"value":"Galactic Basic"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Zeltron","mode":"=","targetSpecific":false,"id":1,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.cha.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Abilities Charisma"},{"modSpecKey":"data.abilities.con.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Abilities Constitution"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.traits.dr.value","value":"poison","mode":"+","targetSpecific":false,"id":6,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":7,"itemId":"TSnP7ODGs6vIPQNe","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Zeltron.webp","effects":[{"_id":"67J2jENh3a5uydk3","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Zeltron","mode":5,"priority":5},{"key":"data.abilities.cha.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.con.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":0,"priority":5},{"key":"data.attributes.movement.walk","value":"30","mode":5,"priority":5},{"key":"data.traits.dr.value","value":"poison","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"flags.sw5e.enthrallingPheromones","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Zeltron.webp","label":"Zeltron","tint":"","transfer":true}]}
{"_id":"L7jVJxWNNsWAPj6c","name":"Droid, Class V","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"
\n
Players as Droids
\n
Work with your GM to determine if playing as a droid is appropriate for your campaign. Droids are impervious to many effects and vulnerable to others. If your GM approves this choice of species, work with them to determine your droids designation, name, and appearance. If you want to play a different type of droid, work with your GM to find traits to realize your character.
\n
\n
Appearance
\n
Class V droids are typically vaguely human-like in both shape and size, standing at around 6 feet, although many can be larger. They are usually a polished metallic color, though this can vary based on tasks for which they are created, their affiliation, or quirks of their owner.
\n
They are noteworthy for their simple programming and quiet, focused work habits.
\n
Utility
\n
Class V droids are programmed for menial and low-skill tasks. Such droids tend to perform basic tasks such as construction, lifting, maintenance, mining, sanitation, and transportation. Labor droids are fifth-degree droids.
\n
Names
\n
Droids are typically called by their designation, given to them when they are created, or some affectation given to them by their owner. Often this affectation is a play on their designation.
\n
Occasionally, noteworthy droids will earn monikers based on their accomplishments.
Ability Score Increase. Your Strength score increases by 2, and your Dexterity or Constitution score increases by 1.
\n
Age. Droids don’t age, though they require maintenance to retain functionality.
\n
Alignment. Droids tend toward no particular alignment. The best and worst are found among them.
\n
Size. Class V droids typically stand between 5 and 7 feet and weigh around 260 lbs. Regardless of your position in that range, your size is Medium.
\n
Speed. Your base walking speed is 30 feet.
\n
Type. Your creature type is droid.
\n
Armor Integration. You cannot wear armor, but you can have the armor professionally integrated into your chassis over the course of a long rest. This work must be done by someone proficient with astrotech’s implements. You must be proficient in armor in order to have it integrated.
\n
Droid Resistances. You are resistant to necrotic, poison, and psychic damage, and are immune to poison and disease.
\n
Droid Systems. You do not need to eat or drink. Additionally, you no longer require a tech focus to cast tech powers.
\n
Droid Vulnerabilities. You are vulnerable to ion damage. Additionally, you have disadvantage on saving throws against effects that would deal ion or lightning damage.
\n
Force Insensitive. While droids can be manipulated by many force powers, they cannot sense the Force. You can not use force powers or take levels in forcecasting classes.
\n
Maintenance Mode. Rather than sleep, you enter an inactive state to perform routine maintenance for 4 hours each day. You have disadvantage on Wisdom (Perception) checks while performing maintenance.
\n
Manual Laborer. You have proficiency in Athletics and one set of artisan’s implements of your choice.
\n
Powerful Build. Your carrying capacity and the weight you can push, drag, or lift doubles. If it would already double, it instead triples.
\n
Rapid Reconstruction. You are built with internal repair mechanisms. As a bonus action, you can choose to spend one of your Hit Dice to recover hit points.
\n
Languages. You can speak, read, and write Binary. You can understand spoken and written Galactic Basic and one language of your choice, but you cannot speak it.
"},"skinColorOptions":{"value":""},"hairColorOptions":{"value":""},"eyeColorOptions":{"value":""},"distinctions":{"value":""},"colorScheme":{"value":"Typically metallic"},"droidDistinctions":{"value":"Vaguely human-like size and shape, typically quiet"},"heightAverage":{"value":"5'2\""},"heightRollMod":{"value":"+2d12\""},"weightAverage":{"value":"140 lb."},"weightRollMod":{"value":"x(2d8) lb."},"homeworld":{"value":""},"slanguage":{"value":""},"manufacturer":{"value":"Cybot Galactica, Industrial Automaton"},"droidLanguage":{"value":"Binary"},"source":"PHB"},"flags":{"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Droid%20Class%20V.webp","effects":[{"_id":"Z3v7Cj4aSpJg4K8C","flags":{"dae":{"stackable":false,"transfer":true}},"changes":[{"key":"data.abilities.str.value","value":2,"mode":2,"priority":20},{"key":"data.details.species","value":"Droid, Class V","mode":5,"priority":20},{"key":"data.traits.size","value":"med","mode":0,"priority":20},{"key":"data.attributes.movement.walk","value":"30","mode":5,"priority":20},{"key":"data.traits.dr.value","value":"necrotic","mode":0,"priority":20},{"key":"data.traits.dr.value","value":"poison","mode":0,"priority":20},{"key":"data.traits.dr.value","value":"psychic","mode":0,"priority":20},{"key":"data.traits.ci.value","value":"diseased","mode":0,"priority":20},{"key":"data.traits.ci.value","value":"poisoned","mode":0,"priority":20},{"key":"data.traits.dv.value","value":"ion","mode":0,"priority":20},{"key":"data.skills.ath.value","value":1,"mode":4,"priority":20},{"key":"flags.sw5e.powerfulBuild","value":"1","mode":5,"priority":20},{"key":"data.traits.languages.value","value":"binary","mode":0,"priority":20},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":20},{"key":"flags.sw5e.forceInsensitive","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.maintenanceMode","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.rapidReconstruction","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Droid%20Class%20V.webp","label":"Droid, Class V","tint":"","transfer":true}]}
@@ -119,3 +119,5 @@
{"_id":"ynuvnI54pMKLwF2a","name":"Echani","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"
Biology and Appearance
Echani are characterized by their white skin, hair, and eyes, and their remarkable tendency to look very much alike one another to outside observers, particularly amongst family members. It is thought that their origins stem from Arkanian experimentation on the human genome, a hypothesis that could explain their physical conformity.
Society and Culture
A matriarchal, caste-based society originating from the Inner Rim world of Eshan, the echani spread to encompass a confederacy of six worlds including Bengali and Thyrsus, known as the Six Sisters, governed by the all-female Echani Command. \r\n\t\r\nEchani generals are sometimes seen by others as having the ability to predict their opponent's next move. This is no biologicial trait inherent to the species, but rather stems from the fact that combat is so ingrained into every level of echani culture; the echani hold to the idea that combat is the truest form of communication, and to know someone fully, you must fight them. While their combat rituals require complete freedom of movement and unarmed martial arts, in warfare, they tend towards light armor and melee weapons, and are considered excellent craftsmen of such.
Names
Echani names tend to lack hard consonants, but are otherwise as variable as human ones. Echani surnames are tied directly to their place in the caste system.
Ability Score Increase. Your Dexterity score increases by 2, and your Wisdom score increases by 1.
\n
Age. Echani reach adulthood in their late teens and live less than a century.
\n
Alignment. Echani culture's emphasis on honor and combat cause them to tend towards lawful alignments, though there are exceptions.
\n
Size. Echani stand between 5 and a half and 6 feet tall and weigh around 150 lbs, with little variation between them. Your size is Medium.
\n
Speed. Your base walking speed is 30 feet.
\n
Allies of the Force. Whenever you make a Wisdom (Insight) check against someone you know to wield the Force, you are considered to have expertise in the Insight skill.
\n
Combative Culture. You have proficiency in Lore and Acrobatics.
\n
Echani Art. If a humanoid you can see makes a melee weapon attack, you can use your reaction to make a Wisdom (Insight) check against the target's Charisma (Deception). On a success you learn one of the following traits about that creature: it's Strength, Dexterity or Constitution score; bonus to Strength, Dexterity or Constitution saving throws; armor class; or current hit points. On a failure, the target becomes immune to this feature for one day. You can use this ability a number of times equal to your Wisdom modifier (a minimum of once). You regain all expended uses on a long rest.
\n
Martial Upbringing. You have proficiency in light armor, and gain proficiency with two martial vibroweapons of your choice.
\n
Unarmed Combatant. Your unarmed strikes deal 1d6 kinetic damage. You can use your choice of your Strength or Dexterity modifier for the attack and damage rolls. You must use the same modifier for both rolls.
\n
Languages. You can speak, read, and write Galactic Basic and one extra language of your choice.
Iktotchi do not have hair, but rather they had a very resistant skin which protected them from the violent winds which crossed the satellite. Both males and females have down-curved cranial horns, which gave them an aggressive aspect. The males' horns are generally a little larger, a remnant from their mountain-dwelling, caprinaen ancestors. The horns are able to regenerate if damaged.
Society and Culture
The Iktotchi are a fiercely guarded and isolationist species - vaunted for their ability to hide their feelings and bury any semblance of emotion. Originating on the harsh, windy moon of Iktotch, which orbits the planet Iktotchon in the Expansion Region, the Iktotch are gifted with precognition, and are courted as often by Jedi as by pirates for their skills.\r\n\r\nIktotchi society is a stratified society. Upward mobility is both possible and encouraged. Iktotchi are an outwardly dispassionate people, which is evidenced by their culture. They have a robust legal system, and suffer little crime. Iktotchi are respectful of cultures other than their own and can easily integrate with others.\r\n\r\nIktotchi who distinguish themselves often earn a titular nickname, by which they are referred to in place of their name. Generally, this is done by accomplishing a remarkable feat that benefits the Iktotchi as whole.
Names
Iktotchi names are generally two syllables. Surnames are familial. Respected Iktotchi often adopt a nickname, which they use in place of their birth name.
Ability Score Increase. Your Intelligence score increases by 2, and your Strength score increases by 1.
\n
Age. Iktotchi reach adulthood in their late teens and live less than a century.
\n
Alignment. Iktotchi are lawful and tend toward the light side, though there are exceptions.
\n
Size. Iktotchi typically stand between 5 and 6 feet tall and weigh about 170 lbs. Regardless of your position in that range, your size is Medium.
\n
Speed. Your base walking speed is 30 feet.
\n
Precognition. You can see brief fragments of the future that allow you to turn failures into successes. When you roll a 1 on an attack roll, ability check, or saving throw, you can reroll the die and must use the new roll.
\n
Telepathy. You can communicate telepathically with creatures within 30 feet of you. You must share a language with the target in order to communicate in this way.
\n
Horns. Your horns are a natural weapon, which you can use to make unarmed strikes. If you hit with it, you deal kinetic damage equal to 1d6 + your Strength modifier.
\n
Pilot. You have proficiency in the Piloting skill.
\n
Languages. You can speak, read, and write Galactic Basic and Iktotchese.
Killiks possess a strong chitinous exoskeleton that is glossy and greenish with their carcasses capable of surviving thousands of years of erosion as seen by the colonists of Alderaan. The exoskeleton also contains a number of spiracles which served as their way of breathing. Typically, these Human-sized hive creatures have four arms with each ending in a powerful three-fingered claw. They stand on two stout legs that are capable of leaping great distances. Killiks can communicate with other Killiks through use of pheromones.
\n
Society and Culture
\n
The Killiks have a communal society, with each and every Killik being in mental contact with another. Due to their hive mind, every Killik nest is virtually one individual. Killiks are also peaceful in nature. Their telepathic connection is capable of extending to other species which includes non-insectoids. A willing creature can submit to this telepathy to become a Joiner. They effectively become another vessel of the hive mind. Killiks lose connection to their hive mind at great distances. Those who voluntarily leave the hive mind are referred to as Leavers. It is rare that they are allowed to rejoin their hive without reason.
\n
Names
\n
Killiks are a hive-mind insectoid that typically don't use names. On the off chance they do, it's usually an incomprehensible series of clicking noises. They are receptive to nicknames given by others.
Ability Score Increase. Your Intelligence score increases by 2, and your Constitution score increases by 1.
Age. Killiks reach adulthood in their 40s and live an average of 200 years.
Alignment. Killiks' willingness to brainwash or kill their enemies cause them to tend towards the dark side, though there are exceptions.
Size. Killiks stand between 5 and 6 feet tall and weigh about 160 lbs. Regardless of your position in that range, your size is Medium.
Speed. Your base walking speed is 30 feet.
Four-Armed. Killiks have four arms which they can use independently of one another. You can only gain the benefit of items held by two of your arms at any given time, and once per round you can switch which arms you are benefiting from (no action required).
Hardened Carapace. While you are unarmored or wearing light armor, your AC is 13 + your Dexterity modifier.
Strong-Legged. When you make a long jump, you can cover a number of feet up to twice your Strength score. When you make a high jump, you can leap a number of feet up into the air equal to 3 + twice your Strength modifier.
Telepathy. You can communicate telepathically with creatures within 30 feet of you. You must share a language with the target in order to communicate in this way.
Languages. You can speak, read, and write Killik. You can understand spoken and written Galactic Basic, but your vocal cords do not allow you to speak it.
"},"skinColorOptions":{"value":"Brown, chestnut, green, red, scarlet, or yellow"},"hairColorOptions":{"value":"None"},"eyeColorOptions":{"value":"Black or orange"},"distinctions":{"value":"Chitinous armor, mandibles projected from face, four arms ending in long three toed claws protrude from their torsos"},"heightAverage":{"value":"4'9\""},"heightRollMod":{"value":"+2d10\""},"weightAverage":{"value":"110 lb."},"weightRollMod":{"value":"x(2d4) lb."},"homeworld":{"value":"Alderaan"},"slanguage":{"value":"Killik"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"alwaysActive":false,"effects":[{"modSpecKey":"data.details.species","value":"Killik","mode":"=","targetSpecific":false,"id":1,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.int.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.abilities.con.value","value":"1","mode":"+","targetSpecific":false,"id":3,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Abilities Constitution"},{"modSpecKey":"data.traits.size","value":"med","mode":"=","targetSpecific":false,"id":4,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"30","mode":"=","targetSpecific":false,"id":5,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.attributes.ac.min","value":"13","mode":"=","targetSpecific":false,"id":6,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[],"label":"Attributes Armor Class Min"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":7,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.value","value":"killik","mode":"+","targetSpecific":false,"id":8,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[]},{"modSpecKey":"data.traits.languages.custom","value":"telepathy (30 ft.)","mode":"+","targetSpecific":false,"id":9,"itemId":"pzCpIjsuNVs8encY","active":false,"_targets":[]}]},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Killik.webp","effects":[{"_id":"EWQOMXrZbfi4zSPF","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Killik","mode":5,"priority":5},{"key":"data.abilities.int.value","value":2,"mode":2,"priority":20},{"key":"data.abilities.con.value","value":1,"mode":2,"priority":20},{"key":"data.traits.size","value":"med","mode":0,"priority":5},{"key":"data.attributes.movement.walk","value":"30","mode":5,"priority":5},{"key":"data.attributes.ac.value","value":"13+@abilities.dex.mod","mode":5,"priority":1},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"killik","mode":0,"priority":0},{"key":"data.traits.languages.custom","value":"telepathy (30 ft.)","mode":0,"priority":0},{"key":"flags.sw5e.strongLegged","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.extraArms","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Killik.webp","label":"Killik","tint":"","transfer":true}]}
+{"_id":"J7HJQkcvghtwMAdF","name":"Anzellan","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"
Biology and Appearance
\n
The anzellans are a diminutive species hailing from the secluded planet Anzella. Their eyes have floating corneal micro-lenses that allow them to see microscopic details. Anzellans are a bubbly and receptive people. They are a jovial and trusting people that tend to welcome strangers with open arms. Due to their volcanic homeworld, anzellans are also adapted towards heat. This, coupled with their small size, make them well-suited to working in compact places.
\n
Society and Culture
\n
Anzella is a tropical planet covered in thousands of small volcanic islands. Many of these islands are developed as small villages, with the largest islands designed to accommodate larger species. Anzellan culture is generally based around tourism and crafting; in fact, anzellans are renowned craftsmen due to their discerning eyesight and ability to fit into small spaces. Anzellan government is generally casual. Each village has its own governing council of rotating members; these villages act independently from one another unless their decisions would affect more than a single island. In that case, all of the councils work together to come to a planet-wide decision.
\n
Names
\n
Anzellan names are rarely longer than two syllables, with a bouncy intonation to them. Their surnames are familial.
Ability Score Increase. Your Intelligence score increases by 2, and two other ability scores of your choice increase by 1.
Age. Anzellans are considered adults at ten years old. They are a short-lived species, however, that rarely lives longer than 60 years.
Alignment. Anzellans are a friendly and respectful people, which causes them to tend toward lawful light side, though there are exceptions.
Size. Anzellans stand between 1 and 2 feet tall and weigh around 10 lbs. Regardless of your position in that range, your size is Tiny.
Speed. Your base walking speed is 20 feet.
Crafters. You have proficiency in one tool of your choice.
Detail Oriented. You are practiced at scouring for details. You have advantage on Intelligence (Investigation) checks within 5 feet.
Pintsized. Your tiny stature makes it hard for you to wield bigger weapons. You can't use medium or heavy shields. Additionally, you can't wield weapons with the two-handed or versatile property, and you can only wield one-handed weapons in two hands unless they have the light property.
Puny. Anzellans are too small to pack much of a punch. You have disadvantage on Strength saving throws, and when determining your bonus to attack and damage rolls for weapon attacks using Strength, you can't add more than +3.
Small and Nimble. You are too small and fast to effectively target. You have a +1 bonus to AC, and you have advantage on Dexterity saving throws.
Tanned. You are naturally adapted to hot climates, as described in chapter 5 of the Dungeon Master's Guide.
Technician. You are proficient in the Technology skill.
Tinker. You have proficiency with tinker's tools. You can use these and spend 1 hour and 100 cr worth of materials to construct a Tiny Device (AC 5, 1 hp). You can take the Use an Object action to have your device cause one of the following effects: create a small explosion, create a repeating loud noise for 1 minute, create smoke for 1 minute, create a soothing melody for 1 minute. You can maintain a number of these devices up to your proficiency bonus at once, and a device stops functioning after 24 hours away from you. You can dismantle the device to reclaim the materials used to create it.
Languages. You can speak, read, and write Galactic Basic and Anzellan. Anzellan is characterized by its bouncy sound and emphasis on alternating syllables.
","source":"Expanded Content"},"skinColorOptions":{"value":"Brown, green, or tan"},"hairColorOptions":{"value":"Black, gray, or white"},"eyeColorOptions":{"value":"Black"},"distinctions":{"value":"Diminutive size, wispy eyebrows"},"heightAverage":{"value":"1'0\""},"heightRollMod":{"value":"+2d6\""},"weightAverage":{"value":"3 lb."},"weightRollMod":{"value":"x1 lb."},"homeworld":{"value":"Anzella"},"slanguage":{"value":"Anzellan"},"damage":{"parts":[]},"armorproperties":{"parts":[]},"weaponproperties":{"parts":[]},"source":"EC"},"flags":{"dynamiceffects":{"equipActive":true,"effects":[{"modSpecKey":"data.details.species","value":"Anzellan","mode":"=","targetSpecific":false,"id":1,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Details Species"},{"modSpecKey":"data.abilities.int.value","value":"2","mode":"+","targetSpecific":false,"id":2,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Abilities Intelligence"},{"modSpecKey":"data.traits.size","value":"tin","mode":"=","targetSpecific":false,"id":3,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Size"},{"modSpecKey":"data.attributes.movement.walk","value":"20","mode":"=","targetSpecific":false,"id":4,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Attributes Speed"},{"modSpecKey":"data.attributes.ac.min","value":"1","mode":"+","targetSpecific":false,"id":5,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Attributes Armor Class Min"},{"modSpecKey":"data.skills.tec.value","value":"1","mode":"+","targetSpecific":false,"id":6,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Skills Technology"},{"modSpecKey":"data.traits.toolProf.custom","value":"Tinker's tools","mode":"+","targetSpecific":false,"id":7,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Tool Prof Custom"},{"modSpecKey":"data.traits.languages.value","value":"basic","mode":"+","targetSpecific":false,"id":8,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[],"label":"Traits Language"},{"modSpecKey":"data.traits.languages.value","value":"anzellan","mode":"+","targetSpecific":false,"id":9,"itemId":"bIEwmrB96DiRuntI","active":false,"_targets":[]}],"alwaysActive":false},"dae":{"activeEquipped":false,"alwaysActive":true}},"img":"systems/sw5e/packs/Icons/Species/Anzellan.webp","effects":[{"_id":"ZGdzAq1Gl4xaxDRD","flags":{"dae":{"transfer":true,"stackable":false}},"changes":[{"key":"data.details.species","value":"Anzellan","mode":5,"priority":5},{"key":"data.abilities.int.value","value":2,"mode":2,"priority":20},{"key":"data.traits.size","value":"tiny","mode":5,"priority":5},{"key":"data.attributes.movement.walk","value":20,"mode":5,"priority":5},{"key":"data.attributes.ac.value","value":1,"mode":2,"priority":20},{"key":"data.skills.tec.value","value":1,"mode":4,"priority":20},{"key":"data.traits.toolProf.custom","value":"Tinker's tools","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"basic","mode":0,"priority":0},{"key":"data.traits.languages.value","value":"anzellan","mode":0,"priority":0},{"key":"flags.sw5e.detailOriented","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.pintsized","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.puny","value":"1","mode":5,"priority":20},{"key":"flags.sw5e.tinker","value":"1","mode":5,"priority":20}],"disabled":false,"duration":{"startTime":null,"seconds":null,"rounds":null,"turns":null,"startRound":null,"startTurn":null},"icon":"systems/sw5e/packs/Icons/Species/Anzellan.webp","label":"Anzellan","tint":"","transfer":true}]}
+{"_id":"J7HJQkcvghtwMAdF","name":"Anzellan","permission":{"default":0,"IpSq6HI4edO6e0Yw":3},"type":"species","data":{"data":"$characteristics-table","description":{"value":"
Biology and Appearance
\n
The anzellans are a diminutive species hailing from the secluded planet Anzella. Their eyes have floating corneal micro-lenses that allow them to see microscopic details. Anzellans are a bubbly and receptive people. They are a jovial and trusting people that tend to welcome strangers with open arms. Due to their volcanic homeworld, anzellans are also adapted towards heat. This, coupled with their small size, make them well-suited to working in compact places.
\n
Society and Culture
\n
Anzella is a tropical planet covered in thousands of small volcanic islands. Many of these islands are developed as small villages, with the largest islands designed to accommodate larger species. Anzellan culture is generally based around tourism and crafting; in fact, anzellans are renowned craftsmen due to their discerning eyesight and ability to fit into small spaces. Anzellan government is generally casual. Each village has its own governing council of rotating members; these villages act independently from one another unless their decisions would affect more than a single island. In that case, all of the councils work together to come to a planet-wide decision.
\n
Names
\n
Anzellan names are rarely longer than two syllables, with a bouncy intonation to them. Their surnames are familial.
Ability Score Increase. Your Intelligence score increases by 2, and two other ability scores of your choice increase by 1.
Age. Anzellans are considered adults at ten years old. They are a short-lived species, however, that rarely lives longer than 60 years.
Alignment. Anzellans are a friendly and respectful people, which causes them to tend toward lawful light side, though there are exceptions.
Size. Anzellans stand between 1 and 2 feet tall and weigh around 10 lbs. Regardless of your position in that range, your size is Tiny.
Speed. Your base walking speed is 20 feet.
Crafters. You have proficiency in one tool of your choice.
Detail Oriented. You are practiced at scouring for details. You have advantage on Intelligence (Investigation) checks within 5 feet.
Pintsized. Your tiny stature makes it hard for you to wield bigger weapons. You can't use medium or heavy shields. Additionally, you can't wield weapons with the two-handed or versatile property, and you can only wield one-handed weapons in two hands unless they have the light property.
Puny. Anzellans are too small to pack much of a punch. You have disadvantage on Strength saving throws, and when determining your bonus to attack and damage rolls for weapon attacks using Strength, you can't add more than +3.
Small and Nimble. You are too small and fast to effectively target. You have a +1 bonus to AC, and you have advantage on Dexterity saving throws.
Tanned. You are naturally adapted to hot climates, as described in chapter 5 of the Dungeon Master's Guide.
Technician. You are proficient in the Technology skill.
Tinker. You have proficiency with tinker's tools. You can use these and spend 1 hour and 100 cr worth of materials to construct a Tiny Device (AC 5, 1 hp). You can take the Use an Object action to have your device cause one of the following effects: create a small explosion, create a repeating loud noise for 1 minute, create smoke for 1 minute, create a soothing melody for 1 minute. You can maintain a number of these devices up to your proficiency bonus at once, and a device stops functioning after 24 hours away from you. You can dismantle the device to reclaim the materials used to create it.
Languages. You can speak, read, and write Galactic Basic and Anzellan. Anzellan is characterized by its bouncy sound and emphasis on alternating syllables.
You attempt to freeze one creature that you can see within range into carbonite. The creature must make a Constitution saving throw. On a failed save, it is restrained as its flesh begins to harden. On a successful save, the creature isn't affected.
\n
A creature restrained by this power must make another Constitution saving throw at the end of each of its turns. If it successfully saves against this power three times, the power ends. If it fails its saves three times, it is turned to stone and subjected to the petrified condition for the duration. The successes and failures don't need to be consecutive; keep track of both until the target collects three of a kind.
\n
If the creature is physically broken while frozen in carbonite, it suffers from similar deformities if it reverts to its original state.
\n
If you maintain your concentration on this power for the entire possible duration, the creature is frozen in carbonite until the effect is removed.
You choose one droid or construct you can see within range and scramble its ability to differentiate targets. The target must make an Intelligence saving throw. If the construct has the 'Piloted' trait, and has a pilot controlling it that is not incapacitated, it gains a bonus to the saving throw equal to the pilot's Intelligence modifier. On a failed save, the target loses the ability to distinguish friend from foe, regarding all creatures it can see as enemies until the power ends. Each time the target takes damage, it can repeat the saving throw, ending the effect on itself on a success.
\n
Whenever the affected creature chooses another creature as a target, it must choose the target at random from among the creatures it can see within range of the attack, power, or other ability it's using. If an enemy provokes an opportunity attack from the affected creature, the creature must make that attack if it is able to.
You touch a creature that has died within the last minute and administer a shock to restore it to life. That creature returns to life with 1 hit point. This power can't return to life a creature that has died of old age, nor can it restore any missing body parts. If the creature is lacking body parts or organs integral for its survival�its head, for instance�the power automatically fails. Once this power has restored a creature to life, it cannot benefit from this power again until it finishes a short or long rest.
Choose up to three creatures within range, none of whom can be more than 10 feet apart. If you choose three creatures, each target must succeed on a Dexterity saving throw or take 1d4 energy damage. If you choose two creatures, each target takes 1d6 energy damage on a failed save instead. If you choose only one creature, the target takes 1d8 energy damage on a failed save.
\n
This power's damage increases by one die when you reach 5th level (two dice), 11th level (three dice), and 17th level (four dice).
Choose one creature you can see and one damage type: acid, cold, fire, lightning, or sonic. The target must make a Constitution saving throw. If it fails, the first time on each turn when it takes damage of the chosen type, it takes an extra 2d6 damage of it. The target also loses resistance to the type until the power ends.
\n
Overcharge Tech. You can target one additional creature for each slot level above 4th. The creatures must be within 30 feet of each other when you target them.
This power creates a perfect duplicate of any written, drawn, or digital visual, audio or text-based data that you touch onto a datapad or datacard you supply. You can copy up to 10 pages of text or 10 minutes of visual or audio data with one casting of this power. Enhanced documents, such as datacrons, blueprints, or encrypted documents, can't be copied with this power.
As a part of the action used to cast this power, you must make a ranged weapon attack against one creature within your weapon's range, otherwise the power fails. On a hit, the target suffers the attack's normal effects and becomes shocked until the end of your next turn. When this power hits a target, if there is a creature within 30 feet who is shocked, an arc of lightning courses between the two creatures, dealing 1d6 lightning damage to both of them. If there are multiple other creatures who are shocked, the lightning leaps to the closest creature.
\n
The power's damage increases when you reach higher levels. At 5th level, the effects of both the ranged weapon attack and discharge deal an extra 1d6 lightning damage. Both damage rolls increase by an additional 1d6 at 11th and 17th level.
In an open container, you can create up to 10 gallons of drinkable water. You may also produce a rain that falls within a 30-foot cube and extinguishes open-air flames. You can destroy the same amount of water in an open container, or destroy a 30-foot cube of fog.
\n
Overcharge Tech. When you cast this power using a tech slot of 2nd level or higher, the amount of water you can create increases by 10 gallons, or the size of the cube increases by 5 feet, for each slot level above 1st.
An immobile, Invisible, cube-shaped prison composed of energy springs into existence around an area you choose within range. The prison can be a cage or a solid box as you choose.
\n
A prison in the shape of a cage can be up to 20 feet on a side and is made from 1/2-inch diameter bars spaced 1/2 inch apart.
\n
A prison in the shape of a box can be up to 10 feet on a side, creating a solid barrier that prevents any matter from passing through it and blocking any powers cast into or out of the area.
\n
When you cast the power, any creature that is completely inside the cage's area is trapped. Creatures only partially within the area, or those too large to fit inside the area, are pushed away from the center of the area until they are completely outside the area.
\n
A creature inside the cage can't leave it by unenhanced means. If the creature tries to teleport to leave the cage, it must first make a Charisma saving throw. On a success, the creature can use that power to exit the cage. On a failure, the creature can't exit the cage and wastes the use of the power or effect.
As part of the action used to cast this power, you must make a melee weapon attack against one creature within your reach, otherwise the power fails. On a hit, the target suffers the attack's normal effects, and you begin to emanate a disturbing hum. If a hostile creature ends its turn within 5 feet of you before the start of your next turn, it takes 1d4 sonic damage.
\n
This power's damage increases when you reach higher levels. At 5th level, the melee attack deals an extra 1d8 sonic damage to the target, and the secondary damage increases by 1d4. Both damage rolls increase by 1d8 and 1d4, respectively, at 11th level and 17th level.
Choose one droid or construct that you can see within range. The target can immediately use its reaction to regain hit points equal to 1d6 + your techcasting ability modifier.
\n
Overcharge Tech. When you cast this power using a tech slot of 2nd level or higher, the healing increases by 1d6 for each slot level above 1st.
","chat":"","unidentified":""},"requirements":"","source":"EC","activation":{"type":"bonus","cost":1,"condition":""},"duration":{"value":null,"units":"inst"},"target":{"value":1,"width":null,"units":"","type":"droid"},"range":{"value":60,"long":null,"units":"ft"},"uses":{"value":"0","max":"0","per":""},"consume":{"type":"","target":"","amount":null},"ability":"","actionType":"heal","attackBonus":0,"chatFlavor":"","critical":null,"damage":{"parts":[["1d6+@abilities.int.mod","healing"]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":1,"school":"tec","components":{"value":"","vocal":false,"somatic":false,"material":false,"ritual":false,"concentration":false},"materials":{"value":"","consumed":false,"cost":0,"supply":0},"preparation":{"mode":"prepared","prepared":true},"scaling":{"mode":"level","formula":"1d6"}},"flags":{"core":{"sourceId":"Item.xI9OeBQggss4H0AI"}},"img":"systems/sw5e/packs/Icons/Tech%20Powers/Aid%20Droid.webp","effects":[],"_id":"aW2gm0t0dNq2YMcm"}
{"_id":"b0T7rxNgDtGx3mwh","name":"Stack the Deck","permission":{"default":0},"type":"power","data":{"description":{"value":"
You boost up to three creatures of your choice within range. Whenever a target makes an attack roll or a saving throw before the power ends, the target can roll a d4 and add the number rolled to the attack roll or saving throw.
\n
Overcharge Tech. When you cast this power with a tech slot of 2nd level or higher, you can target one additional creature for every two slot levels above 1st. When you cast this power at 3rd level or higher, the die size increases for every two slot levels above 1st (d6 at 3rd level, d8 at 5th level, d10 at 7th level).
You cover the ground in a 10-foot square within range in oil. For the duration, it is difficult terrain.
\n
When the oil appears, each creature standing in its area must succeed on a Dexterity saving throw or fall prone. A creature that enters the area or ends its turn there must also succeed on a Dexterity saving throw.
\n
The oil is flammable. Any 5 foot square of the oil exposed to fire burns away in one round. Each creature who enters the fire or starts it turn there must make a Dexterity saving throw, taking 3d6 fire damage on a failed save, or half as much on a successful one. The fire ignites any flammable objects in the area that aren't being worn or carried.
The power captures some of the incoming energy, lessening its effect on you and storing it for your next melee attack. You have resistance to the triggering damage type until the start of your next turn. Also, the first time you hit with a melee attack on your next turn, the target takes an extra 1d6 damage of the triggering type, and the power ends.
\n
Overcharge Tech. When you cast this power using a power slot of 2nd level or higher, the extra damage increases by 1d6 for each slot level above 1st.
\n","chat":"","unidentified":""},"source":"PHB","activation":{"type":"reaction","cost":1,"condition":"which you take when you take acid, cold, energy, fire, ion, kinetic, lightning, or sonic damage"},"duration":{"value":1,"units":"round"},"target":{"value":1,"units":"","type":"creature"},"range":{"value":null,"long":null,"units":"self"},"uses":{"value":0,"max":"0","per":""},"consume":{"type":"","target":"","amount":null},"ability":"int","actionType":"util","attackBonus":null,"chatFlavor":"","critical":null,"damage":{"parts":[["1d6",""]],"versatile":""},"formula":"","save":{"ability":"","dc":null,"scaling":"power"},"level":1,"school":"tec","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":"1d6"}},"flags":{"exportSource":{"world":"sw5e","system":"sw5e","coreVersion":"0.6.6","systemVersion":0.98}},"img":"systems/sw5e/packs/Icons/Tech%20Powers/AbsorbEnergy.webp","effects":[]}
@@ -190,6 +192,7 @@
{"_id":"to84bBMy9F4zYZ5I","name":"Combustive Shot","permission":{"default":0},"type":"power","data":{"description":{"value":"
As part of the action used to cast this power, you must make a ranged weapon attack against one creature within your weapon's range, otherwise the power fails. On a hit, the target suffers the attack's normal effects, and it ignites in flame. At the start of your next turn, the creature takes fire damage equal to your techcasting ability modifier. If the target or a creature within 5 feet of it uses an action to put out the flames, or if some other effect douses the flames, the effect ends.
\n
This power's damage increases when you reach higher levels. At 5th level, the ranged attack deals an extra 1d6 fire damage to the target, and the damage at the start of your next turn increases to 1d4 + your tech casting ability modifier. Both damage rolls increase by 1d6 and 1d4, respectively, at 11th level and 17th level.
Dim, greenish light spreads within a 30-foot-radius sphere centered on a point you choose within range. The light spreads around corners, and it lasts until the power ends.
\n
When a creature moves into the power's area for the first time on a turn or starts its turn there, that creature must succeed on a Constitution saving throw or take 4d10 necrotic damage, and it suffers one level of exhaustion and emits a dim, greenish light in a 5-foot radius. This light makes it impossible for the creature to benefit from being invisible. The light and any levels of exhaustion caused by this power go away when the power ends.
You generate a static charge that can aid or harm a creature you touch. Make a melee tech attack against the target. On a hit, the target takes 1d10 lightning damage. If the target is a living creature that has 0 hit points, it immediately gains one death saving throw success instead of taking damage.
\n
This power's damage increases by 1d10 when you reach 5th level (2d10), 11th level (3d10), and 17th level (4d10).
You alter your form with tech. When you cast the power, choose one of the following options, the effects of which last for the duration of the power. While the power lasts, you can end one option as an action to gain the benefits of a different one.
\n
Aquatic Adaptation. You adapt your body to an aquatic environment. You can breathe underwater and gain a swimming speed equal to your walking speed.
\n
Change Appearance. You transform your appearance. You decide what you look like, including your height, weight, facial features, sound of your voice, hair length, coloration, and distinguishing characteristics, if any. You can make yourself appear as a member of another species (an organic species cannot appear as a droid, or vice versa), though none of your statistics change. You can also alter your vocal cords, enabling you to speak a language you know, but otherwise would be incapable of speaking. You also can’t appear as a creature of a different size than you, and your basic shape stays the same; if you’re bipedal, you can’t use this power to become quadrupedal, for instance. At any time for the duration of the power, you can use your action to change your appearance in this way again.
\n
Natural Weapons. You grow claws, fangs, spines, horns, or a different natural weapon of your choice. Your damage die for your unarmed strikes increases by one step (from 1 to d4, d4 to d6, or d6 to d8). Your unarmed strikes are considered enhanced and you have a +1 bonus to attack and damage rolls with them.
As you expel kolto, up to six creatures of your choice that you can see within range regain hit points equal to 1d4 + your techcasting ability modifier. This power has no effect on droids or constructs.
\n
Overcharge Tech. When you cast this power using a tech slot of 4th level or higher, the healing increases by 1d4 for each slot level above 3rd.
You create a delayed explosion at a point within range. When the power ends, either because your concentration is broken or because you decide to end it, the explosion occurs. Each creature in a 20-foot-radius sphere centered on that point must make a Dexterity saving throw. A creature takes fire damage equal to the total accumulated damage on a failed save, or half as much damage on a successful one.
\n
The power's base damage is 12d6. If at the end of your turn the explosion has not yet occurred, the damage increases by 1d6.
\n
If the explosion is touched before the interval has expired, the creature touching it must make a Dexterity saving throw. On a failed save, the power ends immediately, causing the explosion.
\n
The fire spreads around corners. It ignites flammable objects in the area that aren't being worn or carried.
\n
Overcharge Tech. When you cast this power using a tech slot of 8th level or higher, the base damage increases by 1d6 for each slot level above 7th.
You create up to four orbs of light within range that hover in the air for the duration. You can also combine the four lights into one glowing vaguely humanoid form of Medium size. Whichever form you choose, each light sheds dim light in a 10-foot radius.
\n
As a bonus action on your turn, you can move the lights up to 60 feet to a new spot within range. A light must be within 20 feet of another light created by this power, and a light winks out if it exceeds the power's range.
You launch a grappling wire toward a creature you can see within range. Make a melee tech attack against the target. If the attack hits, the creature takes 1d6 kinetic damage, and if the creature is Large or smaller, you pull the creature up to 10 feet closer to you.
\n
This power's damage increases by 1d6 when you reach 5th level (2d6), 11th level (3d6), and 17th level (4d6).
Name or describe a person, place, or object. This power gives you a summary of significant lore about it. If the thing you named isn't known outside of one planetary system, you gain no information. The more information you already have, the more detailed the information you receive is.
You alter your body with tech, temporarily gaining new properties which last for the duration. You can select three of the following properties. You cannot select a property more than once, unless that property says otherwise.
\n
\n
Your body becomes more flexible. You have advantage on ability checks and saving throws against effects that would grapple or restrain you, and your movement is unaffected by difficult terrain or squeezing.
\n
You grow one additional appendage. This appendage serves as an arm and a hand, though it can take the shape of a limb, tentacle, or similar appendage. You can select this property twice to grow a maximum number of two appendages. You can only gain the benefit of items held by two of your arms at any given time, and once per round you can switch which arms you are benefiting from (no action required).
\n
You sprout antennae that give you tremorsense out to a range of 30 feet.
\n
You extend the length of your limbs. When you make a melee attack or attempt to grapple, shove, or trip a creature on your turn, your reach for it is 5 feet greater than normal.
\n
You gain a burrowing speed equal to your walking speed.
\n
Your flesh hardens. Your AC can't be less than 16, regardless of what kind of armor you're wearing.
\n
You can gain the benefits of any one option of the alter self power. You can select this property multiple times to gain the benefits of multiple options of the alter self power, choosing a different option each time.
\n
You gain the effect of the magnetic hold power, but you can affix to and move along any surface, instead of only metallic surfaces. You have a climbing speed equal to your walking speed.
\n
You can gain any one effect of the force enlightenment power.
\n
\n
Overcharge Tech. When you cast this power using a tech slot of 4th level or higher, you can select an additional property for each slot level above 3rd.
As part of the action used to cast this power, you must make a melee weapon attack against one creature within your reach, otherwise the power fails. On a hit, the target suffers the attack's normal effects, and if you were hidden from it, it takes an additional 1d4 poison damage.
\n
This power's damage increases when you reach higher levels. At 5th level, the melee attack deals an extra 1d8 poison damage to the target, and the damage the target takes when you are hidden from it increases to 2d4. Both damage rolls increase by 1d8 and 1d4, respectively, at 11th level and 17th level.
Choose a creature that you can see within range. A surge of kolto energy washes over the creature, causing it to regain 70 hit points. This power also ends blindness, deafness, and any diseases affecting the target. This power has no effect on droids or constructs.
\n
Overcharge Tech. When you cast this power using a tech slot of 7th level or higher, the amount of healing increases by 10 for each slot level above 6th.
The needler includes a specialized compartment for poison. One dose of poison, when installed in this compartment, retains its potency for 1 hour before drying. One dose of poison is effective for the next 10 shots fired by the weapon.
The tranquilizer rifle includes a specialized compartment for poison. One dose of poison, when installed in this compartment, retains its potency for 1 hour before drying. One dose of poison is effective for the next 4 shots fired by the weapon.
The retrosaber is an ancient type of lightweapon that requires a power cell to function. Once four attacks have been made with a retrosaber, a character must replace the power cell using an action or bonus action (the character’s choice). You must have one free hand to replace the power cell.
The IWS is a heavy weapon that can fire in three different modes. On your turn, you can use your object interaction to switch between modes, detailed below.
\n
Antiarmor. While in this mode, rather than traditional power cells, the IWS fires grenades. When firing a grenade at long range, creatures within the radius of the grenade’s explosion have advantage on the saving throw.
\n
Blaster. While in this mode, the weapon uses traditional power cells.
\n
Sniper. While in this mode, the weapon uses traditional power cells.
\n
\n
Antiarmor: Special, Ammunition (range 60/240), reload 1, special
Rather than traditional power cells, the torpedo launcher fires specialized projectiles in the form of torpedoes. Torpedo launchers have advantage on attack rolls against Gargantuan creatures and disadvantage on attack rolls again Large and smaller creatures. Unlike other weapons, the torpedo launcher can only be loaded using an action, and you don’t add your Dexterity modifier to damage rolls you make with it.
\n
Before firing the torpedo launcher, you must first use your action to deploy it. While deployed, your speed is reduced by half. You can collapse the torpedo launcher as a bonus action.
Rather than traditional power cells, the torpedo launcher fires specialized projectiles in the form of torpedoes. Torpedo launchers have advantage on attack rolls against Gargantuan creatures and disadvantage on attack rolls again Large and smaller creatures. Unlike other weapons, the torpedo launcher can only be loaded using an action, and you don’t add your Dexterity modifier to damage rolls you make with it.
\n
Before firing the torpedo launcher, you must first use your action to deploy it. While deployed, your speed is reduced by half. You can collapse the torpedo launcher as a bonus action.
A Large or smaller creature hit by a net is restrained until it is freed. A net has no effect on formless or Huge or larger creatures. A creature can use its action to make a DC 13 Strength check, freeing itself or another creature within its reach on a success. The net has an AC of 10, 5 hit points, and immunity to all damage not dealt by melee weapons. Destroying the net frees the creature without harming it and immediately ends the net's effects. While a creature is restrained by a net, you can make no further attacks with it.
Mounted by the shoulder slot, a shoulder cannon does not require a free hand to use. Additionally, you have advantage on Strength ability checks and saving throws to avoid being disarmed of this weapon.
When you would make a Strength (Athletics) check to attempt to grapple a creature while wielding a weapon with the grappling property, you can instead make a melee weapon attack with it. If the attack hits, the creature becomes grappled by you, and it takes damage equal to your Strength modifier of the same type as the weapon’s damage.
Mounted by the shoulder slot, a shoulder cannon does not require a free hand to use. Additionally, you have advantage on Strength ability checks and saving throws to avoid being disarmed of this weapon.
When you would make a Strength (Athletics) check to attempt to grapple a creature while wielding a weapon with the grappling property, you can instead make a melee weapon attack with it. If the attack hits, the creature becomes grappled by you, and it takes damage equal to your Strength modifier of the same type as the weapon’s damage.
The IWS is a heavy weapon that can fire in three different modes. On your turn, you can use your object interaction to switch between modes, detailed below.
\n
Antiarmor. While in this mode, rather than traditional power cells, the IWS fires grenades. When firing a grenade at long range, creatures within the radius of the grenade’s explosion have advantage on the saving throw.
\n
Blaster. While in this mode, the weapon uses traditional power cells.
\n
Sniper. While in this mode, the weapon uses traditional power cells.
\n
\n
Antiarmor: Special, Ammunition (range 60/240), reload 1, special
You have disadvantage when you use a vibrolance to attack a target within 5 feet of you. Also, a lance requires two hands to wield when you aren't mounted.
Rather than traditional power cells, the rocket launcher fires specialized projectiles in the form of rockets. When firing a rocket at long range, or if you don’t meet the rocket launcher’s strength requirement, creatures within the radius of the rocket’s explosion have advantage on the saving throw.
The vapor projector does not make attack rolls. Rather than traditional power cells, the vapor projector uses specialized projector tanks, which, when fired, spray an area with the contents of the tank. Projector tanks require your target to make a saving throw to resist the tank’s effects. It can have different ammunition types loaded simultaneously, and you can choose which ammunition you’re using as you fire it (no action required). If you don’t meet the vapor projector’s strength requirement, creatures have advantage on their saving throws. If you lack proficiency in the vapor projector, you must roll the damage dice twice and take the lesser total.
The vapor projector does not make attack rolls. Rather than traditional power cells, the vapor projector uses specialized projector tanks, which, when fired, spray an area with the contents of the tank. Projector tanks require your target to make a saving throw to resist the tank’s effects. It can have different ammunition types loaded simultaneously, and you can choose which ammunition you’re using as you fire it (no action required). If you don’t meet the vapor projector’s strength requirement, creatures have advantage on their saving throws. If you lack proficiency in the vapor projector, you must roll the damage dice twice and take the lesser total.
A Large or smaller creature hit by a bolas is restrained until it is freed. A bolas has no effect on formless or Huge or larger creatures. A creature can use its action to make a DC 13 Dexterity check, freeing itself or another creature within its reach on a success. The bolas has an AC of 10, 5 hit points, and immunity to all damage not dealt by melee weapons. Destroying the bolas frees the creature without harming it and immediately ends the bolas’s effects. While a creature is restrained by a bolas, you can make no further attacks with it.
A Large or smaller creature hit by a bolas is restrained until it is freed. A bolas has no effect on formless or Huge or larger creatures. A creature can use its action to make a DC 13 Dexterity check, freeing itself or another creature within its reach on a success. The bolas has an AC of 10, 5 hit points, and immunity to all damage not dealt by melee weapons. Destroying the bolas frees the creature without harming it and immediately ends the bolas’s effects. While a creature is restrained by a bolas, you can make no further attacks with it.
Rather than traditional power cells, the grenade launcher fires grenades. When firing a grenade at long range, or if you don’t meet the grenade launcher’s strength requirement, creatures within the radius of the grenade’s explosion have advantage on the saving throw. If you lack proficiency in the grenade launcher, you must roll the damage dice twice and take the lesser total.
The bo-rifle is a lasat weapon most commonly carried by the Honor Guard of Lasan, which has the unique property of functioning as both a rifle and a staff. On your turn, you can use your object interaction to switch between modes, detailed below.
\n
Rifle. While in this mode, the weapon uses traditional power cells.
\n
Staff. While in this mode, the weapon gains the shocking 13 property.
Rather than traditional power cells, the rotary cannon uses specialized power generator that allow it to fire continuously for 10 minutes. Replacing a power generator takes an action.
\n
The rotary cannon requires the use of a tripod unless you meet its strength requirement, which is included in the price. Over the course of 1 minute, you can deploy or collapse the rotary cannon on the tripod. While deployed, your speed is reduced to 0.
The bo-rifle is a lasat weapon most commonly carried by the Honor Guard of Lasan, which has the unique property of functioning as both a rifle and a staff. On your turn, you can use your object interaction to switch between modes, detailed below.
\n
Rifle. While in this mode, the weapon uses traditional power cells.
\n
Staff. While in this mode, the weapon gains the shocking 13 property.
The IWS is a heavy weapon that can fire in three different modes. On your turn, you can use your object interaction to switch between modes, detailed below.
\n
Antiarmor. While in this mode, rather than traditional power cells, the IWS fires grenades. When firing a grenade at long range, creatures within the radius of the grenade’s explosion have advantage on the saving throw.
\n
Blaster. While in this mode, the weapon uses traditional power cells.
\n
Sniper. While in this mode, the weapon uses traditional power cells.
\n
\n
Antiarmor: Special, Ammunition (range 60/240), reload 1, special
The flechette cannon does not make attack rolls. Rather than traditional power cells, the flechette cannon uses specialized cannon tanks, which, when fired, spray an area with the contents of the tank. Projector tanks require your target to make a saving throw to resist the tank’s effects. It can have different ammunition types loaded simultaneously, and you can choose which ammunition you’re using as you fire it (no action required). If you don’t meet the flechette cannon’s strength requirement, creatures have advantage on their saving throws. If you lack proficiency in the flechette cannon, you must roll the damage dice twice and take the lesser total.