Sync
This commit is contained in:
parent
4ed1c804a0
commit
6c65c048a2
@ -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 */
|
/** @override */
|
||||||
activateListeners(html) {
|
activateListeners(html) {
|
||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
|
@ -9,14 +9,7 @@ export class RdDActor extends Actor {
|
|||||||
const actorData = this.data;
|
const actorData = this.data;
|
||||||
const data = actorData.data;
|
const data = actorData.data;
|
||||||
const flags = actorData.flags;
|
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
|
// Make separate methods for each Actor type (character, npc, etc.) to keep
|
||||||
// things organized.
|
// things organized.
|
||||||
if (actorData.type === 'personnage') this._prepareCharacterData(actorData);
|
if (actorData.type === 'personnage') this._prepareCharacterData(actorData);
|
||||||
@ -27,12 +20,6 @@ export class RdDActor extends Actor {
|
|||||||
*/
|
*/
|
||||||
_prepareCharacterData(actorData) {
|
_prepareCharacterData(actorData) {
|
||||||
|
|
||||||
for (let i of actorData.items)
|
|
||||||
{
|
|
||||||
if (i.type === "compétence") {
|
|
||||||
comp[i.catégorie].push( i );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @override */
|
/** @override */
|
||||||
|
@ -7,28 +7,16 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
/** @override */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
return mergeObject(super.defaultOptions, {
|
return mergeObject(super.defaultOptions, {
|
||||||
classes: ["worldbuilding", "sheet", "item"],
|
classes: ["foundryvtt-reve-de-dragon", "sheet", "item"],
|
||||||
template: "systems/worldbuilding/templates/item-sheet.html",
|
template: "systems/foundryvtt-reve-de-dragon/templates/item-sheet.html",
|
||||||
width: 520,
|
width: 520,
|
||||||
height: 480,
|
height: 480
|
||||||
tabs: [{navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description"}]
|
//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 */
|
/** @override */
|
||||||
setPosition(options={}) {
|
setPosition(options={}) {
|
||||||
const position = super.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
|
// Everything below here is only needed if the sheet is editable
|
||||||
if (!this.options.editable) return;
|
if (!this.options.editable) return;
|
||||||
|
|
||||||
|
// Select competence categorie
|
||||||
|
html.find("#categorie").on("click", this._onClickSelectCategorie.bind(this) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
// Add or Remove Attribute
|
async _onClickSelectCategorie(event) {
|
||||||
html.find(".attributes").on("click", ".attribute-control", this._onClickAttributeControl.bind(this));
|
event.preventDefault();
|
||||||
|
|
||||||
|
const category = event.currentTarget.value;
|
||||||
|
let level = CONFIG.RDD.level_category[category];
|
||||||
|
this.object.data.data.base = level;
|
||||||
|
$("#base").val( level );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
/**
|
get template()
|
||||||
* 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
|
let type = this.item.type;
|
||||||
* @private
|
return `systems/foundryvtt-reve-de-dragon/templates/item-${type}-sheet.html`;
|
||||||
*/
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -88,28 +63,6 @@ export class RdDItemSheet extends ItemSheet {
|
|||||||
/** @override */
|
/** @override */
|
||||||
_updateObject(event, formData) {
|
_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);
|
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
|
* RdD system
|
||||||
* Author: Atropos
|
* Author: LeRatierBretonnien
|
||||||
* Software License: GNU GPLv3
|
* 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 Modules
|
||||||
import { RdDActor } from "./actor.js";
|
import { RdDActor } from "./actor.js";
|
||||||
import { RdDItemSheet } from "./item-sheet.js";
|
import { RdDItemSheet } from "./item-sheet.js";
|
||||||
import { RdDActorSheet } from "./actor-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 */
|
/* Foundry VTT Initialization */
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
Hooks.once("init", async function() {
|
Hooks.once("init", async function() {
|
||||||
console.log(`Initializing Reve de Dragon System`);
|
console.log(`Initializing Reve de Dragon System`);
|
||||||
|
// preload handlebars templates
|
||||||
|
preloadHandlebarsTemplates();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set an initiative formula for the system
|
* Set an initiative formula for the system
|
||||||
* @type {String}
|
* @type {String}
|
||||||
@ -27,7 +60,8 @@ Hooks.once("init", async function() {
|
|||||||
|
|
||||||
// Define custom Entity classes
|
// Define custom Entity classes
|
||||||
CONFIG.Actor.entityClass = RdDActor;
|
CONFIG.Actor.entityClass = RdDActor;
|
||||||
|
CONFIG.RDD = RDD;
|
||||||
|
|
||||||
// Register sheet application classes
|
// Register sheet application classes
|
||||||
Actors.unregisterSheet("core", ActorSheet);
|
Actors.unregisterSheet("core", ActorSheet);
|
||||||
Actors.registerSheet("foundryvtt-reve-de-dragon", RdDActorSheet, { makeDefault: true });
|
Actors.registerSheet("foundryvtt-reve-de-dragon", RdDActorSheet, { makeDefault: true });
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
.worldbuilding {
|
.foundryvtt-reve-de-dragon {
|
||||||
/* Sheet Tabs */
|
/* Sheet Tabs */
|
||||||
/* Items List */
|
/* Items List */
|
||||||
/* Attributes */
|
/* Attributes */
|
||||||
}
|
}
|
||||||
.worldbuilding .window-content {
|
.foundryvtt-reve-de-dragon .window-content {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
overflow-y: hidden;
|
overflow-y: hidden;
|
||||||
}
|
}
|
||||||
.worldbuilding .sheet-header {
|
.foundryvtt-reve-de-dragon .sheet-header {
|
||||||
height: 100px;
|
height: 100px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -17,84 +17,84 @@
|
|||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
.worldbuilding .sheet-header .profile-img {
|
.foundryvtt-reve-de-dragon .sheet-header .profile-img {
|
||||||
flex: 0 0 100px;
|
flex: 0 0 100px;
|
||||||
height: 100px;
|
height: 100px;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
.worldbuilding .sheet-header .header-fields {
|
.foundryvtt-reve-de-dragon .sheet-header .header-fields {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
height: 100px;
|
height: 100px;
|
||||||
}
|
}
|
||||||
.worldbuilding .sheet-header h1.charname {
|
.foundryvtt-reve-de-dragon .sheet-header h1.charname {
|
||||||
height: 50px;
|
height: 50px;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
margin: 5px 0;
|
margin: 5px 0;
|
||||||
border-bottom: 0;
|
border-bottom: 0;
|
||||||
}
|
}
|
||||||
.worldbuilding .sheet-header h1.charname input {
|
.foundryvtt-reve-de-dragon .sheet-header h1.charname input {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
.worldbuilding .resource {
|
.foundryvtt-reve-de-dragon .resource {
|
||||||
width: 50%;
|
width: 50%;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
margin-top: 10px;
|
margin-top: 10px;
|
||||||
float: left;
|
float: left;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
.worldbuilding .resource input {
|
.foundryvtt-reve-de-dragon .resource input {
|
||||||
width: 100px;
|
width: 100px;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
}
|
}
|
||||||
.worldbuilding .tabs {
|
.foundryvtt-reve-de-dragon .tabs {
|
||||||
height: 40px;
|
height: 40px;
|
||||||
border-top: 1px solid #AAA;
|
border-top: 1px solid #AAA;
|
||||||
border-bottom: 1px solid #AAA;
|
border-bottom: 1px solid #AAA;
|
||||||
}
|
}
|
||||||
.worldbuilding .tabs .item {
|
.foundryvtt-reve-de-dragon .tabs .item {
|
||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
.worldbuilding .tabs .item.active {
|
.foundryvtt-reve-de-dragon .tabs .item.active {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
}
|
}
|
||||||
.worldbuilding .sheet-body {
|
.foundryvtt-reve-de-dragon .sheet-body {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
.worldbuilding .sheet-body .tab {
|
.foundryvtt-reve-de-dragon .sheet-body .tab {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
.worldbuilding .editor,
|
.foundryvtt-reve-de-dragon .editor,
|
||||||
.worldbuilding .editor-content {
|
.foundryvtt-reve-de-dragon .editor-content {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
.worldbuilding .item-list {
|
.foundryvtt-reve-de-dragon .item-list {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
margin: 7px 0;
|
margin: 7px 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
.worldbuilding .item-list .item {
|
.foundryvtt-reve-de-dragon .item-list .item {
|
||||||
height: 30px;
|
height: 30px;
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
padding: 3px 0;
|
padding: 3px 0;
|
||||||
border-bottom: 1px solid #BBB;
|
border-bottom: 1px solid #BBB;
|
||||||
}
|
}
|
||||||
.worldbuilding .item-list .item img {
|
.foundryvtt-reve-de-dragon .item-list .item img {
|
||||||
flex: 0 0 24px;
|
flex: 0 0 24px;
|
||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
.worldbuilding .item-list .item-name {
|
.foundryvtt-reve-de-dragon .item-list .item-name {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
.worldbuilding .item-list .item-controls {
|
.foundryvtt-reve-de-dragon .item-list .item-controls {
|
||||||
flex: 0 0 36px;
|
flex: 0 0 36px;
|
||||||
}
|
}
|
||||||
.worldbuilding .attributes-header {
|
.foundryvtt-reve-de-dragon .attributes-header {
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
margin: 5px 0;
|
margin: 5px 0;
|
||||||
background: rgba(0, 0, 0, 0.05);
|
background: rgba(0, 0, 0, 0.05);
|
||||||
@ -103,18 +103,18 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
.worldbuilding .attributes-header .attribute-label {
|
.foundryvtt-reve-de-dragon .attributes-header .attribute-label {
|
||||||
flex: 1.5;
|
flex: 1.5;
|
||||||
}
|
}
|
||||||
.worldbuilding .attributes-header .attribute-control {
|
.foundryvtt-reve-de-dragon .attributes-header .attribute-control {
|
||||||
flex: 0 0 20px;
|
flex: 0 0 20px;
|
||||||
}
|
}
|
||||||
.worldbuilding .attributes-list {
|
.foundryvtt-reve-de-dragon .attributes-list {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
.worldbuilding .attributes-list li > * {
|
.foundryvtt-reve-de-dragon .attributes-list li > * {
|
||||||
margin: 0 3px;
|
margin: 0 3px;
|
||||||
height: 28px;
|
height: 28px;
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
@ -123,17 +123,24 @@
|
|||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
border-bottom: 1px solid #AAA;
|
border-bottom: 1px solid #AAA;
|
||||||
}
|
}
|
||||||
.worldbuilding .attributes-list a.attribute-control {
|
.foundryvtt-reve-de-dragon .attributes-list a.attribute-control {
|
||||||
flex: 0 0 20px;
|
flex: 0 0 20px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
line-height: 28px;
|
line-height: 28px;
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
.worldbuilding.sheet.actor {
|
.foundryvtt-reve-de-dragon.sheet.actor {
|
||||||
min-width: 560px;
|
min-width: 560px;
|
||||||
min-height: 420px;
|
min-height: 420px;
|
||||||
}
|
}
|
||||||
.worldbuilding.sheet.item {
|
.foundryvtt-reve-de-dragon.sheet.item {
|
||||||
min-width: 460px;
|
min-width: 460px;
|
||||||
min-height: 400px;
|
min-height: 400px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Editor
|
||||||
|
.editor {
|
||||||
|
border: $section-border;
|
||||||
|
height: 300px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
@ -1,162 +0,0 @@
|
|||||||
.worldbuilding {
|
|
||||||
.window-content {
|
|
||||||
height: 100%;
|
|
||||||
padding: 5px;
|
|
||||||
overflow-y: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.sheet-header {
|
|
||||||
height: 100px;
|
|
||||||
overflow: hidden;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: flex-start;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
|
|
||||||
.profile-img {
|
|
||||||
flex: 0 0 100px;
|
|
||||||
height: 100px;
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-fields {
|
|
||||||
flex: 1;
|
|
||||||
height: 100px;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1.charname {
|
|
||||||
height: 50px;
|
|
||||||
padding: 0px;
|
|
||||||
margin: 5px 0;
|
|
||||||
border-bottom: 0;
|
|
||||||
input {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.resource {
|
|
||||||
width: 50%;
|
|
||||||
height: 40px;
|
|
||||||
margin-top: 10px;
|
|
||||||
float: left;
|
|
||||||
text-align: center;
|
|
||||||
input {
|
|
||||||
width: 100px;
|
|
||||||
height: 28px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sheet Tabs */
|
|
||||||
.tabs {
|
|
||||||
height: 40px;
|
|
||||||
border-top: 1px solid #AAA;
|
|
||||||
border-bottom: 1px solid #AAA;
|
|
||||||
|
|
||||||
.item {
|
|
||||||
line-height: 40px;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.item.active {
|
|
||||||
text-decoration: underline;
|
|
||||||
text-shadow: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.sheet-body {
|
|
||||||
overflow: hidden;
|
|
||||||
.tab {
|
|
||||||
height: 100%;
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.editor, .editor-content {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Items List */
|
|
||||||
.item-list {
|
|
||||||
list-style: none;
|
|
||||||
margin: 7px 0;
|
|
||||||
padding: 0;
|
|
||||||
overflow-y: auto;
|
|
||||||
|
|
||||||
.item {
|
|
||||||
height: 30px;
|
|
||||||
line-height: 24px;
|
|
||||||
padding: 3px 0;
|
|
||||||
border-bottom: 1px solid #BBB;
|
|
||||||
|
|
||||||
img {
|
|
||||||
flex: 0 0 24px;
|
|
||||||
margin-right: 5px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.item-name {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.item-controls {
|
|
||||||
flex: 0 0 36px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Attributes */
|
|
||||||
.attributes-header {
|
|
||||||
padding: 5px;
|
|
||||||
margin: 5px 0;
|
|
||||||
background: rgba(0, 0, 0, 0.05);
|
|
||||||
border: 1px solid #AAA;
|
|
||||||
border-radius: 2px;
|
|
||||||
text-align: center;
|
|
||||||
font-weight: bold;
|
|
||||||
|
|
||||||
.attribute-label {
|
|
||||||
flex: 1.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.attribute-control {
|
|
||||||
flex: 0 0 20px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.attributes-list {
|
|
||||||
list-style: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
|
|
||||||
li > * {
|
|
||||||
margin: 0 3px;
|
|
||||||
height: 28px;
|
|
||||||
line-height: 24px;
|
|
||||||
background: transparent;
|
|
||||||
border: none;
|
|
||||||
border-radius: 0;
|
|
||||||
border-bottom: 1px solid #AAA;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.attribute-control {
|
|
||||||
flex: 0 0 20px;
|
|
||||||
text-align: center;
|
|
||||||
line-height: 28px;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.worldbuilding.sheet.actor {
|
|
||||||
min-width: 560px;
|
|
||||||
min-height: 420px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.worldbuilding.sheet.item {
|
|
||||||
min-width: 460px;
|
|
||||||
min-height: 400px;
|
|
||||||
}
|
|
@ -5,7 +5,7 @@
|
|||||||
"version": 0.2,
|
"version": 0.2,
|
||||||
"minimumCoreVersion": "0.5.7",
|
"minimumCoreVersion": "0.5.7",
|
||||||
"compatibleCoreVersion": "0.5.7",
|
"compatibleCoreVersion": "0.5.7",
|
||||||
"templateVersion": 3,
|
"templateVersion": 4,
|
||||||
"author": "LeRatierBretonnien",
|
"author": "LeRatierBretonnien",
|
||||||
"esmodules": ["module/simple.js"],
|
"esmodules": ["module/simple.js"],
|
||||||
"styles": ["styles/simple.css"],
|
"styles": ["styles/simple.css"],
|
||||||
|
@ -121,36 +121,45 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Item": {
|
"Item": {
|
||||||
"types": ["objet", "arme", "armure", "compétence", "sort", "herbe", "ingrédient", "livre", "potion"],
|
"types": ["objet", "arme", "armure", "competence", "sort", "herbe", "ingredient", "livre", "potion", "munition"],
|
||||||
"objet": {
|
"objet": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"quantité": 1,
|
"quantite": 1,
|
||||||
"poids": 0,
|
"encombrement": 0,
|
||||||
"attributs": {}
|
"equipe": false
|
||||||
},
|
},
|
||||||
"arme": {
|
"arme": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"quantité": 1,
|
"quantite": 1,
|
||||||
"poids": 0,
|
"encombrement": 0,
|
||||||
"attributs": {}
|
"equipe": false,
|
||||||
|
"dommages": 0
|
||||||
|
},
|
||||||
|
"munition": {
|
||||||
|
"description": "",
|
||||||
|
"quantite": 1,
|
||||||
|
"encombrement": 0,
|
||||||
|
"equipe": false
|
||||||
},
|
},
|
||||||
"armure": {
|
"armure": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"quantité": 1,
|
"quantite": 1,
|
||||||
"poids": 0,
|
"encombrement": 0,
|
||||||
"attributs": {}
|
"equipe": false,
|
||||||
|
"pa": 0,
|
||||||
},
|
},
|
||||||
"compétence": {
|
"competence": {
|
||||||
"niveau": 0,
|
"niveau": 0,
|
||||||
"base": 0,
|
"base": 0,
|
||||||
"catégorie": "",
|
"categorie": "",
|
||||||
"xp": 0,
|
"xp": 0,
|
||||||
"description": ""
|
"description": "Compétence : ...",
|
||||||
|
"defaut_carac": ""
|
||||||
},
|
},
|
||||||
"sort": {
|
"sort": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"draconic": "",
|
"draconic": "",
|
||||||
"difficulté": 0,
|
"difficulte": 0,
|
||||||
"portée": 0
|
"portée": 0
|
||||||
},
|
},
|
||||||
"herbe": {
|
"herbe": {
|
||||||
@ -161,15 +170,18 @@
|
|||||||
"ingredient": {
|
"ingredient": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"niveau": 0,
|
"niveau": 0,
|
||||||
|
"encombrement": 0,
|
||||||
"base": 0
|
"base": 0
|
||||||
},
|
},
|
||||||
"livre": {
|
"livre": {
|
||||||
"description": "",
|
"description": "",
|
||||||
"difficulté": 0,
|
"difficulte": 0,
|
||||||
"taches": 0
|
"taches": 0,
|
||||||
|
"encombrement": 0
|
||||||
},
|
},
|
||||||
"potion": {
|
"potion": {
|
||||||
"description": ""
|
"description": "",
|
||||||
|
"encombrement": 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
{{!-- Sheet Tab Navigation --}}
|
{{!-- Sheet Tab Navigation --}}
|
||||||
<nav class="sheet-tabs tabs" data-group="primary">
|
<nav class="sheet-tabs tabs" data-group="primary">
|
||||||
<a class="item" data-tab="carac">Caractéristiques</a>
|
<a class="item" data-tab="carac">Caractéristiques</a>
|
||||||
<a class="item" data-tab="compétences">Compétences</a>
|
<a class="item" data-tab="competences">Compétences</a>
|
||||||
<a class="item" data-tab="description">Description</a>
|
<a class="item" data-tab="description">Description</a>
|
||||||
<a class="item" data-tab="items">Items</a>
|
<a class="item" data-tab="items">Items</a>
|
||||||
<a class="item" data-tab="attributes">Attributes</a>
|
<a class="item" data-tab="attributes">Attributes</a>
|
||||||
@ -49,25 +49,86 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- Compétences Tab --}}
|
{{!-- Compétences Tab --}}
|
||||||
<div class="tab compétences" data-group="primary" data-tab="compétences">
|
<div class="tab competences" data-group="primary" data-tab="competences">
|
||||||
<header class="compétences-header flexrow">
|
<header class="competences-header flexrow">
|
||||||
<span class="compétences-key">Nom</span>
|
<span class="competences-key">Compétences de base</span>
|
||||||
<span class="compétences-value">Valeur</span>
|
<span class="competences-value">Niveau</span>
|
||||||
<span class="compétences-label">XP</span>
|
<span class="competences-label">XP</span>
|
||||||
</header>
|
</header>
|
||||||
<ol class="compétences-list">
|
<ol class="item-list">
|
||||||
{{#each data.items as |com key|}}
|
{{#each data.competenceByCategory.generale as |comp key|}}
|
||||||
<li class="attribute flexrow" data-attribute="{{key}}">
|
<li class="item flexrow" data-attribute="{{key}}">
|
||||||
<span class="attribute-label" name="data.carac.{{key}}.label">{{carac.label}}</span>
|
<span class="attribute-label" name="data.competenceByCategory.generale[{{key}}].name">{{comp.name}}</span>
|
||||||
<input class="attribute-value" type="text" name="data.carac.{{key}}.value" value="{{carac.value}}" data-dtype="{{carac.type}}"/>
|
<input class="attribute-value" type="text" name="data.competenceByCategory.generale[{{key}}].data.niveau" value="{{comp.data.niveau}}" data-dtype="number"/>
|
||||||
<input class="attribute-xp" type="text" name="data.carac.{{key}}.xp" value="{{carac.xp}}" data-dtype="number"/>
|
<input class="attribute-xp" type="text" name="data.competenceByCategory.generale[{{key}}].data.xp" value="{{comp.data.xp}}" data-dtype="number"/>
|
||||||
</li>
|
</li>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
|
<header class="competences-header flexrow">
|
||||||
|
<span class="competences-key">Compétences Particulières</span>
|
||||||
|
<span class="competences-value">Niveau</span>
|
||||||
|
<span class="competences-label">XP</span>
|
||||||
|
</header>
|
||||||
|
<ol class="item-list">
|
||||||
|
{{#each data.competenceByCategory.particuliere as |comp key|}}
|
||||||
|
<li class="item flexrow" data-attribute="{{key}}">
|
||||||
|
<span class="attribute-label" name="data.competenceByCategory.particuliere[{{key}}].name">{{comp.name}}</span>
|
||||||
|
<input class="attribute-value" type="text" name="data.competenceByCategory.particuliere[{{key}}].data.niveau" value="{{comp.data.niveau}}" data-dtype="number"/>
|
||||||
|
<input class="attribute-xp" type="text" name="data.competenceByCategory.particuliere[{{key}}].data.xp" value="{{comp.data.xp}}" data-dtype="number"/>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<header class="competences-header flexrow">
|
||||||
|
<span class="competences-key">Compétences Spécialisées</span>
|
||||||
|
<span class="competences-value">Niveau</span>
|
||||||
|
<span class="competences-label">XP</span>
|
||||||
|
</header>
|
||||||
|
<ol class="item-list">
|
||||||
|
{{#each data.competenceByCategory.specialisee as |comp key|}}
|
||||||
|
<li class="item flexrow" data-attribute="{{key}}">
|
||||||
|
<span class="attribute-label" name="data.competenceByCategory.specialisee[{{key}}].name">{{comp.name}}</span>
|
||||||
|
<input class="attribute-value" type="text" name="data.competenceByCategory.specialisee[{{key}}].data.niveau" value="{{comp.data.niveau}}" data-dtype="number"/>
|
||||||
|
<input class="attribute-xp" type="text" name="data.competenceByCategory.specialisee[{{key}}].data.xp" value="{{comp.data.xp}}" data-dtype="number"/>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<header class="competences-header flexrow">
|
||||||
|
<span class="competences-key">Connaissances</span>
|
||||||
|
<span class="competences-value">Niveau</span>
|
||||||
|
<span class="competences-label">XP</span>
|
||||||
|
</header>
|
||||||
|
<ol class="item-list">
|
||||||
|
{{#each data.competenceByCategory.connaissance as |comp key|}}
|
||||||
|
<li class="item flexrow" data-attribute="{{key}}">
|
||||||
|
<span class="attribute-label" name="data.competenceByCategory.connaissance[{{key}}].name">{{comp.name}}</span>
|
||||||
|
<input class="attribute-value" type="text" name="data.competenceByCategory.connaissance[{{key}}].data.niveau" value="{{comp.data.niveau}}" data-dtype="number"/>
|
||||||
|
<input class="attribute-xp" type="text" name="data.competenceByCategory.connaissance[{{key}}].data.xp" value="{{comp.data.xp}}" data-dtype="number"/>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<header class="competences-header flexrow">
|
||||||
|
<span class="competences-key">Draconic</span>
|
||||||
|
<span class="competences-value">Niveau</span>
|
||||||
|
<span class="competences-label">XP</span>
|
||||||
|
</header>
|
||||||
|
<ol class="item-list">
|
||||||
|
{{#each data.competenceByCategory.draconic as |comp key|}}
|
||||||
|
<li class="item flexrow" data-attribute="{{key}}">
|
||||||
|
<span class="attribute-label" name="data.competenceByCategory.draconic[{{key}}].name">{{comp.name}}</span>
|
||||||
|
<input class="attribute-value" type="text" name="data.competenceByCategory.draconic[{{key}}].data.niveau" value="{{comp.data.niveau}}" data-dtype="number"/>
|
||||||
|
<input class="attribute-xp" type="text" name="data.competenceByCategory.draconic[{{key}}].data.xp" value="{{comp.data.xp}}" data-dtype="number"/>
|
||||||
|
</li>
|
||||||
|
{{/each}}
|
||||||
|
</ol>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{!-- Biography Tab --}}
|
{{!-- Biography Tab --}}
|
||||||
<div class="tab biography" data-group="primary" data-tab="description">
|
<div class="tab biography" data-group="primary" data-tab="description" style="height:200px">
|
||||||
{{editor content=data.biographie target="data.biographie" button=true owner=owner editable=editable}}
|
{{editor content=data.biographie target="data.biographie" button=true owner=owner editable=editable}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
5
templates/competence-base.html
Normal file
5
templates/competence-base.html
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<option value="0">0</option>
|
||||||
|
<option value="-4">-4</option>
|
||||||
|
<option value="-6">-6</option>
|
||||||
|
<option value="-8">-8</option>
|
||||||
|
<option value="-11">-11</option>
|
17
templates/competence-carac-defaut.html
Normal file
17
templates/competence-carac-defaut.html
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<option value="apparence">Apparence</option>
|
||||||
|
<option value="constitution">Constitution</option>
|
||||||
|
<option value="force">Force</option>
|
||||||
|
<option value="agilite">Agilité</option>
|
||||||
|
<option value="dexterite">Dextérité</option>
|
||||||
|
<option value="vue">Vue</option>
|
||||||
|
<option value="ouie">Ouïe</option>
|
||||||
|
<option value="odoratgout">Odorat-Gout</option>
|
||||||
|
<option value="volonte">Volonté</option>
|
||||||
|
<option value="intellect">Intellect</option>
|
||||||
|
<option value="empathie">Empathie</option>
|
||||||
|
<option value="reve">Rêve</option>
|
||||||
|
<option value="chance">Chance</option>
|
||||||
|
<option value="melee">Mêlée</option>
|
||||||
|
<option value="melee">Tir</option>
|
||||||
|
<option value="melee">Lancer</option>
|
||||||
|
<option value="melee">Dérobée</option>
|
8
templates/competence-categorie.html
Normal file
8
templates/competence-categorie.html
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<option value="generale">generale</option>
|
||||||
|
<option value="particuliere">Particulières</option>
|
||||||
|
<option value="specialisee">Spécialisées</option>
|
||||||
|
<option value="connaissance">Connaissances</option>
|
||||||
|
<option value="tir">Tir</option>
|
||||||
|
<option value="lancer">Lancer</option>
|
||||||
|
<option value="melee">Mêlée</option>
|
||||||
|
<option value="draconic">Draconic</option>
|
51
templates/item-competence-sheet.html
Normal file
51
templates/item-competence-sheet.html
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<form class="{{cssClass}}" autocomplete="off">
|
||||||
|
<header class="sheet-header">
|
||||||
|
<img class="profile-img" src="{{item.img}}" data-edit="img" title="{{item.name}}"/>
|
||||||
|
<div class="header-fields">
|
||||||
|
<h1 class="charname"><input name="name" type="text" value="{{item.name}}" placeholder="Name"/></h1>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{{!-- Sheet Body --}}
|
||||||
|
<section class="sheet-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="categorie">Catégorie </label>
|
||||||
|
<select name="data.categorie" id="categorie" data-dtype="String">
|
||||||
|
{{#select item.data.categorie}}
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/competence-categorie.html"}}
|
||||||
|
{{/select}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="niveau">Niveau </label>
|
||||||
|
<input class="attribute-value" type="text" name="data.niveau" value="{{data.niveau}}" data-dtype="Number"/>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="xp">XP </label>
|
||||||
|
<input class="attribute-value" type="text" name="data.xp" value="{{data.xp}}" data-dtype="Number"/>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="base">Niveau de base </label>
|
||||||
|
<select name="data.base" id="base" data-dtype="Number">
|
||||||
|
{{#select item.data.base}}
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/competence-base.html"}}
|
||||||
|
{{/select}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="carac_defaut">Caractéristique par défaut </label>
|
||||||
|
<select name="data.carac_defaut" id="carac_defaut" data-dtype="String">
|
||||||
|
{{#select item.data.carac_defaut}}
|
||||||
|
{{>"systems/foundryvtt-reve-de-dragon/templates/competence-carac-defaut.html"}}
|
||||||
|
{{/select}}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<header class="header-field">
|
||||||
|
<span>Description : </span>
|
||||||
|
</header>
|
||||||
|
<div class="form-group" style="height:200px">
|
||||||
|
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</form>
|
Loading…
Reference in New Issue
Block a user