Merge branch 'dev' into dev_gennpc
# Conflicts: # system/styles/l5r5e.css # system/templates/actors/character/identity.html
This commit is contained in:
@@ -113,6 +113,13 @@ export class ArmySheetL5r5e extends BaseSheetL5r5e {
|
||||
return;
|
||||
}
|
||||
|
||||
// Casualties/Panic +/-
|
||||
html.find(".addsub-control").on("click", this._modifyCasualtiesOrPanic.bind(this));
|
||||
|
||||
if (this.actor.data.data.soft_locked) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete the linked Actor (warlord/commander)
|
||||
html.find(".actor-remove-control").on("click", this._removeLinkedActor.bind(this));
|
||||
}
|
||||
@@ -152,7 +159,7 @@ export class ArmySheetL5r5e extends BaseSheetL5r5e {
|
||||
*/
|
||||
async _onDrop(event) {
|
||||
// *** Everything below here is only needed if the sheet is editable ***
|
||||
if (!this.isEditable) {
|
||||
if (!this.isEditable || this.actor.data.data.soft_locked) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -184,7 +191,7 @@ export class ArmySheetL5r5e extends BaseSheetL5r5e {
|
||||
*/
|
||||
async _onDropActors(type, event) {
|
||||
// *** Everything below here is only needed if the sheet is editable ***
|
||||
if (!this.isEditable) {
|
||||
if (!this.isEditable || this.actor.data.data.soft_locked) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -270,4 +277,53 @@ export class ArmySheetL5r5e extends BaseSheetL5r5e {
|
||||
}
|
||||
return this.actor.update({ data: actorData });
|
||||
}
|
||||
|
||||
/**
|
||||
* Add or Subtract Casualties/Panic (+/- buttons)
|
||||
* @param {Event} event
|
||||
* @private
|
||||
*/
|
||||
async _modifyCasualtiesOrPanic(event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
const elmt = $(event.currentTarget);
|
||||
const type = elmt.data("type");
|
||||
let mod = elmt.data("value");
|
||||
if (!mod) {
|
||||
return;
|
||||
}
|
||||
switch (type) {
|
||||
case "casualties":
|
||||
await this.actor.update({
|
||||
data: {
|
||||
battle_readiness: {
|
||||
casualties_strength: {
|
||||
value: Math.max(
|
||||
0,
|
||||
this.actor.data.data.battle_readiness.casualties_strength.value + mod
|
||||
),
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
break;
|
||||
|
||||
case "panic":
|
||||
await this.actor.update({
|
||||
data: {
|
||||
battle_readiness: {
|
||||
panic_discipline: {
|
||||
value: Math.max(0, this.actor.data.data.battle_readiness.panic_discipline.value + mod),
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
console.warn("L5R5E | Unsupported type", type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ export class BaseCharacterSheetL5r5e extends BaseSheetL5r5e {
|
||||
*/
|
||||
async _onDrop(event) {
|
||||
// *** Everything below here is only needed if the sheet is editable ***
|
||||
if (!this.isEditable) {
|
||||
if (!this.isEditable || this.actor.data.data.soft_locked) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -310,6 +310,9 @@ export class BaseCharacterSheetL5r5e extends BaseSheetL5r5e {
|
||||
|
||||
// Others Advancements
|
||||
html.find(".item-advancement-choose").on("click", this._showDialogAddSubItem.bind(this));
|
||||
|
||||
// Fatigue/Strife +/-
|
||||
html.find(".addsub-control").on("click", this._modifyFatigueOrStrife.bind(this));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -506,6 +509,48 @@ export class BaseCharacterSheetL5r5e extends BaseSheetL5r5e {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add or Subtract Fatigue/Strife (+/- buttons)
|
||||
* @param {Event} event
|
||||
* @private
|
||||
*/
|
||||
async _modifyFatigueOrStrife(event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
const elmt = $(event.currentTarget);
|
||||
const type = elmt.data("type");
|
||||
let mod = elmt.data("value");
|
||||
if (!mod) {
|
||||
return;
|
||||
}
|
||||
switch (type) {
|
||||
case "fatigue":
|
||||
await this.actor.update({
|
||||
data: {
|
||||
fatigue: {
|
||||
value: Math.max(0, this.actor.data.data.fatigue.value + mod),
|
||||
},
|
||||
},
|
||||
});
|
||||
break;
|
||||
|
||||
case "strife":
|
||||
await this.actor.update({
|
||||
data: {
|
||||
strife: {
|
||||
value: Math.max(0, this.actor.data.data.strife.value + mod),
|
||||
},
|
||||
},
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
console.warn("L5R5E | Unsupported type", type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch Readied state on a weapon
|
||||
* @param {Event} event
|
||||
|
||||
@@ -17,15 +17,40 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the SendToChat button on top of sheet
|
||||
* @override
|
||||
* Add buttons to L5R specific bar
|
||||
* @return {{label: string, class: string, icon: string, onclick: Function|null}[]}
|
||||
*/
|
||||
_getHeaderButtons() {
|
||||
let buttons = super._getHeaderButtons();
|
||||
_getL5rHeaderButtons() {
|
||||
/**
|
||||
* @var {{label: string, class: string, icon: string, onclick: Function|null}[]}
|
||||
*/
|
||||
const buttons = [];
|
||||
|
||||
if (this.isEditable && !this.actor.limited) {
|
||||
// Lock/Unlock
|
||||
buttons.unshift({
|
||||
label: `l5r5e.global.${this.actor.data.data.soft_locked ? "" : "un"}locked`,
|
||||
class: "l5r-softlock",
|
||||
icon: this.actor.data.data.soft_locked ? "fas fa-lock" : "fas fa-unlock",
|
||||
onclick: () =>
|
||||
game.l5r5e.HelpersL5r5e.debounce(
|
||||
"lock-" + this.object.id,
|
||||
() => {
|
||||
this.actor.update({
|
||||
data: {
|
||||
soft_locked: !this.actor.data.data.soft_locked,
|
||||
},
|
||||
});
|
||||
},
|
||||
500,
|
||||
true
|
||||
)(),
|
||||
});
|
||||
}
|
||||
|
||||
// Send To Chat
|
||||
buttons.unshift({
|
||||
label: game.i18n.localize("l5r5e.global.send_to_chat"),
|
||||
label: "l5r5e.global.send_to_chat",
|
||||
class: "send-to-chat",
|
||||
icon: "fas fa-comment-dots",
|
||||
onclick: () =>
|
||||
@@ -44,6 +69,9 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
getData(options = {}) {
|
||||
const sheetData = super.getData(options);
|
||||
|
||||
// System Header Buttons
|
||||
sheetData.l5rHeaderButtons = this._getL5rHeaderButtons();
|
||||
|
||||
sheetData.data.dtypes = ["String", "Number", "Boolean"];
|
||||
|
||||
// Sort Items by name
|
||||
@@ -51,6 +79,9 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
return a.name.localeCompare(b.name);
|
||||
});
|
||||
|
||||
// Shortcut for some tests
|
||||
sheetData.data.editable_not_soft_locked = sheetData.editable && !sheetData.data.data.soft_locked;
|
||||
|
||||
return sheetData;
|
||||
}
|
||||
|
||||
@@ -106,6 +137,14 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
// Commons
|
||||
game.l5r5e.HelpersL5r5e.commonListeners(html, this.actor);
|
||||
|
||||
// System Header Buttons
|
||||
const l5rHeaderButtons = this._getL5rHeaderButtons();
|
||||
html.find(".l5r-header-button").click((event) => {
|
||||
event.preventDefault();
|
||||
const button = l5rHeaderButtons.find((b) => event.currentTarget.classList.contains(b.class));
|
||||
button.onclick(event);
|
||||
});
|
||||
|
||||
// *** Everything below here is only needed if the sheet is editable ***
|
||||
if (!this.isEditable) {
|
||||
return;
|
||||
|
||||
@@ -17,11 +17,12 @@ export class CharacterSheetL5r5e extends BaseCharacterSheetL5r5e {
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the TwentyQuestions button on top of sheet
|
||||
* Add the TwentyQuestions button in L5R specific bar
|
||||
* @override
|
||||
* @return {{label: string, class: string, icon: string, onclick: Function|null}[]}
|
||||
*/
|
||||
_getHeaderButtons() {
|
||||
let buttons = super._getHeaderButtons();
|
||||
_getL5rHeaderButtons() {
|
||||
const buttons = super._getL5rHeaderButtons();
|
||||
if (!this.isEditable || this.actor.limited) {
|
||||
return buttons;
|
||||
}
|
||||
@@ -151,17 +152,28 @@ export class CharacterSheetL5r5e extends BaseCharacterSheetL5r5e {
|
||||
* @param formData
|
||||
*/
|
||||
_updateObject(event, formData) {
|
||||
// Store money in zeni
|
||||
formData["data.zeni"] = this._moneyToZeni(
|
||||
formData["data.money.koku"],
|
||||
formData["data.money.bu"],
|
||||
formData["data.money.zeni"]
|
||||
);
|
||||
// Store money in Zeni
|
||||
if (formData["data.money.koku"] || formData["data.money.bu"] || formData["data.money.zeni"]) {
|
||||
formData["data.zeni"] = this._moneyToZeni(
|
||||
formData["data.money.koku"] || 0,
|
||||
formData["data.money.bu"] || 0,
|
||||
formData["data.money.zeni"] || 0
|
||||
);
|
||||
// Remove fake money object
|
||||
delete formData["data.money.koku"];
|
||||
delete formData["data.money.bu"];
|
||||
delete formData["data.money.zeni"];
|
||||
}
|
||||
|
||||
// Remove fake money object
|
||||
delete formData["data.money.koku"];
|
||||
delete formData["data.money.bu"];
|
||||
delete formData["data.money.zeni"];
|
||||
// Save computed values
|
||||
const currentData = this.object.data.data;
|
||||
formData["data.focus"] = currentData.focus;
|
||||
formData["data.vigilance"] = currentData.vigilance;
|
||||
formData["data.endurance"] = currentData.endurance;
|
||||
formData["data.composure"] = currentData.composure;
|
||||
formData["data.fatigue.max"] = currentData.fatigue.max;
|
||||
formData["data.strife.max"] = currentData.strife.max;
|
||||
formData["data.void_points.max"] = currentData.void_points.max;
|
||||
|
||||
return super._updateObject(event, formData);
|
||||
}
|
||||
|
||||
@@ -245,6 +245,7 @@ export class TwentyQuestions {
|
||||
parseInt(formData.step18.heritage_add_honor);
|
||||
|
||||
// Update the actor
|
||||
actorDatas.soft_locked = true;
|
||||
actorDatas.template = formData.template;
|
||||
actorDatas.zeni = Math.floor(formData.step2.wealth * 50);
|
||||
actorDatas.identity = {
|
||||
|
||||
@@ -41,10 +41,14 @@ export class CombatL5r5e extends Combat {
|
||||
|
||||
// Skip non character types (army)
|
||||
if (!["character", "npc"].includes(combatant.actor.data.type)) {
|
||||
updatedCombatants.push({
|
||||
_id: combatant.id,
|
||||
initiative: 0,
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip if combatant already have a initiative value
|
||||
// Skip if combatant already have an initiative value
|
||||
if (!messageOptions.rerollInitiative && (!combatant || !combatant.actor)) {
|
||||
return;
|
||||
}
|
||||
@@ -103,7 +107,7 @@ export class CombatL5r5e extends Combat {
|
||||
roll.l5r5e.voidPointUsed = !!messageOptions.useVoidPoint;
|
||||
roll.l5r5e.skillAssistance = messageOptions.skillAssistance || 0;
|
||||
|
||||
roll.roll();
|
||||
await roll.roll();
|
||||
rnkMessage = await roll.toMessage({ flavor });
|
||||
}
|
||||
|
||||
@@ -140,6 +144,11 @@ export class CombatL5r5e extends Combat {
|
||||
_sortCombatants(a, b) {
|
||||
// if tie, sort by honor, less honorable first
|
||||
if (a.initiative === b.initiative) {
|
||||
// skip if armies
|
||||
if (a.actor.data.type === "army" || b.actor.data.type === "army") {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// if tie, Character > Adversary > Minion
|
||||
if (a.actor.data.data.social.honor === b.actor.data.data.social.honor) {
|
||||
return (
|
||||
|
||||
@@ -159,10 +159,7 @@ export class DicePickerDialog extends FormApplication {
|
||||
return;
|
||||
}
|
||||
this._actor = actor;
|
||||
if (this.object.ring.id === "void") {
|
||||
this.ringId = this._actor.data.data.stance;
|
||||
this.object.ring.value = this._actor.data.data.rings[this.object.ring.id];
|
||||
}
|
||||
this.ringId = this._actor.data.data.stance;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -171,6 +168,7 @@ export class DicePickerDialog extends FormApplication {
|
||||
*/
|
||||
set ringId(ringId) {
|
||||
this.object.ring.id = CONFIG.l5r5e.stances.includes(ringId) ? ringId : "void";
|
||||
this.object.ring.value = this._actor.data.data.rings[this.object.ring.id];
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -79,14 +79,14 @@ export class L5rBaseDie extends DiceTerm {
|
||||
* @return {L5rBaseDie} The evaluated RollTerm
|
||||
* @override
|
||||
*/
|
||||
evaluate({ minimize = false, maximize = false, async = false } = {}) {
|
||||
async evaluate({ minimize = false, maximize = false, async = true } = {}) {
|
||||
if (this._evaluated) {
|
||||
throw new Error(`This ${this.constructor.name} has already been evaluated and is immutable`);
|
||||
}
|
||||
|
||||
// Roll the initial number of dice
|
||||
for (let n = 1; n <= this.number; n++) {
|
||||
this.roll({ minimize, maximize, async }); // TODO async/await in v10.x currently the inline roll is sync
|
||||
await this.roll({ minimize, maximize, async });
|
||||
}
|
||||
|
||||
// Apply modifiers
|
||||
|
||||
@@ -583,7 +583,7 @@ export class RollnKeepDialog extends FormApplication {
|
||||
};
|
||||
|
||||
// Fill the data
|
||||
roll.evaluate({ async: false });
|
||||
await roll.evaluate();
|
||||
|
||||
// Modify results
|
||||
roll.terms.map((term) => {
|
||||
|
||||
@@ -56,7 +56,7 @@ export class RollL5r5e extends Roll {
|
||||
* Execute the Roll, replacing dice and evaluating the total result
|
||||
* @override
|
||||
**/
|
||||
evaluate({ minimize = false, maximize = false, async = false } = {}) {
|
||||
async evaluate({ minimize = false, maximize = false, async = true } = {}) {
|
||||
if (this._evaluated) {
|
||||
throw new Error("This Roll object has already been rolled.");
|
||||
}
|
||||
@@ -71,7 +71,7 @@ export class RollL5r5e extends Roll {
|
||||
this._total = 0;
|
||||
|
||||
// Roll
|
||||
super.evaluate({ minimize, maximize, async });
|
||||
await super.evaluate({ minimize, maximize, async });
|
||||
this._evaluated = true;
|
||||
|
||||
// Save initial formula
|
||||
@@ -248,7 +248,7 @@ export class RollL5r5e extends Roll {
|
||||
|
||||
// Execute the roll, if needed
|
||||
if (!this._evaluated) {
|
||||
this.roll();
|
||||
await this.roll();
|
||||
}
|
||||
|
||||
// Define chat data
|
||||
@@ -297,7 +297,7 @@ export class RollL5r5e extends Roll {
|
||||
async toMessage(messageData = {}, { rollMode = null, create = true } = {}) {
|
||||
// Perform the roll, if it has not yet been rolled
|
||||
if (!this._evaluated) {
|
||||
this.evaluate({ async: false });
|
||||
await this.evaluate();
|
||||
}
|
||||
|
||||
// RollMode
|
||||
|
||||
@@ -38,7 +38,7 @@ export class GmMonitor extends FormApplication {
|
||||
_getHeaderButtons() {
|
||||
let buttons = super._getHeaderButtons();
|
||||
|
||||
// Send To Chat
|
||||
// Switch view Characters/Armies
|
||||
buttons.unshift({
|
||||
label: game.i18n.localize("l5r5e.gm_monitor.switch_view"),
|
||||
class: "switch-view",
|
||||
@@ -150,6 +150,9 @@ export class GmMonitor extends FormApplication {
|
||||
// Delete
|
||||
html.find(`.actor-remove-control`).on("click", this._removeActor.bind(this));
|
||||
|
||||
// Add/Subtract
|
||||
html.find(`.actor-modify-control`).on("mousedown", this._modifyActor.bind(this));
|
||||
|
||||
// Tooltips
|
||||
game.l5r5e.HelpersL5r5e.popupManager(html.find(".actor-infos-control"), async (event) => {
|
||||
const type = $(event.currentTarget).data("type");
|
||||
@@ -243,7 +246,95 @@ export class GmMonitor extends FormApplication {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tooltips informations for this character
|
||||
* Add or subtract fatigue/strife/void/casualties/panic
|
||||
* @param event
|
||||
* @return {Promise<void>}
|
||||
* @private
|
||||
*/
|
||||
async _modifyActor(event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
||||
const type = $(event.currentTarget).data("type");
|
||||
if (!type) {
|
||||
console.warn("L5R5E | type not set", type);
|
||||
return;
|
||||
}
|
||||
const id = $(event.currentTarget).data("actor-id");
|
||||
if (!id) {
|
||||
console.warn("L5R5E | actor id not set", type);
|
||||
return;
|
||||
}
|
||||
const actor = game.actors.get(id);
|
||||
if (!actor) {
|
||||
console.warn("L5R5E | Actor not found", type);
|
||||
return;
|
||||
}
|
||||
|
||||
// Mouse bt : middle = 0, left +1, right -1
|
||||
const add = event.which === 2 ? -999 : event.which === 1 ? 1 : -1;
|
||||
|
||||
// Stance
|
||||
let stanceIdx =
|
||||
CONFIG.l5r5e.stances.findIndex((s) => s === actor.data.data.stance) + (event.which === 1 ? 1 : -1);
|
||||
if (stanceIdx < 0) {
|
||||
stanceIdx = CONFIG.l5r5e.stances.length - 1;
|
||||
} else if (stanceIdx > CONFIG.l5r5e.stances.length - 1) {
|
||||
stanceIdx = 0;
|
||||
}
|
||||
|
||||
const updateData = {};
|
||||
switch (type) {
|
||||
// *** Characters ***
|
||||
case "fatigue":
|
||||
updateData["data.fatigue.value"] = Math.max(0, actor.data.data.fatigue.value + add);
|
||||
break;
|
||||
|
||||
case "strife":
|
||||
updateData["data.strife.value"] = Math.max(0, actor.data.data.strife.value + add);
|
||||
break;
|
||||
|
||||
case "void_points":
|
||||
updateData["data.void_points.value"] = Math.min(
|
||||
actor.data.data.void_points.max,
|
||||
Math.max(0, actor.data.data.void_points.value + add)
|
||||
);
|
||||
break;
|
||||
|
||||
case "stance":
|
||||
updateData["data.stance"] = CONFIG.l5r5e.stances[stanceIdx];
|
||||
break;
|
||||
|
||||
case "prepared":
|
||||
updateData["data.prepared"] = !actor.data.data.prepared;
|
||||
break;
|
||||
|
||||
// *** Armies ***
|
||||
case "casualties":
|
||||
updateData["data.battle_readiness.casualties_strength.value"] = Math.max(
|
||||
0,
|
||||
actor.data.data.battle_readiness.casualties_strength.value + add
|
||||
);
|
||||
break;
|
||||
|
||||
case "panic":
|
||||
updateData["data.battle_readiness.panic_discipline.value"] = Math.max(
|
||||
0,
|
||||
actor.data.data.battle_readiness.panic_discipline.value + add
|
||||
);
|
||||
break;
|
||||
|
||||
default:
|
||||
console.warn("L5R5E | Unsupported type", type);
|
||||
break;
|
||||
}
|
||||
if (!foundry.utils.isObjectEmpty(updateData)) {
|
||||
await actor.update(updateData);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tooltips information for this character
|
||||
* @param {BaseSheetL5r5e} actor
|
||||
* @return {string}
|
||||
* @private
|
||||
|
||||
@@ -20,7 +20,7 @@ export class GmToolbox extends FormApplication {
|
||||
classes: ["l5r5e", "gm-toolbox"],
|
||||
template: CONFIG.l5r5e.paths.templates + "gm/gm-toolbox.html",
|
||||
title: game.i18n.localize("l5r5e.gm_toolbox.title"),
|
||||
left: x - 605,
|
||||
left: x - 627,
|
||||
top: y - 98,
|
||||
closeOnSubmit: false,
|
||||
submitOnClose: false,
|
||||
|
||||
@@ -318,7 +318,7 @@ export class HelpersL5r5e {
|
||||
if (!types) {
|
||||
types = game.system.entityTypes.Item;
|
||||
}
|
||||
const title = game.i18n.format("ENTITY.Create", { entity: game.i18n.localize("Item") });
|
||||
const title = game.i18n.format("DOCUMENT.Create", { type: game.i18n.localize("Item") });
|
||||
|
||||
// Render the template
|
||||
const html = await renderTemplate(`${CONFIG.l5r5e.paths.templates}dialogs/choose-item-type-dialog.html`, {
|
||||
|
||||
@@ -9,7 +9,7 @@ export default class HooksL5r5e {
|
||||
typeof Babele !== "undefined" &&
|
||||
Babele.get().modules.every((module) => module.module !== "l5r5e-custom-compendiums")
|
||||
) {
|
||||
Babele.get().setSystemTranslationsDir("babele"); // Since Babele v2.0.4
|
||||
Babele.get().setSystemTranslationsDir("babele"); // Since Babele v2.0.7
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ export default class HooksL5r5e {
|
||||
|
||||
// If any disclaimer "not translated by Edge"
|
||||
const disclaimer = game.i18n.localize("l5r5e.global.edge_translation_disclaimer");
|
||||
if (disclaimer !== "l5r5e.global.edge_translation_disclaimer") {
|
||||
if (disclaimer !== "" && disclaimer !== "l5r5e.global.edge_translation_disclaimer") {
|
||||
ui.notifications.info(disclaimer);
|
||||
}
|
||||
}
|
||||
@@ -68,7 +68,7 @@ export default class HooksL5r5e {
|
||||
* @param {string} userId
|
||||
* @return {boolean}
|
||||
*/
|
||||
static preCreateChatMessage(document, data, options, userId) {
|
||||
static async preCreateChatMessage(document, data, options, userId) {
|
||||
// Roll from DP have the "isL5r5eTemplate" option set
|
||||
if (!document.isRoll || options?.isL5r5eTemplate || !document.data?.roll) {
|
||||
return;
|
||||
@@ -83,7 +83,7 @@ export default class HooksL5r5e {
|
||||
}
|
||||
|
||||
// So now we have our wrong message only, redo it using the roll
|
||||
roll.toMessage();
|
||||
await roll.toMessage();
|
||||
|
||||
// Return false to let the system known we handled this
|
||||
return false;
|
||||
@@ -178,10 +178,33 @@ export default class HooksL5r5e {
|
||||
* Compendium display
|
||||
*/
|
||||
static async renderCompendium(app, html, data) {
|
||||
// templates "item" : add Rarity
|
||||
// Techniques / Peculiarities : add Ring / Rank
|
||||
if (app.collection.documentName === "Item") {
|
||||
const content = await app.collection.getDocuments();
|
||||
|
||||
// Add rank filter for techniques
|
||||
if (
|
||||
content[0].type === "technique" &&
|
||||
!["l5r5e.core-techniques-school", "l5r5e.core-techniques-mastery"].includes(data.collection.collection)
|
||||
) {
|
||||
const rankFilter = (event, rank) => {
|
||||
html[0].querySelectorAll(".directory-item").forEach((line) => {
|
||||
$(line).css("display", rank === 0 || $(line)[0].innerText?.endsWith(rank) ? "flex" : "none");
|
||||
});
|
||||
};
|
||||
const elmt = html.find(".directory-header");
|
||||
if (elmt.length > 0) {
|
||||
const div = $('<div class="flexrow"></div>');
|
||||
for (let rank = 0; rank < 6; rank++) {
|
||||
const bt = $(`<a>${rank === 0 ? "x" : rank}</a>`);
|
||||
bt.on("click", (event) => rankFilter(event, rank));
|
||||
div.append(bt);
|
||||
}
|
||||
elmt.append(div);
|
||||
}
|
||||
}
|
||||
|
||||
// Items : add Rarity
|
||||
// Techniques / Peculiarities : add Ring / Rank
|
||||
content.forEach((document) => {
|
||||
if (["weapon", "armor", "item", "peculiarity", "technique", "peculiarity"].includes(document.type)) {
|
||||
html.find(`[data-document-id="${document.id}"]`).append(
|
||||
|
||||
@@ -7,7 +7,7 @@ export class AdvancementSheetL5r5e extends ItemSheetL5r5e {
|
||||
/**
|
||||
* Sub Types of advancements
|
||||
*/
|
||||
static types = ["ring", "skill"]; // others have theirs own xp count
|
||||
static types = { ring: "l5r5e.rings.title", skill: "l5r5e.skill" }; // others have theirs own xp count
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
@@ -46,19 +46,30 @@ export class AdvancementSheetL5r5e extends ItemSheetL5r5e {
|
||||
const currentSkill = this.object.data.data.skill;
|
||||
|
||||
html.find("#advancement_type").on("change", (event) => {
|
||||
$(event.target).prop("disabled", true);
|
||||
if ($(event.target).val() === "skill") {
|
||||
this._updateChoice({ ring: currentRing }, { skill: currentSkill });
|
||||
this._updateChoice({ ring: currentRing }, { skill: currentSkill }).then(
|
||||
$(event.target).prop("disabled", false)
|
||||
);
|
||||
} else {
|
||||
this._updateChoice({ skill: currentSkill }, { ring: currentRing });
|
||||
this._updateChoice({ skill: currentSkill }, { ring: currentRing }).then(
|
||||
$(event.target).prop("disabled", false)
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
html.find("#advancement_ring").on("change", (event) => {
|
||||
this._updateChoice({ ring: currentRing }, { ring: $(event.target).val() });
|
||||
$(event.target).prop("disabled", true);
|
||||
this._updateChoice({ ring: currentRing }, { ring: $(event.target).val() }).then(
|
||||
$(event.target).prop("disabled", false)
|
||||
);
|
||||
});
|
||||
|
||||
html.find("#advancement_skill").on("change", (event) => {
|
||||
this._updateChoice({ skill: currentSkill }, { skill: $(event.target).val() });
|
||||
$(event.target).prop("disabled", true);
|
||||
this._updateChoice({ skill: currentSkill }, { skill: $(event.target).val() }).then(
|
||||
$(event.target).prop("disabled", false)
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -107,29 +107,96 @@ Hooks.once("init", async () => {
|
||||
// ***** Register custom sheets *****
|
||||
// Actors
|
||||
Actors.unregisterSheet("core", ActorSheet);
|
||||
Actors.registerSheet("l5r5e", CharacterSheetL5r5e, { types: ["character"], makeDefault: true });
|
||||
Actors.registerSheet("l5r5e", NpcSheetL5r5e, { types: ["npc"], makeDefault: true });
|
||||
Actors.registerSheet("l5r5e", ArmySheetL5r5e, { types: ["army"], makeDefault: true });
|
||||
Actors.registerSheet("l5r5e", CharacterSheetL5r5e, {
|
||||
types: ["character"],
|
||||
label: "ACTOR.TypeCharacter",
|
||||
makeDefault: true,
|
||||
});
|
||||
Actors.registerSheet("l5r5e", NpcSheetL5r5e, {
|
||||
types: ["npc"],
|
||||
label: "ACTOR.TypeNpc",
|
||||
makeDefault: true,
|
||||
});
|
||||
Actors.registerSheet("l5r5e", ArmySheetL5r5e, {
|
||||
types: ["army"],
|
||||
label: "ACTOR.TypeArmy",
|
||||
makeDefault: true,
|
||||
});
|
||||
|
||||
// Items
|
||||
Items.unregisterSheet("core", ItemSheet);
|
||||
Items.registerSheet("l5r5e", ItemSheetL5r5e, { types: ["item"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", ArmorSheetL5r5e, { types: ["armor"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", WeaponSheetL5r5e, { types: ["weapon"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", TechniqueSheetL5r5e, { types: ["technique"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", PropertySheetL5r5e, { types: ["property"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", PeculiaritySheetL5r5e, { types: ["peculiarity"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", AdvancementSheetL5r5e, { types: ["advancement"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", TitleSheetL5r5e, { types: ["title"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", BondSheetL5r5e, { types: ["bond"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", SignatureScrollSheetL5r5e, { types: ["signature_scroll"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", ItemPatternSheetL5r5e, { types: ["item_pattern"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", ArmyCohortSheetL5r5e, { types: ["army_cohort"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", ArmyFortificationSheetL5r5e, { types: ["army_fortification"], makeDefault: true });
|
||||
Items.registerSheet("l5r5e", ItemSheetL5r5e, {
|
||||
types: ["item"],
|
||||
label: "ITEM.TypeItem",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", ArmorSheetL5r5e, {
|
||||
types: ["armor"],
|
||||
label: "ITEM.TypeArmor",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", WeaponSheetL5r5e, {
|
||||
types: ["weapon"],
|
||||
label: "ITEM.TypeWeapon",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", TechniqueSheetL5r5e, {
|
||||
types: ["technique"],
|
||||
label: "ITEM.TypeTechnique",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", PropertySheetL5r5e, {
|
||||
types: ["property"],
|
||||
label: "ITEM.TypeProperty",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", PeculiaritySheetL5r5e, {
|
||||
types: ["peculiarity"],
|
||||
label: "ITEM.TypePeculiarity",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", AdvancementSheetL5r5e, {
|
||||
types: ["advancement"],
|
||||
label: "ITEM.TypeAdvancement",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", TitleSheetL5r5e, {
|
||||
types: ["title"],
|
||||
label: "ITEM.TypeTitle",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", BondSheetL5r5e, {
|
||||
types: ["bond"],
|
||||
label: "ITEM.TypeBond",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", SignatureScrollSheetL5r5e, {
|
||||
types: ["signature_scroll"],
|
||||
label: "ITEM.TypeSignature_scroll",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", ItemPatternSheetL5r5e, {
|
||||
types: ["item_pattern"],
|
||||
label: "ITEM.TypeItem_pattern",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", ArmyCohortSheetL5r5e, {
|
||||
types: ["army_cohort"],
|
||||
label: "ITEM.TypeArmy_cohort",
|
||||
makeDefault: true,
|
||||
});
|
||||
Items.registerSheet("l5r5e", ArmyFortificationSheetL5r5e, {
|
||||
types: ["army_fortification"],
|
||||
label: "ITEM.TypeArmy_fortification",
|
||||
makeDefault: true,
|
||||
});
|
||||
|
||||
// Journal
|
||||
Items.unregisterSheet("core", JournalSheet);
|
||||
Items.registerSheet("l5r5e", BaseJournalSheetL5r5e, { makeDefault: true });
|
||||
Journal.unregisterSheet("core", JournalSheet);
|
||||
Journal.registerSheet("l5r5e", BaseJournalSheetL5r5e, {
|
||||
label: "JOURNAL.TypeJournal",
|
||||
makeDefault: true,
|
||||
});
|
||||
|
||||
// Override the default Token _drawBar function to allow fatigue bar reversing.
|
||||
Token.prototype._drawBar = function (number, bar, data) {
|
||||
@@ -181,6 +248,6 @@ Hooks.on("renderChatMessage", (message, html, data) => HooksL5r5e.renderChatMess
|
||||
Hooks.on("renderCombatTracker", (app, html, data) => HooksL5r5e.renderCombatTracker(app, html, data));
|
||||
Hooks.on("renderCompendium", async (app, html, data) => HooksL5r5e.renderCompendium(app, html, data));
|
||||
Hooks.on("diceSoNiceRollStart", (messageId, context) => HooksL5r5e.diceSoNiceRollStart(messageId, context));
|
||||
Hooks.on("preCreateChatMessage", (document, data, options, userId) =>
|
||||
HooksL5r5e.preCreateChatMessage(document, data, options, userId)
|
||||
);
|
||||
|
||||
// TODO Seem fixed in v9, remove in v10 if good
|
||||
// Hooks.on("preCreateChatMessage", (document, data, options, userId) => HooksL5r5e.preCreateChatMessage(document, data, options, userId));
|
||||
|
||||
Reference in New Issue
Block a user