Initial import

This commit is contained in:
LeRatierBretonnien 2023-12-11 22:24:19 +01:00
parent dfd5d2340f
commit c33b758ddd
11 changed files with 94 additions and 128 deletions

View File

@ -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

View File

@ -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

View File

@ -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)
});

View File

@ -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)
}
}

View File

@ -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é" },

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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: '<i class="fas fa-check"></i>',
label: game.i18n.localize("ECRY.ui.roll"),
label: "Lancer",
callback: () => { this.roll() }
},
cancel: {
icon: '<i class="fas fa-times"></i>',
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
})
}
}

View File

@ -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`
}
/* -------------------------------------------- */

View File

@ -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()
});

View File

@ -5,7 +5,8 @@
"pnj": {}
},
"Item": {
"types": ["arme"],
"arme": {}
"types": ["arme", "competence"],
"arme": {},
"competence": {}
}
}