ENH: Dialog for weapon range
parent
cb583d9154
commit
f7531d48a3
|
@ -16,13 +16,13 @@ export class OseItem extends Item {
|
|||
}
|
||||
|
||||
static chatListeners(html) {
|
||||
html.on('click', '.card-buttons button', this._onChatCardAction.bind(this));
|
||||
html.on('click', '.item-name', this._onChatCardToggleContent.bind(this));
|
||||
html.on("click", ".card-buttons button", this._onChatCardAction.bind(this));
|
||||
html.on("click", ".item-name", this._onChatCardToggleContent.bind(this));
|
||||
}
|
||||
|
||||
getChatData(htmlOptions) {
|
||||
const data = duplicate(this.data.data);
|
||||
|
||||
|
||||
// Rich text description
|
||||
data.description = TextEditor.enrichHTML(data.description, htmlOptions);
|
||||
|
||||
|
@ -34,11 +34,7 @@ export class OseItem extends Item {
|
|||
props.push(data.qualities);
|
||||
}
|
||||
if (this.data.type == "spell") {
|
||||
props.push(
|
||||
`${data.class} ${data.lvl}`,
|
||||
data.range,
|
||||
data.duration
|
||||
);
|
||||
props.push(`${data.class} ${data.lvl}`, data.range, data.duration);
|
||||
}
|
||||
if (data.hasOwnProperty("equipped")) {
|
||||
props.push(data.equipped ? "Equipped" : "Not Equipped");
|
||||
|
@ -50,19 +46,58 @@ export class OseItem extends Item {
|
|||
}
|
||||
|
||||
rollWeapon(skipDialog) {
|
||||
let isNPC = this.actor.data.type != 'character';
|
||||
if (this.data.data.missile && !isNPC) {
|
||||
this.actor.rollAttack({type: 'missile', label: this.name, dmg: this.data.data.damage}, {event: {ctrlKey: skipDialog}});
|
||||
} else if (this.data.data.melee && !isNPC) {
|
||||
this.actor.rollAttack({type: 'melee', label: this.name, dmg: this.data.data.damage}, {event: {ctrlKey: skipDialog}});
|
||||
} else {
|
||||
this.actor.rollAttack({type: 'raw', label: this.name, dmg: this.data.data.damage}, {event: {ctrlKey: skipDialog}});
|
||||
let isNPC = this.actor.data.type != "character";
|
||||
const data = this.data.data;
|
||||
let type = "raw";
|
||||
if (data.missile && data.melee && !isNPC) {
|
||||
// Dialog
|
||||
new Dialog({
|
||||
title: "Choose Attack Range",
|
||||
content: '',
|
||||
buttons: {
|
||||
melee: {
|
||||
icon: '<i class="fas fa-fist-raised"></i>',
|
||||
label: "Melee",
|
||||
callback: () => {
|
||||
this.actor.rollAttack(
|
||||
{ type: "melee", label: this.name, dmg: this.data.data.damage },
|
||||
{ event: { ctrlKey: skipDialog } }
|
||||
);
|
||||
},
|
||||
},
|
||||
missile: {
|
||||
icon: '<i class="fas fa-bullseye"></i>',
|
||||
label: "Missile",
|
||||
callback: () => {
|
||||
this.actor.rollAttack(
|
||||
{
|
||||
type: "missile",
|
||||
label: this.name,
|
||||
dmg: this.data.data.damage,
|
||||
},
|
||||
{ event: { ctrlKey: skipDialog } }
|
||||
);
|
||||
},
|
||||
},
|
||||
},
|
||||
default: "melee",
|
||||
}).render(true);
|
||||
return true;
|
||||
} else if (data.missile && !isNPC) {
|
||||
type = "missile";
|
||||
} else if (data.melee && !isNPC) {
|
||||
type = "melee";
|
||||
}
|
||||
this.actor.rollAttack(
|
||||
{ type: type, label: this.name, dmg: this.data.data.damage },
|
||||
{ event: { ctrlKey: skipDialog } }
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
async rollFormula(options={}) {
|
||||
if ( !this.data.data.roll ) {
|
||||
async rollFormula(options = {}) {
|
||||
if (!this.data.data.roll) {
|
||||
throw new Error("This Item does not have a formula to roll!");
|
||||
}
|
||||
|
||||
|
@ -74,7 +109,7 @@ export class OseItem extends Item {
|
|||
...{
|
||||
rollData: {
|
||||
type: "Formula",
|
||||
blindroll: this.data.data.blindroll
|
||||
blindroll: this.data.data.blindroll,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -96,7 +131,7 @@ export class OseItem extends Item {
|
|||
* @return {Promise}
|
||||
*/
|
||||
async roll({ skipDialog = false } = {}) {
|
||||
if (this.data.type == 'weapon') {
|
||||
if (this.data.type == "weapon") {
|
||||
if (this.rollWeapon(skipDialog)) return;
|
||||
}
|
||||
// Basic template rendering data
|
||||
|
@ -111,7 +146,7 @@ export class OseItem extends Item {
|
|||
hasDamage: this.hasDamage,
|
||||
isSpell: this.data.type === "spell",
|
||||
hasSave: this.hasSave,
|
||||
config: CONFIG.OSE
|
||||
config: CONFIG.OSE,
|
||||
};
|
||||
|
||||
// Render the chat card template
|
||||
|
@ -153,11 +188,10 @@ export class OseItem extends Item {
|
|||
if (content.style.display == "none") {
|
||||
$(content).slideDown(200);
|
||||
} else {
|
||||
$(content).slideUp(200);
|
||||
$(content).slideUp(200);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static async _onChatCardAction(event) {
|
||||
event.preventDefault();
|
||||
|
||||
|
@ -166,41 +200,44 @@ export class OseItem extends Item {
|
|||
button.disabled = true;
|
||||
const card = button.closest(".chat-card");
|
||||
const messageId = card.closest(".message").dataset.messageId;
|
||||
const message = game.messages.get(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;
|
||||
if (!(isTargetted || game.user.isGM || message.isAuthor)) return;
|
||||
|
||||
// Get the Actor from a synthetic Token
|
||||
const actor = this._getChatCardActor(card);
|
||||
if ( !actor ) return;
|
||||
if (!actor) return;
|
||||
|
||||
// Get the Item
|
||||
const item = actor.getOwnedItem(card.dataset.itemId);
|
||||
if ( !item ) {
|
||||
return ui.notifications.error(`The requested item ${card.dataset.itemId} no longer exists on Actor ${actor.name}`)
|
||||
if (!item) {
|
||||
return ui.notifications.error(
|
||||
`The requested item ${card.dataset.itemId} no longer exists on Actor ${actor.name}`
|
||||
);
|
||||
}
|
||||
|
||||
// Get card targets
|
||||
let targets = [];
|
||||
if ( isTargetted ) {
|
||||
if (isTargetted) {
|
||||
targets = this._getChatCardTargets(card);
|
||||
}
|
||||
|
||||
// Attack and Damage Rolls
|
||||
if ( action === "damage" ) await item.rollDamage({event});
|
||||
else if ( action === "formula" ) await item.rollFormula({event});
|
||||
|
||||
if (action === "damage") await item.rollDamage({ event });
|
||||
else if (action === "formula") await item.rollFormula({ event });
|
||||
// Saving Throws for card targets
|
||||
else if ( action == "save" ) {
|
||||
if ( !targets.length ) {
|
||||
ui.notifications.warn(`You must have one or more controlled Tokens in order to use this option.`);
|
||||
return button.disabled = false;
|
||||
else if (action == "save") {
|
||||
if (!targets.length) {
|
||||
ui.notifications.warn(
|
||||
`You must have one or more controlled Tokens in order to use this option.`
|
||||
);
|
||||
return (button.disabled = false);
|
||||
}
|
||||
for ( let t of targets ) {
|
||||
await t.rollSave(button.dataset.save, {event});
|
||||
for (let t of targets) {
|
||||
await t.rollSave(button.dataset.save, { event });
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -209,7 +246,6 @@ export class OseItem extends Item {
|
|||
}
|
||||
|
||||
static _getChatCardActor(card) {
|
||||
|
||||
// Case 1 - a synthetic actor from a Token
|
||||
const tokenKey = card.dataset.tokenId;
|
||||
if (tokenKey) {
|
||||
|
@ -230,8 +266,11 @@ export class OseItem extends Item {
|
|||
static _getChatCardTargets(card) {
|
||||
const character = game.user.character;
|
||||
const controlled = canvas.tokens.controlled;
|
||||
const targets = controlled.reduce((arr, t) => t.actor ? arr.concat([t.actor]) : arr, []);
|
||||
if ( character && (controlled.length === 0) ) targets.push(character);
|
||||
const targets = controlled.reduce(
|
||||
(arr, t) => (t.actor ? arr.concat([t.actor]) : arr),
|
||||
[]
|
||||
);
|
||||
if (character && controlled.length === 0) targets.push(character);
|
||||
return targets;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue