diff --git a/README.md b/README.md index 9517001..e4cb97e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# Te Deum Pour Un Massacre for FoundryVTT (French RPG, Open Sesam Games, Official)s +# Te Deum Pour Un Massacre for FoundryVTT (French RPG, Open Sesam Games, Official) -This is a base game system with functionnal character sheets for the game Ecryme, powered by the Engrenage system. +This is a base game system with functionnal character sheets for the game Te Deum. You can join the kickstarter and obtain the base books here : https://www.kickstarter.com/projects/osg-us/ecryme # System overview @@ -24,9 +24,6 @@ The game system in Foundry offers the following features : - Original code realised by Uberwald (https://www.uberwald.me/) -# English translation - -English translation by Conal Longden and Ian McClung # Copyright mentions @@ -35,8 +32,6 @@ All rights reserved THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Ecryme is a game written by Alexandre Clavel and Samuel Metzener, in a universe created by Mathieu gaborit. All of the aforementionned authors retain there moral rights regarding this work in both print and digital formats. - # Requests or Problems Please report any requests or problems you have at contact@open-sesame.games diff --git a/changelog.md b/changelog.md index c645262..e69de29 100644 --- a/changelog.md +++ b/changelog.md @@ -1,17 +0,0 @@ -v11.0.36 - -- Enable deletion specialization -- Custome bonus for specializations -- Specialization direct rolls - -v11.0.31 - -Add profession, fix equipment tab and add missing translation - -v11.0.30 - -Snapshot and more detailed README - -v11.0.28 - -Initial release diff --git a/modules/actors/tedeum-actor-sheet.js b/modules/actors/tedeum-actor-sheet.js index ec43a60..0873002 100644 --- a/modules/actors/tedeum-actor-sheet.js +++ b/modules/actors/tedeum-actor-sheet.js @@ -6,7 +6,7 @@ import { TeDeumUtility } from "../common/tedeum-utility.js"; /* -------------------------------------------- */ -export class EcrymeActorSheet extends ActorSheet { +export class TeDeumActorPJSheet extends ActorSheet { /** @override */ static get defaultOptions() { @@ -35,24 +35,11 @@ export class EcrymeActorSheet extends ActorSheet { cssClass: this.isEditable ? "editable" : "locked", system: duplicate(this.object.system), limited: this.object.limited, - skills: this.actor.prepareSkills(), - traits: this.actor.getRollTraits(), - confrontations: this.actor.getConfrontations(), - ideal: this.actor.getIdeal(), - spleen: this.actor.getSpleen(), - impacts: this.object.getImpacts(), - config: duplicate(game.system.ecryme.config), - weapons: this.actor.getWeapons(), - maneuvers: this.actor.getManeuvers(), - impactsMalus: this.actor.getImpactsMalus(), - archetype: duplicate(this.actor.getArchetype()), + competences: this.actor.getCompetences(), + config: duplicate(game.system.tedeum.config), + armes: this.actor.getArmes(), equipments: this.actor.getEquipments(), - hasCephaly: EcrymeUtility.hasCephaly(), - hasBoheme: EcrymeUtility.hasBoheme(), - hasAmertume: EcrymeUtility.hasAmertume(), - cephalySkills: this.actor.getCephalySkills(), subActors: duplicate(this.actor.getSubActors()), - annency: this.actor.getAnnency(), description: await TextEditor.enrichHTML(this.object.system.description, { async: true }), notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }), equipementlibre: await TextEditor.enrichHTML(this.object.system.equipementlibre, { async: true }), @@ -80,12 +67,6 @@ export class EcrymeActorSheet extends ActorSheet { if (e.keyCode === 13) return false; }); - html.find('.open-annency').click(ev => { - let actorId = $(ev.currentTarget).data("annency-id") - const actor = game.actors.get(actorId) - actor.sheet.render(true) - }) - // Update Inventory Item html.find('.item-edit').click(ev => { const li = $(ev.currentTarget).parents(".item") @@ -124,40 +105,12 @@ export class EcrymeActorSheet extends ActorSheet { this.actor.incDecQuantity( li.data("item-id"), +1 ); } ); - html.find('.roll-skill').click((event) => { + html.find('.roll-competence').click((event) => { let categKey = $(event.currentTarget).data("category-key") let skillKey = $(event.currentTarget).data("skill-key") this.actor.rollSkill(categKey, skillKey) }); - html.find('.roll-spec').click((event) => { - let categKey = $(event.currentTarget).data("category-key") - let skillKey = $(event.currentTarget).data("skill-key") - let specId = $(event.currentTarget).data("spec-id") - this.actor.rollSpec(categKey, skillKey, specId) - }); - html.find('.roll-skill-confront').click((event) => { - let categKey = $(event.currentTarget).data("category-key") - let skillKey = $(event.currentTarget).data("skill-key") - this.actor.rollSkillConfront(categKey, skillKey) - }); - html.find('.roll-cephaly').click((event) => { - let skillKey = $(event.currentTarget).data("skill-key") - this.actor.rollCephalySkillConfront(skillKey) - }); - html.find('.roll-weapon-confront').click((event) => { - const li = $(event.currentTarget).parents(".item") - let weaponId = li.data("item-id"); - this.actor.rollWeaponConfront(weaponId) - }); - - html.find('.impact-modify').click((event) => { - let impactType = $(event.currentTarget).data("impact-type") - let impactLevel = $(event.currentTarget).data("impact-level") - let modifier = Number($(event.currentTarget).data("impact-modifier")) - this.actor.modifyImpact(impactType, impactLevel, modifier) - }); - - html.find('.roll-weapon').click((event) => { + html.find('.roll-arme').click((event) => { const armeId = $(event.currentTarget).data("arme-id") this.actor.rollArme(armeId) }); diff --git a/modules/app/tedeum-hotbar.js b/modules/app/tedeum-hotbar.js index 8ec5351..c79c305 100644 --- a/modules/app/tedeum-hotbar.js +++ b/modules/app/tedeum-hotbar.js @@ -14,7 +14,7 @@ export class TeDeumHotbar { if (documentData.type == "Item") { console.log("Drop done !!!", bar, documentData, slot) let item = documentData.data - let command = `game.system.ecryme.EcrymeHotbar.rollMacro("${item.name}", "${item.type}");` + let command = `game.system.tedeum.EcrymeHotbar.rollMacro("${item.name}", "${item.type}");` let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command)) if (!macro) { macro = await Macro.create({ @@ -75,11 +75,11 @@ export class TeDeumHotbar { return ui.notifications.warn(`Unable to find the item of the macro in the current actor`) } // Trigger the item roll - if (item.type === "weapon") { - return actor.rollWeapon( item.id) + if (item.type === "arme") { + return actor.rollArme( item.id) } - if (item.type === "skill") { - return actor.rollSkill( item.id) + if (item.type === "competence") { + return actor.rollCompetence( item.id) } } diff --git a/modules/common/tedeum-config.js b/modules/common/tedeum-config.js index 190ae75..a39d769 100644 --- a/modules/common/tedeum-config.js +++ b/modules/common/tedeum-config.js @@ -14,6 +14,14 @@ export const LOCALISATION = { "tete":{ label: "Tête", value: 1, id :"tete", nbArmure: 2 }, } +export const ARME_SPECIFICITE = { + "encombrante": { label: "Encombrante", id :"encombrante" }, + "maintiendistance": { label: "Maintien à distance", id :"maintiendistance" }, + "treslongue": { label: "Très longue", id :"treslongue" }, + "coupassomant": { label: "Coup assomant", id :"coupassomant" }, + "peutlancer": { label: "Peut être lancée", id :"peutlancer" }, +} + export const TEDEUM_CONFIG = { descriptionValeur: { 1: { qualite: "Mauvais", dice: "d4", negativeDice: "d20", savoir: "Sot", sensibilite: "Obtus", entregent: "Rustaud", puissance: "Menu", complexion: "Anémique", adresse: "Empesé" }, diff --git a/modules/data/tedeum-schema-arme.js b/modules/data/tedeum-schema-arme.js new file mode 100644 index 0000000..f3c98e9 --- /dev/null +++ b/modules/data/tedeum-schema-arme.js @@ -0,0 +1,30 @@ +export default class TeDeumArmeSchema extends foundry.abstract.TypeDataModel { + static defineSchema() { + const fields = foundry.data.fields; + const requiredInteger = { required: true, nullable: false, integer: true }; + const schema = {}; + + schema.specificites = new fields.SchemaField( + Object.values((ARME_SPECIFICITE)).reduce((obj, spec) => { + obj[spec.id] = new fields.SchemaField({ + hasSpec: new fields.BooleanField({initial: false}), + }); + return obj; + }, {}) + ); + + schema.degatsArmure = new fields.SchemaField( { + sansarmure : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), + cuir : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), + plates : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), + mailles : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), + }); + + schema.initiativeBonus = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }); + + schema.degats = new fields.StringField({ required: false, blank: true, initial: undefined }); + schema.description = new fields.HTMLField({ required: true, blank: true }); + + return schema; + } +} diff --git a/modules/data/tedeum-schema-competence.js b/modules/data/tedeum-schema-competence.js new file mode 100644 index 0000000..cac40c9 --- /dev/null +++ b/modules/data/tedeum-schema-competence.js @@ -0,0 +1,14 @@ +export default class TeDeumCompetenceSchema extends foundry.abstract.TypeDataModel { + static defineSchema() { + const fields = foundry.data.fields; + const requiredInteger = { required: true, nullable: false, integer: true }; + const schema = {}; + + schema.caracteristique = new fields.StringField({ required: true, blank: false, initial: "puissance" }); + schema.score = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }); + schema.scoreBase = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }); + schema.description = new fields.HTMLField({ required: true, blank: true }); + + return schema; + } +} diff --git a/modules/dialogs/tedeum-roll-dialog.js b/modules/dialogs/tedeum-roll-dialog.js index a2373d5..91d351f 100644 --- a/modules/dialogs/tedeum-roll-dialog.js +++ b/modules/dialogs/tedeum-roll-dialog.js @@ -13,17 +13,17 @@ export class TeDeumRollDialog extends Dialog { /* -------------------------------------------- */ constructor(actor, rollData, html, options, close = undefined) { let conf = { - title: game.i18n.localize("ECRY.ui.rolltitle"), + title: "Lancer !", content: html, buttons: { roll: { icon: '', - label: game.i18n.localize("ECRY.ui.roll"), + label: "Lancer", callback: () => { this.roll() } }, cancel: { icon: '', - label: game.i18n.localize("ECRY.ui.cancel"), + label: "Annuler", callback: () => { this.close() } } }, @@ -43,7 +43,7 @@ export class TeDeumRollDialog extends Dialog { /* -------------------------------------------- */ async refreshDialog() { - const content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/roll-dialog-generic.hbs", this.rollData) + const content = await renderTemplate("systems/fvtt-tedeum/templates/dialogs/roll-dialog-generic.hbs", this.rollData) this.data.content = content this.render(true) } @@ -63,24 +63,6 @@ export class TeDeumRollDialog extends Dialog { html.find('#roll-difficulty').change((event) => { this.rollData.difficulty = Number(event.currentTarget.value) || 0 }) - html.find('#roll-specialization').change((event) => { - this.rollData.selectedSpecs = $('#roll-specialization').val() - }) - html.find('#roll-trait-bonus').change((event) => { - this.rollData.traitsBonus = $('#roll-trait-bonus').val() - }) - html.find('#roll-trait-malus').change((event) => { - this.rollData.traitsMalus = $('#roll-trait-malus').val() - }) - html.find('#roll-select-transcendence').change((event) => { - this.rollData.skillTranscendence = Number($('#roll-select-transcendence').val()) - }) - html.find('#roll-use-spleen').change((event) => { - this.rollData.useSpleen = event.currentTarget.checked - }) - html.find('#roll-use-ideal').change((event) => { - this.rollData.useIdeal = event.currentTarget.checked - }) } } \ No newline at end of file diff --git a/modules/items/tedeum-item-sheet.js b/modules/items/tedeum-item-sheet.js index f0a0d6d..b4908f1 100644 --- a/modules/items/tedeum-item-sheet.js +++ b/modules/items/tedeum-item-sheet.js @@ -10,7 +10,7 @@ export class TeDeumItemSheet extends ItemSheet { static get defaultOptions() { return mergeObject(super.defaultOptions, { classes: ["fvtt-tedeum", "sheet", "item"], - template: "systems/fvtt-tedeum/templates/item-sheet.hbs", + template: "systems/fvtt-te-deum/templates/item-sheet.hbs", dragDrop: [{ dragSelector: null, dropSelector: null }], width: 620, height: 580, @@ -57,7 +57,7 @@ export class TeDeumItemSheet extends ItemSheet { editable: this.isEditable, cssClass: this.isEditable ? "editable" : "locked", system: duplicate(this.object.system), - config: duplicate(game.system.ecryme.config), + config: duplicate(game.system.tedeum.config), limited: this.object.limited, options: this.options, owner: this.document.isOwner, @@ -66,10 +66,6 @@ export class TeDeumItemSheet extends ItemSheet { isGM: game.user.isGM } - if ( this.object.type == "archetype") { - formData.tarots = EcrymeUtility.getTarots() - } - this.options.editable = !(this.object.origin == "embeddedItem"); console.log("ITEM DATA", formData, this); return formData; @@ -104,8 +100,8 @@ export class TeDeumItemSheet extends ItemSheet { payload: chatData, }); - renderTemplate('systems/Ecryme/templates/post-item.html', chatData).then(html => { - let chatOptions = EcrymeUtility.chatDataSetup(html); + renderTemplate('systems/fvtt-te-deum/templates/post-item.html', chatData).then(html => { + let chatOptions = TeDeumUtility.chatDataSetup(html); ChatMessage.create(chatOptions) }); } @@ -121,7 +117,7 @@ export class TeDeumItemSheet extends ItemSheet { if (itemData.name != 'None') { let item = await Item.create(itemData, { temporary: true }); item.system.origin = "embeddedItem"; - new EcrymeItemSheet(item).render(true); + new TeDeumItemSheet(item).render(true); } } @@ -133,7 +129,7 @@ export class TeDeumItemSheet extends ItemSheet { let itemData = this.object.system[field][idx]; if (itemData.name != 'None') { let newArray = []; - for (var i = 0; i < oldArray.length; i++) { + for (let i = 0; i < oldArray.length; i++) { if (i != idx) { newArray.push(oldArray[i]); } @@ -174,7 +170,7 @@ export class TeDeumItemSheet extends ItemSheet { /* -------------------------------------------- */ get template() { let type = this.item.type; - return `systems/fvtt-ecryme/templates/items/item-${type}-sheet.hbs` + return `systems/fvtt-te-deum/templates/items/item-${type}-sheet.hbs` } /* -------------------------------------------- */ diff --git a/modules/tedeum-main.js b/modules/tedeum-main.js index e448024..3f570f3 100644 --- a/modules/tedeum-main.js +++ b/modules/tedeum-main.js @@ -11,6 +11,7 @@ import { TeDeumActor } from "./actors/tedeum-actor.js"; import { TeDeumItemSheet } from "./items/tedeum-item-sheet.js"; import { TeDeumActorSheet } from "./actors/tedeum-actor-sheet.js"; +import { TeDeumPJSchema } from "./common/tedeum-schema-pj.js"; import { TeDeumUtility } from "./common/tedeum-utility.js"; import { TeDeumCombat } from "./app/tedeum-combat.js"; import { TeDeumItem } from "./items/tedeum-item.js"; @@ -27,7 +28,7 @@ Hooks.once("init", async function () { console.log(`Initializing TeDeum RPG`); game.system.tedeum = { - config: ECRYME_CONFIG, + config: TEDEUM_CONFIG, TeDeumHotbar } @@ -47,21 +48,24 @@ Hooks.once("init", async function () { TeDeumUtility.onSocketMesssage(data) }); - /* -------------------------------------------- */ - // Define custom Entity classes CONFIG.Combat.documentClass = TeDeumCombat - CONFIG.Actor.documentClass = TeDeumActor + CONFIG.Actor.documentClass = TeDeumActor; CONFIG.Item.documentClass = TeDeumItem + CONFIG.Actor.dataModels = { + pj: TeDeumPJSchema, + pnj: TeDeumPJSchema, + }; + CONFIG.Item.dataModels = { + arme: models.TeDeumArmeSchema, + competence: models.TeDeumCompetenceSchema, + }; - /* -------------------------------------------- */ - // Register sheet application classes Actors.unregisterSheet("core", ActorSheet); - Actors.registerSheet("fvtt-tedeum", TeDeumActorSheet, { types: ["pc"], makeDefault: true }); - Actors.registerSheet("fvtt-tedeum", TeDeumActorSheet, { types: ["npc"], makeDefault: true }); - Actors.registerSheet("fvtt-tedeum", TeDeumAnnencySheet, { types: ["annency"], makeDefault: false }); - + Actors.registerSheet(SYSTEM_ID, TeDeumActorPJSheet, { types: ["pj"], makeDefault: true }); + Actors.registerSheet(SYSTEM_ID, TeDeumActorPJSheet, { types: ["pnj"], makeDefault: true }); + Items.unregisterSheet("core", ItemSheet); - Items.registerSheet("fvtt-tedeum", TeDeumItemSheet, { makeDefault: true }); + Items.registerSheet(SYSTEM_ID, TeDeumItemSheet, { makeDefault: true }); TeDeumUtility.init() }); diff --git a/template.json b/template.json index 69d15a6..0474b74 100644 --- a/template.json +++ b/template.json @@ -5,7 +5,8 @@ "pnj": {} }, "Item": { - "types": ["arme"], - "arme": {} + "types": ["arme", "competence"], + "arme": {}, + "competence": {} } } \ No newline at end of file