forked from public/foundryvtt-reve-de-dragon
Sync
This commit is contained in:
@ -18,6 +18,43 @@ export class RdDActorSheet extends ActorSheet {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
getData() {
|
||||
let data = super.getData();
|
||||
|
||||
data.itemsByType = {};
|
||||
for (const item of data.items) {
|
||||
let list = data.itemsByType[item.type];
|
||||
if (!list) {
|
||||
list = [];
|
||||
data.itemsByType[item.type] = list;
|
||||
}
|
||||
list.push(item);
|
||||
}
|
||||
data.competenceByCategory = {};
|
||||
if (data.itemsByType.competence) {
|
||||
for (const item of data.itemsByType.competence) {
|
||||
console.log("Push...", item, item.data.categorie);
|
||||
let list = data.competenceByCategory[item.data.categorie];
|
||||
if (!list) {
|
||||
list = [];
|
||||
data.competenceByCategory[item.data.categorie] = list;
|
||||
}
|
||||
list.push(item);
|
||||
}
|
||||
}
|
||||
|
||||
data.data.materiel = this._checkNull(data.itemsByType['objet']);
|
||||
data.data.armes = this._checkNull(data.itemsByType['arme']);
|
||||
data.data.armures = this._checkNull(data.itemsByType['armure']);
|
||||
data.data.livres = this._checkNull(data.itemsByType['livre']);
|
||||
data.data.potions = this._checkNull(data.itemsByType['potions']);
|
||||
data.data.competenceByCategory = data.competenceByCategory;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/** @override */
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
@ -9,14 +9,7 @@ export class RdDActor extends Actor {
|
||||
const actorData = this.data;
|
||||
const data = actorData.data;
|
||||
const flags = actorData.flags;
|
||||
const comp = { "base": [],
|
||||
"mêlée": [],
|
||||
"tir": [],
|
||||
"particulières": [],
|
||||
"spécialisées": [],
|
||||
"connaissances": [],
|
||||
"draconic": []
|
||||
}
|
||||
|
||||
// Make separate methods for each Actor type (character, npc, etc.) to keep
|
||||
// things organized.
|
||||
if (actorData.type === 'personnage') this._prepareCharacterData(actorData);
|
||||
@ -27,12 +20,6 @@ export class RdDActor extends Actor {
|
||||
*/
|
||||
_prepareCharacterData(actorData) {
|
||||
|
||||
for (let i of actorData.items)
|
||||
{
|
||||
if (i.type === "compétence") {
|
||||
comp[i.catégorie].push( i );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** @override */
|
||||
|
@ -7,28 +7,16 @@ export class RdDItemSheet extends ItemSheet {
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
return mergeObject(super.defaultOptions, {
|
||||
classes: ["worldbuilding", "sheet", "item"],
|
||||
template: "systems/worldbuilding/templates/item-sheet.html",
|
||||
classes: ["foundryvtt-reve-de-dragon", "sheet", "item"],
|
||||
template: "systems/foundryvtt-reve-de-dragon/templates/item-sheet.html",
|
||||
width: 520,
|
||||
height: 480,
|
||||
tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}]
|
||||
height: 480
|
||||
//tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}]
|
||||
});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/** @override */
|
||||
getData() {
|
||||
const data = super.getData();
|
||||
data.dtypes = ["String", "Number", "Boolean"];
|
||||
for ( let attr of Object.values(data.data.attributes) ) {
|
||||
attr.isCheckbox = attr.dtype === "Boolean";
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/** @override */
|
||||
setPosition(options={}) {
|
||||
const position = super.setPosition(options);
|
||||
@ -46,41 +34,28 @@ export class RdDItemSheet extends ItemSheet {
|
||||
|
||||
// Everything below here is only needed if the sheet is editable
|
||||
if (!this.options.editable) return;
|
||||
|
||||
// Select competence categorie
|
||||
html.find("#categorie").on("click", this._onClickSelectCategorie.bind(this) );
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
// Add or Remove Attribute
|
||||
html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this));
|
||||
async _onClickSelectCategorie(event) {
|
||||
event.preventDefault();
|
||||
|
||||
const category = event.currentTarget.value;
|
||||
let level = CONFIG.RDD.level_category[category];
|
||||
this.object.data.data.base = level;
|
||||
$("#base").val( level );
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Listen for click events on an attribute control to modify the composition of attributes in the sheet
|
||||
* @param {MouseEvent} event The originating left click event
|
||||
* @private
|
||||
*/
|
||||
async _onClickAttributeControl(event) {
|
||||
event.preventDefault();
|
||||
const a = event.currentTarget;
|
||||
const action = a.dataset.action;
|
||||
const attrs = this.object.data.data.attributes;
|
||||
const form = this.form;
|
||||
|
||||
// Add new attribute
|
||||
if ( action === "create" ) {
|
||||
const nk = Object.keys(attrs).length + 1;
|
||||
let newKey = document.createElement("div");
|
||||
newKey.innerHTML = `<input type="text" name="data.attributes.attr${nk}.key" value="attr${nk}"/>`;
|
||||
newKey = newKey.children[0];
|
||||
form.appendChild(newKey);
|
||||
await this._onSubmit(event);
|
||||
}
|
||||
|
||||
// Remove existing attribute
|
||||
else if ( action === "delete" ) {
|
||||
const li = a.closest(".attribute");
|
||||
li.parentElement.removeChild(li);
|
||||
await this._onSubmit(event);
|
||||
}
|
||||
get template()
|
||||
{
|
||||
let type = this.item.type;
|
||||
return `systems/foundryvtt-reve-de-dragon/templates/item-${type}-sheet.html`;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -88,28 +63,6 @@ export class RdDItemSheet extends ItemSheet {
|
||||
/** @override */
|
||||
_updateObject(event, formData) {
|
||||
|
||||
// Handle the free-form attributes list
|
||||
const formAttrs = expandObject(formData).data.attributes || {};
|
||||
const attributes = Object.values(formAttrs).reduce((obj, v) => {
|
||||
let k = v["key"].trim();
|
||||
if ( /[\s\.]/.test(k) ) return ui.notifications.error("Attribute keys may not contain spaces or periods");
|
||||
delete v["key"];
|
||||
obj[k] = v;
|
||||
return obj;
|
||||
}, {});
|
||||
|
||||
// Remove attributes which are no longer used
|
||||
for ( let k of Object.keys(this.object.data.data.attributes) ) {
|
||||
if ( !attributes.hasOwnProperty(k) ) attributes[`-=${k}`] = null;
|
||||
}
|
||||
|
||||
// Re-combine formData
|
||||
formData = Object.entries(formData).filter(e => !e[0].startsWith("data.attributes")).reduce((obj, e) => {
|
||||
obj[e[0]] = e[1];
|
||||
return obj;
|
||||
}, {_id: this.object._id, "data.attributes": attributes});
|
||||
|
||||
// Update the Item
|
||||
return this.object.update(formData);
|
||||
}
|
||||
}
|
||||
|
@ -1,21 +1,54 @@
|
||||
/**
|
||||
* A simple and flexible system for world-building using an arbitrary collection of character and item attributes
|
||||
* Author: Atropos
|
||||
* RdD system
|
||||
* Author: LeRatierBretonnien
|
||||
* Software License: GNU GPLv3
|
||||
*/
|
||||
|
||||
/* -------------------------------------------- */
|
||||
const RDD = {}
|
||||
RDD.level_category = {
|
||||
"generale": "-4",
|
||||
"particuliere": "-8",
|
||||
"speciale": "-11",
|
||||
"connaissance": "-11",
|
||||
"draconic": "-11",
|
||||
"melee": "-6",
|
||||
"tir": "-8",
|
||||
"lancer": "-8"
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
// Import Modules
|
||||
import { RdDActor } from "./actor.js";
|
||||
import { RdDItemSheet } from "./item-sheet.js";
|
||||
import { RdDActorSheet } from "./actor-sheet.js";
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
// Handlers management
|
||||
const preloadHandlebarsTemplates = async function () {
|
||||
const templatePaths = [
|
||||
//Character Sheets
|
||||
'systems/foundryvtt-reve-de-dragon/templates/actor-sheet.html',
|
||||
//Items
|
||||
'systems/foundryvtt-reve-de-dragon/templates/item-competence-sheet.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/competence-categorie.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/competence-carac-defaut.html',
|
||||
'systems/foundryvtt-reve-de-dragon/templates/competence-base.html'
|
||||
];
|
||||
|
||||
return loadTemplates(templatePaths);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Foundry VTT Initialization */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
Hooks.once("init", async function() {
|
||||
console.log(`Initializing Reve de Dragon System`);
|
||||
|
||||
// preload handlebars templates
|
||||
preloadHandlebarsTemplates();
|
||||
|
||||
/**
|
||||
* Set an initiative formula for the system
|
||||
* @type {String}
|
||||
@ -27,7 +60,8 @@ Hooks.once("init", async function() {
|
||||
|
||||
// Define custom Entity classes
|
||||
CONFIG.Actor.entityClass = RdDActor;
|
||||
|
||||
CONFIG.RDD = RDD;
|
||||
|
||||
// Register sheet application classes
|
||||
Actors.unregisterSheet("core", ActorSheet);
|
||||
Actors.registerSheet("foundryvtt-reve-de-dragon", RdDActorSheet, { makeDefault: true });
|
||||
|
Reference in New Issue
Block a user