Working on 0.8.x
- some fix for 0.8.3, and working on titles
This commit is contained in:
@@ -63,12 +63,20 @@ export class ActorL5r5e extends Actor {
|
||||
* Entity-specific actions that should occur when the Entity is updated
|
||||
* @override
|
||||
*/
|
||||
update(data, options = {}) {
|
||||
async update(data = {}, context = {}) {
|
||||
// Need a _id
|
||||
if (!data["_id"]) {
|
||||
data["_id"] = this.id;
|
||||
}
|
||||
|
||||
// Fix for token image unliked from character... dunno why
|
||||
if (data.img) {
|
||||
data["token.img"] = data.img;
|
||||
}
|
||||
return super.update(data, options);
|
||||
|
||||
// Now using updateDocuments
|
||||
data = data instanceof Array ? data : [data];
|
||||
return Actor.updateDocuments(data, context);
|
||||
}
|
||||
|
||||
/** @override */
|
||||
|
||||
@@ -151,7 +151,7 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
}
|
||||
|
||||
// Check item type and subtype
|
||||
const item = await game.l5r5e.HelpersL5r5e.getDragnDropTargetObject(event);
|
||||
let item = await game.l5r5e.HelpersL5r5e.getDragnDropTargetObject(event);
|
||||
if (
|
||||
!item ||
|
||||
item.documentName !== "Item" ||
|
||||
@@ -170,9 +170,10 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
) {
|
||||
return;
|
||||
}
|
||||
item = item.toJSON();
|
||||
|
||||
// Dropped a item with same "id" as one owned, add qte instead
|
||||
if (item.data.data.quantity && this.actor.data.items) {
|
||||
if (item.data.quantity && this.actor.data.items) {
|
||||
const tmpItem = this.actor.data.items.find((e) => e.name === item.name && e.type === item.type);
|
||||
if (tmpItem && this._modifyQuantity(tmpItem.id, 1)) {
|
||||
return;
|
||||
@@ -180,23 +181,24 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
}
|
||||
|
||||
// Item subtype specific
|
||||
switch (item.data.type) {
|
||||
case "advancement": // no break
|
||||
switch (item.type) {
|
||||
case "bond": // no break
|
||||
case "peculiarity":
|
||||
case "advancement": // no break
|
||||
case "peculiarity": // no break
|
||||
case "item_pattern": // no break
|
||||
case "signature_scroll":
|
||||
// Modify the bought at rank to the current actor rank
|
||||
if (this.actor.data.data.identity?.school_rank) {
|
||||
item.data.data.bought_at_rank = this.actor.data.data.identity.school_rank;
|
||||
item.data.bought_at_rank = this.actor.data.data.identity.school_rank;
|
||||
}
|
||||
break;
|
||||
|
||||
case "technique":
|
||||
// School_ability and mastery_ability, allow only 1 per type
|
||||
if (CONFIG.l5r5e.techniques.get(item.data.data.technique_type)?.type === "school") {
|
||||
if (CONFIG.l5r5e.techniques.get(item.data.technique_type)?.type === "school") {
|
||||
if (
|
||||
Array.from(this.actor.items).some(
|
||||
(e) =>
|
||||
e.type === "technique" && e.data.data.technique_type === item.data.data.technique_type
|
||||
(e) => e.type === "technique" && e.data.data.technique_type === item.data.technique_type
|
||||
)
|
||||
) {
|
||||
ui.notifications.info(game.i18n.localize("l5r5e.techniques.only_one"));
|
||||
@@ -204,25 +206,24 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
}
|
||||
|
||||
// No cost for schools
|
||||
item.data.data.xp_cost = 0;
|
||||
item.data.data.xp_used = 0;
|
||||
item.data.data.in_curriculum = true;
|
||||
item.data.xp_cost = 0;
|
||||
item.data.xp_used = 0;
|
||||
item.data.in_curriculum = true;
|
||||
} else {
|
||||
// Check if technique is allowed for this character
|
||||
if (!game.user.isGM && !this.actor.data.data.techniques[item.data.data.technique_type]) {
|
||||
if (!game.user.isGM && !this.actor.data.data.techniques[item.data.technique_type]) {
|
||||
ui.notifications.info(game.i18n.localize("l5r5e.techniques.not_allowed"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Verify cost
|
||||
item.data.data.xp_cost =
|
||||
item.data.data.xp_cost > 0 ? item.data.data.xp_cost : CONFIG.l5r5e.xp.techniqueCost;
|
||||
item.data.data.xp_used = item.data.data.xp_cost;
|
||||
item.data.xp_cost = item.data.xp_cost > 0 ? item.data.xp_cost : CONFIG.l5r5e.xp.techniqueCost;
|
||||
item.data.xp_used = item.data.xp_cost;
|
||||
}
|
||||
|
||||
// Modify the bought at rank to the current actor rank
|
||||
if (this.actor.data.data.identity?.school_rank) {
|
||||
item.data.data.bought_at_rank = this.actor.data.data.identity.school_rank;
|
||||
item.data.bought_at_rank = this.actor.data.data.identity.school_rank;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -232,7 +233,8 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
if (allowed === false) {
|
||||
return;
|
||||
}
|
||||
return this._onDropItemCreate(item.toJSON());
|
||||
|
||||
return this._onDropItemCreate(item);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -244,8 +246,6 @@ export class BaseSheetL5r5e extends ActorSheet {
|
||||
|
||||
// Toggle
|
||||
html.find(".toggle-on-click").on("click", (event) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
const elmt = $(event.currentTarget).data("toggle");
|
||||
const tgt = html.find("." + elmt);
|
||||
tgt.toggleClass("toggle-active");
|
||||
|
||||
@@ -161,8 +161,6 @@ export class TwentyQuestionsDialog extends FormApplication {
|
||||
|
||||
// Toggle
|
||||
html.find(".toggle-on-click").on("click", (event) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
const elmt = $(event.currentTarget).data("toggle");
|
||||
const tgt = html.find("." + elmt);
|
||||
tgt.toggleClass("toggle-active");
|
||||
@@ -382,7 +380,7 @@ export class TwentyQuestionsDialog extends FormApplication {
|
||||
if (!id) {
|
||||
continue;
|
||||
}
|
||||
const item = await game.l5r5e.HelpersL5r5e.getObjectGameOrPack(id, "Item");
|
||||
const item = await game.l5r5e.HelpersL5r5e.getObjectGameOrPack({ id: id, type: "Item" });
|
||||
if (!item) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -160,31 +160,31 @@ export class RollL5r5e extends Roll {
|
||||
* @override
|
||||
*/
|
||||
get total() {
|
||||
//return 0; // todo Bug : Si 0 tout le temps -> pas de pb pour le chat. mais plus d'inline :'(
|
||||
return null; // TODO Bug 0.8.x : If not returning a null/0 value the chat ignore the template. If i do this, no inline but "/r 1dr" work fine :'(
|
||||
|
||||
if (!this._evaluated) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let total = "";
|
||||
|
||||
// Regular dices total (eg 6)
|
||||
if (this.l5r5e.dicesTypes.std) {
|
||||
total = this._total;
|
||||
}
|
||||
|
||||
// Add L5R summary
|
||||
if (this.l5r5e.dicesTypes.l5r) {
|
||||
const summary = this.l5r5e.summary;
|
||||
total +=
|
||||
(this.l5r5e.dicesTypes.std ? " | " : "") +
|
||||
["success", "explosive", "opportunity", "strife"]
|
||||
.map((props) => (summary[props] > 0 ? `<i class="i_${props}"></i> ${summary[props]}` : null))
|
||||
.filter((c) => !!c)
|
||||
.join(" | ");
|
||||
}
|
||||
|
||||
return total;
|
||||
// if (!this._evaluated) {
|
||||
// return null;
|
||||
// }
|
||||
//
|
||||
// let total = "";
|
||||
//
|
||||
// // Regular dices total (eg 6)
|
||||
// if (this.l5r5e.dicesTypes.std) {
|
||||
// total = this._total;
|
||||
// }
|
||||
//
|
||||
// // Add L5R summary
|
||||
// if (this.l5r5e.dicesTypes.l5r) {
|
||||
// const summary = this.l5r5e.summary;
|
||||
// total +=
|
||||
// (this.l5r5e.dicesTypes.std ? " | " : "") +
|
||||
// ["success", "explosive", "opportunity", "strife"]
|
||||
// .map((props) => (summary[props] > 0 ? `<i class="i_${props}"></i> ${summary[props]}` : null))
|
||||
// .filter((c) => !!c)
|
||||
// .join(" | ");
|
||||
// }
|
||||
//
|
||||
// return total;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -71,74 +71,80 @@ export class HelpersL5r5e {
|
||||
return null;
|
||||
}
|
||||
const data = JSON.parse(json);
|
||||
return await HelpersL5r5e.getObjectGameOrPack(data.id, data.type, data.pack);
|
||||
return await HelpersL5r5e.getObjectGameOrPack(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the object from Game or Pack by his ID, or null if not found
|
||||
*/
|
||||
static async getObjectGameOrPack(id, type, pack = null) {
|
||||
static async getObjectGameOrPack({ id, type, data = null, pack = null }) {
|
||||
let document = null;
|
||||
|
||||
try {
|
||||
// If no pack passed, but it's a core item, we know the pack to get it
|
||||
if (!pack && id.substr(0, 7) === "L5RCore") {
|
||||
pack = HelpersL5r5e.getPackNameForCoreItem(id);
|
||||
// Direct Object
|
||||
if (data?._id) {
|
||||
document = HelpersL5r5e.createItemFromCompendium(data);
|
||||
} else if (!id || !type) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Named pack
|
||||
if (pack) {
|
||||
const data = await game.packs.get(pack).getDocument(id);
|
||||
if (data) {
|
||||
return HelpersL5r5e.createItemFromCompendium(data);
|
||||
if (!document) {
|
||||
// If no pack passed, but it's a core item, we know the pack to get it
|
||||
if (!pack && id.substr(0, 7) === "L5RCore") {
|
||||
pack = HelpersL5r5e.getPackNameForCoreItem(id);
|
||||
}
|
||||
|
||||
if (pack) {
|
||||
const data = await game.packs.get(pack).getDocument(id);
|
||||
if (data) {
|
||||
document = HelpersL5r5e.createItemFromCompendium(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Game object
|
||||
let item = null;
|
||||
switch (type) {
|
||||
case "Actor":
|
||||
item = game.actors.get(id);
|
||||
break;
|
||||
|
||||
case "Item":
|
||||
item = game.items.get(id);
|
||||
break;
|
||||
|
||||
case "JournalEntry":
|
||||
item = game.journal.get(id);
|
||||
break;
|
||||
|
||||
case "Macro":
|
||||
item = game.macros.get(id);
|
||||
break;
|
||||
}
|
||||
if (item) {
|
||||
await HelpersL5r5e.refreshItemProperties(item);
|
||||
return item;
|
||||
if (!document) {
|
||||
document = CONFIG[type].collection.instance.get(id);
|
||||
}
|
||||
|
||||
// Unknown pack object, iterate all packs
|
||||
for (const comp of game.packs) {
|
||||
// TODO Bug with babele if "comp.getDocument(id)" return null...
|
||||
const babeleFix = (await comp.getIndex()).some((e) => e.id === id);
|
||||
if (!babeleFix) {
|
||||
continue;
|
||||
if (!document) {
|
||||
for (const comp of game.packs) {
|
||||
// TODO Bug with babele if "comp.getDocument(id)" return null...
|
||||
const babeleFix = (await comp.getIndex()).some((e) => e.id === id);
|
||||
if (!babeleFix) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const data = await comp.getDocument(id);
|
||||
if (data) {
|
||||
document = HelpersL5r5e.createItemFromCompendium(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Final
|
||||
if (document) {
|
||||
// Flag the source GUID
|
||||
if (document.uuid && !document.getFlag("core", "sourceId")) {
|
||||
document.data.update({ "flags.core.sourceId": document.uuid });
|
||||
}
|
||||
|
||||
const data = await comp.getDocument(id);
|
||||
if (data) {
|
||||
return HelpersL5r5e.createItemFromCompendium(data);
|
||||
}
|
||||
await HelpersL5r5e.refreshItemProperties(document);
|
||||
document.prepareData();
|
||||
}
|
||||
} catch (err) {
|
||||
console.warn(err);
|
||||
}
|
||||
return null;
|
||||
console.log(" ***** getObjectGameOrPack", document);
|
||||
return document;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a temporary item for compendium drag n drop
|
||||
*/
|
||||
static async createItemFromCompendium(data) {
|
||||
static createItemFromCompendium(data) {
|
||||
if (
|
||||
![
|
||||
"item",
|
||||
@@ -156,31 +162,24 @@ export class HelpersL5r5e {
|
||||
return data;
|
||||
}
|
||||
|
||||
let item;
|
||||
let document;
|
||||
if (data instanceof ItemL5r5e) {
|
||||
item = data;
|
||||
} else if (game.user.hasPermission("ACTOR_CREATE")) {
|
||||
// Fail if a player do not have the right to create object (even if this is a temporary)
|
||||
item = await ItemL5r5e.create(data, { temporary: true });
|
||||
|
||||
// reinject compendium id (required for properties)
|
||||
item.data.id = data.id;
|
||||
document = data;
|
||||
} else {
|
||||
// Quick object
|
||||
item = new ItemL5r5e(data);
|
||||
document = new ItemL5r5e(data);
|
||||
}
|
||||
await HelpersL5r5e.refreshItemProperties(item);
|
||||
return item;
|
||||
return document;
|
||||
}
|
||||
|
||||
/**
|
||||
* Babele and properties specific
|
||||
*/
|
||||
static async refreshItemProperties(item) {
|
||||
if (item.data.data.properties && typeof Babele !== "undefined") {
|
||||
item.data.data.properties = await Promise.all(
|
||||
item.data.data.properties.map(async (property) => {
|
||||
const gameProp = await game.l5r5e.HelpersL5r5e.getObjectGameOrPack(property.id, "Item");
|
||||
static async refreshItemProperties(document) {
|
||||
if (document.data.data.properties && typeof Babele !== "undefined") {
|
||||
document.data.data.properties = await Promise.all(
|
||||
document.data.data.properties.map(async (property) => {
|
||||
const gameProp = await HelpersL5r5e.getObjectGameOrPack({ id: property.id, type: "Item" });
|
||||
if (gameProp) {
|
||||
return { id: gameProp.id, name: gameProp.name };
|
||||
}
|
||||
@@ -217,7 +216,7 @@ export class HelpersL5r5e {
|
||||
/**
|
||||
* Get the associated pack for a core item (time saving)
|
||||
*/
|
||||
static getPackNameForCoreItem(itemId) {
|
||||
static getPackNameForCoreItem(documentId) {
|
||||
const core = new Map();
|
||||
core.set("Pro", "l5r5e.core-properties");
|
||||
core.set("Kat", "l5r5e.core-techniques-kata");
|
||||
@@ -241,7 +240,7 @@ export class HelpersL5r5e {
|
||||
core.set("Pas", "l5r5e.core-peculiarities-passions");
|
||||
core.set("Adv", "l5r5e.core-peculiarities-adversities");
|
||||
core.set("Anx", "l5r5e.core-peculiarities-anxieties");
|
||||
return core.get(itemId.replace(/L5RCore(\w{3})\d+/gi, "$1"));
|
||||
return core.get(documentId.replace(/L5RCore(\w{3})\d+/gi, "$1"));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,10 +3,10 @@ export class ItemL5r5e extends Item {
|
||||
* Create a new entity using provided input data
|
||||
* @override
|
||||
*/
|
||||
static async create(data, options = {}) {
|
||||
static async create(data, context = {}) {
|
||||
if (data.img === undefined) {
|
||||
data.img = `${CONFIG.l5r5e.paths.assets}icons/items/${data.type}.svg`;
|
||||
}
|
||||
return super.create(data, options);
|
||||
return super.create(data, context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ export class ItemSheetL5r5e extends ItemSheet {
|
||||
if (Array.isArray(sheetData.data.data.properties)) {
|
||||
const props = [];
|
||||
for (const property of sheetData.data.data.properties) {
|
||||
const gameProp = await game.l5r5e.HelpersL5r5e.getObjectGameOrPack(property.id, "Item");
|
||||
const gameProp = await game.l5r5e.HelpersL5r5e.getObjectGameOrPack({ id: property.id, type: "Item" });
|
||||
if (gameProp) {
|
||||
sheetData.data.propertiesList.push(gameProp);
|
||||
props.push({ id: gameProp.id, name: gameProp.name });
|
||||
@@ -72,6 +72,9 @@ export class ItemSheetL5r5e extends ItemSheet {
|
||||
*/
|
||||
async _updateObject(event, formData) {
|
||||
if (formData["data.description"]) {
|
||||
// Base links (Journal, compendiums...)
|
||||
formData["data.description"] = TextEditor.enrichHTML(formData["data.description"]);
|
||||
// L5R Symbols
|
||||
formData["data.description"] = game.l5r5e.HelpersL5r5e.convertSymbols(formData["data.description"], true);
|
||||
}
|
||||
return super._updateObject(event, formData);
|
||||
@@ -86,8 +89,6 @@ export class ItemSheetL5r5e extends ItemSheet {
|
||||
|
||||
// Toggle
|
||||
html.find(".toggle-on-click").on("click", (event) => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
const elmt = $(event.currentTarget).data("toggle");
|
||||
const tgt = html.find("." + elmt);
|
||||
tgt.toggleClass("toggle-active");
|
||||
@@ -135,8 +136,18 @@ export class ItemSheetL5r5e extends ItemSheet {
|
||||
}
|
||||
|
||||
// Check item type and subtype
|
||||
const item = await game.l5r5e.HelpersL5r5e.getDragnDropTargetObject(event);
|
||||
if (!item || item.documentName !== "Item" || item.data.type !== "property" || this.item.type === "property") {
|
||||
let item = await game.l5r5e.HelpersL5r5e.getDragnDropTargetObject(event);
|
||||
if (!item || item.documentName !== "Item" || this.item.type === "property") {
|
||||
return;
|
||||
}
|
||||
|
||||
// Specific ItemPattern's drop, get the associated props instead
|
||||
if (item.data.type === "item_pattern" && item.data.flags.l5r5e?.linkedPropertyId) {
|
||||
item = await game.packs.get("l5r5e.core-properties").getDocument(item.data.flags.l5r5e.linkedPropertyId);
|
||||
}
|
||||
|
||||
// Final object has to be a property
|
||||
if (item.data.type !== "property") {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -78,6 +78,7 @@ Hooks.once("init", async () => {
|
||||
RingDie,
|
||||
AbilityDie,
|
||||
HelpersL5r5e,
|
||||
ItemL5r5e,
|
||||
RollL5r5e,
|
||||
DicePickerDialog,
|
||||
RollnKeepDialog,
|
||||
|
||||
@@ -9,6 +9,7 @@ export const PreloadTemplates = async function () {
|
||||
"systems/l5r5e/templates/actors/character/conflict.html",
|
||||
"systems/l5r5e/templates/actors/character/experience.html",
|
||||
"systems/l5r5e/templates/actors/character/identity.html",
|
||||
"systems/l5r5e/templates/actors/character/inventory.html",
|
||||
"systems/l5r5e/templates/actors/character/narrative.html",
|
||||
"systems/l5r5e/templates/actors/character/rings.html",
|
||||
"systems/l5r5e/templates/actors/character/skill.html",
|
||||
@@ -20,6 +21,7 @@ export const PreloadTemplates = async function () {
|
||||
"systems/l5r5e/templates/actors/npc/attributes.html",
|
||||
"systems/l5r5e/templates/actors/npc/conflict.html",
|
||||
"systems/l5r5e/templates/actors/npc/identity.html",
|
||||
"systems/l5r5e/templates/actors/npc/inventory.html",
|
||||
"systems/l5r5e/templates/actors/npc/narrative.html",
|
||||
"systems/l5r5e/templates/actors/npc/rings.html",
|
||||
"systems/l5r5e/templates/actors/npc/social.html",
|
||||
|
||||
Reference in New Issue
Block a user