Compare commits

...

11 Commits

17 changed files with 462 additions and 48 deletions

25
LICENCE.txt Normal file
View File

@@ -0,0 +1,25 @@
MIT License
Copyright (c) 2022 Uberwald/LeRatierBretonnien
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
This license does not apply to the compendium content listed in this software's
"packs" directory. See the README for licensing information for the compendium
packs.
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.

View File

@@ -1,23 +1,29 @@
# Système Foundry pour Mournblade (French RPG, Titam France/Sombres Projets)
# Système Foundry pour Hawkmoon (French RPG, Titam France/Sombres Projets)
## EN
Unofficial system for Mournblade (French version from Titam France).
Unofficial system for Hawkmoon (French version from Titam France).
This system has been approved by Département des Sombres Projets ( http://www.titam-france.fr/ ), thanks !
Books are mandatory to play and are available at : http://www.titam-france.fr
## FR
Système non-officiel pour le JDR Mournblade (Titam France).
Système non-officiel pour le JDR Hawkmoon (Titam France/Sombres Projets).
Ce système a été autorisé par Ludospherik ( http://www.ludospherik.fr/ ), merci à eux !
Ce système a été autorisé par le Département des Sombres Projets ( http://www.titam-france.fr/ ), merci à eux !
Les livres du jeu sont nécessaires pour jouer, et sont disponibles ici : http://www.titam-france.fr
# Credits
Mournblade, le jeu de rôle de Sword & Sorcery, is a property of Titam France/Sombres Projets.
Hawkmoon, le jeu de rôle du Troisième Millénaire, is a property of Titam France/Sombres Projets.
# Developmement
LeRatierBretonnien
# Tests, icones et saisie des données
Prêtre, Blondin, Zechrub/Chris, Kyllian, Lightbringer

31
lang/fr.json Normal file
View File

@@ -0,0 +1,31 @@
{
"ACTOR": {
"TypePersonnage": "Personnage",
"TypeCellule": "Cellule",
"TypeCreature": "Créature"
},
"ITEM": {
"TypeArtefact": "Artefact",
"TypeArme": "Arme",
"TypeTalent": "Talent",
"TypeHistorique": "Historique",
"TypeProfil": "Profil",
"TypeCompetence": "Compétence",
"TypeProtection": "Protection",
"TypeMonnaie": "Monnaie",
"TypeEquipement": "Equipement",
"TypeRessource": "Ressource",
"TypeContact": "Contact"
},
"HAWKMOON": {
"ui": {
"editContact": "Modifier le contact",
"deleteContact": "Supprimer le contact",
"editTrait": "Modifier le trait",
"deleteTrait": "Supprimer le trait"
}
}
}

View File

@@ -42,12 +42,17 @@ export class HawkmoonActorSheet extends ActorSheet {
armes: duplicate(this.actor.getWeapons()),
monnaies: duplicate(this.actor.getMonnaies()),
protections: duplicate(this.actor.getArmors()),
historique: duplicate(this.actor.getHistorique() || {}),
talents: duplicate(this.actor.getTalents() || {}),
historiques: duplicate(this.actor.getHistoriques() || []),
talents: duplicate(this.actor.getTalents() || []),
talentsCell: this.getCelluleTalents(),
profils: duplicate(this.actor.getProfils() || {}),
profils: duplicate(this.actor.getProfils() || []),
combat: this.actor.getCombatValues(),
equipements: duplicate(this.actor.getEquipments()),
artefacts: duplicate(this.actor.getArtefacts()),
monnaies: duplicate(this.actor.getMonnaies()),
richesse: this.actor.computeRichesse(),
valeurEquipement: this.actor.computeValeurEquipement(),
initiative: this.actor.getFlag("world", "last-initiative") || -1,
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}),
habitat: await TextEditor.enrichHTML(this.object.system.biodata.habitat, {async: true}),
options: this.options,
@@ -111,15 +116,12 @@ export class HawkmoonActorSheet extends ActorSheet {
let value = Number($(event.currentTarget).data("adversite-value"))
this.actor.incDecAdversite(adv, value)
})
html.find('.quantity-minus').click(event => {
const li = $(event.currentTarget).parents(".item");
this.actor.incDecQuantity( li.data("item-id"), -1 );
} );
html.find('.quantity-plus').click(event => {
const li = $(event.currentTarget).parents(".item");
this.actor.incDecQuantity( li.data("item-id"), +1 );
} );
html.find('.quantity-modify').click(event => {
const li = $(event.currentTarget).parents(".item")
const value = Number($(event.currentTarget).data("quantite-value"))
this.actor.incDecQuantity( li.data("item-id"), value );
})
html.find('.roll-initiative').click((event) => {
this.actor.rollAttribut("pre", true)
@@ -146,7 +148,11 @@ export class HawkmoonActorSheet extends ActorSheet {
let armeId = li.data("item-id")
this.actor.rollArmeDegats(armeId)
})
html.find('.item-add').click((event) => {
const itemType = $(event.currentTarget).data("type")
this.actor.createEmbeddedDocuments('Item', [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true })
})
html.find('.lock-unlock-sheet').click((event) => {
this.options.editScore = !this.options.editScore;

View File

@@ -116,12 +116,20 @@ export class HawkmoonActor extends Actor {
getEquipments() {
return this.items.filter(item => item.type == "equipement")
}
/* ----------------------- --------------------- */
getArtefacts() {
return this.items.filter(item => item.type == "artefact")
}
/* ----------------------- --------------------- */
getMonnaies() {
return this.items.filter(item => item.type == "monnaie")
}
/* -------------------------------------------- */
getArmors() {
return this.items.filter(item => item.type == "protection")
}
getHistorique() {
return this.items.find(item => item.type == "historique")
getHistoriques() {
return this.items.filter(item => item.type == "historique")
}
getProfils() {
return this.items.filter(item => item.type == "profil")
@@ -427,12 +435,36 @@ export class HawkmoonActor extends Actor {
async incDecQuantity(objetId, incDec = 0) {
let objetQ = this.items.get(objetId)
if (objetQ) {
let newQ = objetQ.system.quantity + incDec
let newQ = objetQ.system.quantite + incDec
newQ = Math.max(newQ, 0)
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantity': newQ }]); // pdates one EmbeddedEntity
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantite': newQ }]); // pdates one EmbeddedEntity
}
}
/* -------------------------------------------- */
computeRichesse() {
let valueSC = 0
for(let monnaie of this.items) {
if (monnaie.type == "monnaie") {
valueSC += Number(monnaie.system.prixsc) * Number(monnaie.system.quantite)
}
}
return HawkmoonUtility.computeMonnaieDetails( valueSC)
}
/* -------------------------------------------- */
computeValeurEquipement() {
let valueSC = 0
for(let equip of this.items) {
if (equip.type == "equipement" || equip.type == "arme" || equip.type == "protection") {
valueSC += Number(equip.system.prixsc) * Number(equip.system.quantite ?? 1)
valueSC += (Number(equip.system.prixca) * Number(equip.system.quantite ?? 1)) * 20
valueSC += (Number(equip.system.prixpo) * Number(equip.system.quantite ?? 1)) * 400
}
}
return HawkmoonUtility.computeMonnaieDetails( valueSC)
}
/* -------------------------------------------- */
getCompetence(compId) {
return this.items.get(compId)
@@ -490,6 +522,11 @@ export class HawkmoonActor extends Actor {
return talents
}
/* -------------------------------------------- */
buildListeAdversites() {
return []
}
/* -------------------------------------------- */
getCommonRollData(attrKey = undefined, compId = undefined, compName = undefined) {
let rollData = HawkmoonUtility.getBasicRollData()

71
modules/hawkmoon-hud.js Normal file
View File

@@ -0,0 +1,71 @@
/* -------------------------------------------- */
/* -------------------------------------------- */
export class HawkmoonTokenHud {
static init() {
// Integration du TokenHUD
Hooks.on('renderTokenHUD', (app, html, data) => { HawkmoonTokenHud.addTokenHudExtensions(app, html, data._id) });
}
/* -------------------------------------------- */
static async removeExtensionHud(app, html, tokenId) {
html.find('.control-icon.hawkmoon-adversite').remove()
}
/* -------------------------------------------- */
static async addExtensionHud(app, html, tokenId) {
let token = canvas.tokens.get(tokenId)
let actor = token.actor
app.hasExtension = true
const hudData = { actor: actor }
const controlIconActions = html.find('.control-icon[data-action=combat]');
// initiative
await HawkmoonTokenHud._configureSubMenu(controlIconActions, 'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.html', hudData,
(event) => {
let adversite = event.currentTarget.attributes['data-action-index'].value
let value = Number(event.currentTarget.attributes['data-action-value'].value)
hudData.actor.incDecAdversite( adversite, value)
} )
}
/* -------------------------------------------- */
static async addTokenHudExtensions(app, html, tokenId) {
const controlIconCombat = html.find('.control-icon[data-action=combat]')
if (controlIconCombat.length>0 ) {
HawkmoonTokenHud.addExtensionHud(app, html, tokenId);
}
}
/* -------------------------------------------- */
static async _configureSubMenu(insertionPoint, template, hudData, onMenuItem) {
const hud = $(await renderTemplate(template, hudData))
const list = hud.find('div.hawkmoon-hud-list')
HawkmoonTokenHud._toggleHudListActive(hud, list);
hud.find('img.hawkmoon-hud-togglebutton').click(event => HawkmoonTokenHud._toggleHudListActive(hud, list));
list.find('.hawkmoon-hud-adversite').click(onMenuItem);
insertionPoint.after(hud);
}
/* -------------------------------------------- */
static _showControlWhen(control, condition) {
if (condition) {
control.show()
}
else {
control.hide()
}
}
/* -------------------------------------------- */
static _toggleHudListActive(hud, list) {
hud.toggleClass('active')
HawkmoonTokenHud._showControlWhen(list, hud.hasClass('active'))
}
}

View File

@@ -17,6 +17,7 @@ import { HawkmoonUtility } from "./hawkmoon-utility.js";
import { HawkmoonCombat } from "./hawkmoon-combat.js";
import { HawkmoonItem } from "./hawkmoon-item.js";
import { HawkmoonAutomation } from "./hawkmoon-automation.js";
import { HawkmoonTokenHud } from "./hawkmoon-hud.js";
/* -------------------------------------------- */
/* Foundry VTT Initialization */
@@ -64,6 +65,7 @@ Hooks.once("init", async function () {
HawkmoonUtility.init()
HawkmoonAutomation.init()
HawkmoonTokenHud.init()
});
@@ -75,7 +77,8 @@ function welcomeMessage() {
content: `<div id="welcome-message-Hawkmoon"><span class="rdd-roll-part">
<strong>Bienvenue dans Hawkmoon et le troisième Millénaire !</strong>
<p>Les livres de Hawkmoon sont nécessaires pour jouer : https://www.titam-france.fr</p>
<p>Hawkmoon est jeude rôle publié par Titam France/Sombres projets, tout les droits leur appartiennent.<p>
<p>Hawkmoon est jeu de rôle publié par Titam France/Sombres projets, tout les droits leur appartiennent.</p>
<p>Système développé par LeRatierBretonnien, support sur le <a href="https://discord.gg/pPSDNJk">Discord FR de Foundry</a>.</p>
` });
}
@@ -110,7 +113,8 @@ function registerUsageCount(registerKey) {
/* -------------------------------------------- */
Hooks.once("ready", function () {
HawkmoonUtility.ready();
HawkmoonUtility.ready()
// User warning
if (!game.user.isGM && game.user.character == undefined) {
ui.notifications.info("Attention ! Aucun personnage n'est relié au joueur !");

View File

@@ -96,7 +96,7 @@ export class HawkmoonUtility {
static async ready() {
const skills = await HawkmoonUtility.loadCompendium("fvtt-hawkmoon-cyd.skills")
this.skills = skills.map(i => i.toObject())
// Setup pause logo
let logoPause = "systems/fvtt-hawkmoon-cyd/assets/logos/" + game.settings.get("fvtt-hawkmoon-cyd", "hawkmoon-pause-logo") + ".webp"
let logoImg = document.querySelector('#pause').children[0]
@@ -154,6 +154,7 @@ export class HawkmoonUtility {
'systems/fvtt-hawkmoon-cyd/templates/partial-item-prix.html',
'systems/fvtt-hawkmoon-cyd/templates/partial-sante-etat.html',
'systems/fvtt-hawkmoon-cyd/templates/partial-automation.html',
'systems/fvtt-hawkmoon-cyd/templates/hud-adversites.html',
]
return loadTemplates(templatePaths);
}
@@ -216,8 +217,8 @@ export class HawkmoonUtility {
}
/* -------------------------------------------- */
static getActorFromRollData(rollData) {
let actor = game.actors.get( rollData.actorId)
static getActorFromRollData(rollData) {
let actor = game.actors.get(rollData.actorId)
if (rollData.tokenId) {
let token = canvas.tokens.placeables.find(t => t.id == rollData.tokenId)
if (token) {
@@ -304,10 +305,20 @@ export class HawkmoonUtility {
}
}
/* -------------------------------------------- */
static computeMonnaieDetails(valueSC) {
let po = Math.floor(valueSC / 400)
let pa = Math.floor((valueSC - (po*400)) / 20)
let sc = valueSC - (po*400) - (pa*20)
return {
po: po, pa: pa, sc: sc, valueSC: valueSC
}
}
/* -------------------------------------------- */
static computeResult(rollData) {
rollData.diceResult = rollData.roll.terms[0].results[0].result
if (rollData.mainDice.includes("d20") ) {
if (rollData.mainDice.includes("d20")) {
let diceValue = rollData.roll.terms[0].results[0].result
if (diceValue % 2 == 1) {
//console.log("PAIR/IMP2", diceValue)
@@ -325,7 +336,7 @@ export class HawkmoonUtility {
rollData.isHeroique = ((rollData.finalResult - rollData.difficulte) >= 10)
rollData.isDramatique = ((rollData.finalResult - rollData.difficulte) <= -10)
}
}
/* -------------------------------------------- */
@@ -340,8 +351,8 @@ export class HawkmoonUtility {
rollData.attr = duplicate(actor.system.attributs[rollData.attrKey])
}
if ( rollData.maitriseId != "none") {
rollData.selectedMaitrise = rollData.maitrises.find(p => p.id == rollData.maitriseId )
if (rollData.maitriseId != "none") {
rollData.selectedMaitrise = rollData.maitrises.find(p => p.id == rollData.maitriseId)
rollData.diceFormula = "2" + rollData.mainDice + "kh"
} else {
rollData.diceFormula = "1" + rollData.mainDice
@@ -352,15 +363,15 @@ export class HawkmoonUtility {
rollData.predilections = duplicate(rollData.competence.system.predilections.filter(pred => pred.acquise && !pred.maitrise && !pred.used) || [])
let compmod = (rollData.competence.system.niveau == 0) ? -3 : 0
rollData.diceFormula += `+${rollData.attr.value}+${rollData.competence.system.niveau}+${rollData.modificateur}+${compmod}`
if ( rollData.selectedTalents && rollData.selectedTalents.length > 0) {
if (rollData.selectedTalents && rollData.selectedTalents.length > 0) {
for (let id of rollData.selectedTalents) {
let talent = rollData.talents.find(t => t._id == id)
let bonusOK = true
if ( talent.system.baCost ) {
bonusOK = actor.checkBonneAventure( talent.system.baCost)
if ( bonusOK ) {
actor.changeBonneAventure( -talent.system.baCost )
if (talent.system.baCost) {
bonusOK = actor.checkBonneAventure(talent.system.baCost)
if (bonusOK) {
actor.changeBonneAventure(-talent.system.baCost)
} else {
ui.notifications.warn("Vous n'avez pas assez de points de Bonne Aventure !")
}
@@ -369,7 +380,7 @@ export class HawkmoonUtility {
rollData.diceFormula += `+${talent.system.bonus}`
}
}
}
}
rollData.diceFormula += `+${rollData.bonusMalusContext}`
} else {
rollData.diceFormula += `+${rollData.attr.value}*${rollData.multiplier}+${rollData.modificateur}+${rollData.bonusMalusContext}`
@@ -522,7 +533,7 @@ export class HawkmoonUtility {
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
rollData.armeDefense = defender.getBestDefenseValue()
rollData.targetVigueur = defender.getVigueur()
if ( rollData.armeDefense) {
if (rollData.armeDefense) {
rollData.difficulte = rollData.armeDefense.system.totalDefensif
} else {
ui.notifications.warn("Aucune arme de défense équipée, difficulté manuelle à positionner.")
@@ -580,13 +591,13 @@ export class HawkmoonUtility {
let message = game.messages.get(li.attr("data-message-id"))
let rollData = message.getFlag("world", "hawkmoon-roll")
let actor = this.getActorFromRollData(rollData)
return (!rollData.isReroll && actor.getBonneAventure() > 0 )
return (!rollData.isReroll && actor.getBonneAventure() > 0)
}
let canApplyPE = function (li) {
let message = game.messages.get(li.attr("data-message-id"))
let rollData = message.getFlag("world", "hawkmoon-roll")
let actor = this.getActorFromRollData(rollData)
return (!rollData.isReroll && actor.getEclat() > 0 )
return (!rollData.isReroll && actor.getEclat() > 0)
}
options.push(
{
@@ -643,4 +654,21 @@ export class HawkmoonUtility {
d.render(true);
}
}
/************************************************************************************/
static async __create_talents_table() {
let compName = "fvtt-hawkmoon-cyd.talents-cellule"
const compData = await HawkmoonUtility.loadCompendium(compName)
let talents = compData.map(i => i.toObject())
let htmlTab = "<table border='1'><tbody>";
for (let entryData of talents) {
console.log(entryData)
htmlTab += `<tr><td>@UUID[Compendium.${compName}.${entryData._id}]{${entryData.name}}</td>`
htmlTab += `<td>${entryData.system.description}</td>`;
//htmlTab += `<td>${entryData.system.resumebonus}</td>`;
htmlTab += "</tr>\n";
}
htmlTab += "</table>";
await JournalEntry.create({ name: 'Liste des Talents de Cellule', content: htmlTab });
}
}

2
packs/aides-de-jeu.db Normal file

File diff suppressed because one or more lines are too long

View File

@@ -28,6 +28,7 @@
{"name":"Gourde de cuir","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"<p>1 litre</p>","prixpo":0,"prixca":0,"prixsc":5,"rarete":3,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.Bk7CwCfqllFJyRzo"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667052151738,"modifiedTime":1667056681209,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"BBHGx79XunHAqgLm"}
{"name":"Anneau en argent","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":0,"prixca":8,"prixsc":0,"rarete":7,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.euNUZvN2AaNQX5Eh"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667053448337,"modifiedTime":1667056840190,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"BDzR3nDpE58cpzMf"}
{"name":"Ceinture de cuir","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":0,"prixca":0,"prixsc":8,"rarete":3,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.zUMIT05ItRjqyXzx"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667050981153,"modifiedTime":1667056547008,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"BWpLFLDuRQTntKNW"}
{"name":"Sous de Cuivre","type":"monnaie","img":"systems/fvtt-hawkmoon-cyd/assets/icons/monnaie.webp","system":{"description":"","prixpo":0,"prixca":0,"prixsc":1,"rarete":0,"quantite":1,"equipped":false},"effects":[],"ownership":{"default":0,"wYQCdPQVeRKBJmZI":3},"flags":{"core":{"sourceId":"Item.BuH79gmBwS61TNMs"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.1.3","coreVersion":"10.291","createdTime":1670105962535,"modifiedTime":1670108270030,"lastModifiedBy":"wYQCdPQVeRKBJmZI"},"folder":null,"sort":0,"_id":"CUHVKLJStGcH1pfV"}
{"name":"Écharpe de laine","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":0,"prixca":0,"prixsc":3,"rarete":2,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.gu8GIe9rTpa30y0L"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667051095332,"modifiedTime":1667056566818,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"D4FStoSsSD5t1pyR"}
{"name":"Antipoison","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"<p>Effets et notes :</p>\n<p>Conf&egrave;re un bonus de + 5 au test de Soins pour stopper les effets d&rsquo;un empoisonnement.</p>\n<p>&nbsp;</p>","prixpo":0,"prixca":20,"prixsc":0,"rarete":8,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.6JwVwbG95Jro0jyA"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667056200587,"modifiedTime":1667056884888,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"DEAaZnyqfZTSnj5l"}
{"name":"Peigne en ivoire sculpté","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":0,"prixca":100,"prixsc":0,"rarete":9,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.qO3PbRUDrBAsl9Eg"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667052473087,"modifiedTime":1667056725327,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"DWbXCgeKhtxBop5k"}
@@ -97,6 +98,7 @@
{"name":"Tambourin","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":0,"prixca":2,"prixsc":0,"rarete":5,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.3w6hbSQaxhkKHeNK"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667053372874,"modifiedTime":1667056832786,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"gRXQlfeiJzEYGcRL"}
{"name":"Robe de bal","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"<p>Co&ucirc;t : 20 &agrave; 200 PA</p>","prixpo":0,"prixca":20,"prixsc":0,"rarete":8,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.oXhEGerIeFe5qWPe"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667051286585,"modifiedTime":1667056586658,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"gbG7p0z7UVXdfNSR"}
{"name":"Cor de chasse en corne","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":0,"prixca":2,"prixsc":0,"rarete":5,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.KEsLoT5TtwpUgb5g"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667053304777,"modifiedTime":1667056825041,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"hi1uIij2vnhblvyc"}
{"name":"Pièce d'Or","type":"monnaie","img":"systems/fvtt-hawkmoon-cyd/assets/icons/monnaie.webp","system":{"description":"","prixpo":0,"prixca":0,"prixsc":400,"rarete":0,"quantite":1,"equipped":false},"effects":[],"ownership":{"default":0,"wYQCdPQVeRKBJmZI":3},"flags":{"core":{"sourceId":"Item.arqqVEV5qwgVh1qz"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.1.3","coreVersion":"10.291","createdTime":1670105962535,"modifiedTime":1670108267437,"lastModifiedBy":"wYQCdPQVeRKBJmZI"},"folder":null,"sort":0,"_id":"iDsF5gfusUp56ffF"}
{"name":"Sphère noire","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":0,"prixca":30,"prixsc":0,"rarete":9,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.wgZufKzZs1mv6U7m"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667053281244,"modifiedTime":1667056823317,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"iTgpQBOfOLKOOIpx"}
{"name":"Lampe à huile","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"<p>dur&eacute;e huit heures</p>","prixpo":0,"prixca":0,"prixsc":15,"rarete":3,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.52qKfCHjAXnPd42R"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667050221162,"modifiedTime":1667056522865,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"k549mRHCTM5qvoAq"}
{"name":"Parfum dItalia","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":1,"prixca":0,"prixsc":0,"rarete":8,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.nQpYaf3lVGlHWZDd"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667053201541,"modifiedTime":1667056816027,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"kimJnMkFr6mx2GR2"}
@@ -110,6 +112,7 @@
{"name":"Miroir","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":0,"prixca":1,"prixsc":0,"rarete":5,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.w2y1ZIQwrq16pyro"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667052391234,"modifiedTime":1667056715568,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"oF4ctqBDkAw6gNkd"}
{"name":"Nuit en dortoir sur une paillasse sale","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":0,"prixca":0,"prixsc":3,"rarete":2,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.4GmLW6TqSQaDktX6"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667049989473,"modifiedTime":1667056509383,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"oOuBI5T6XB91aHCE"}
{"name":"Pourpoint de cuir","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":0,"prixca":3,"prixsc":0,"rarete":5,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.WzLzKVbZzw68cXko"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667051273146,"modifiedTime":1667056584869,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"oRg2ar1k6VMZpy77"}
{"name":"Pièce d'Argent","type":"monnaie","img":"systems/fvtt-hawkmoon-cyd/assets/icons/monnaie.webp","system":{"description":"","prixpo":0,"prixca":0,"prixsc":20,"rarete":0,"quantite":1,"equipped":false},"effects":[],"ownership":{"default":0,"wYQCdPQVeRKBJmZI":3},"flags":{"core":{"sourceId":"Item.I6sMdUOBJV7DuOB2"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.1.3","coreVersion":"10.291","createdTime":1670105962535,"modifiedTime":1670108264731,"lastModifiedBy":"wYQCdPQVeRKBJmZI"},"folder":null,"sort":0,"_id":"pHLxatpIeOjQ4SY9"}
{"name":"Couverts en argent","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"<p>un couteau, une fourchette, une cuiller</p>","prixpo":0,"prixca":30,"prixsc":0,"rarete":9,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.QszRAgf7F0ZSbN6z"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667051873930,"modifiedTime":1667056657906,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"pJAfqX7SieQmRGDF"}
{"name":"Cataplasme miraculeux","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"<p>cr&egrave;me de nanocompo\u0002sites r&eacute;g&eacute;n&eacute;rants &ndash; cr&eacute;ation technologique</p>\n<p><strong>Effets et notes :</strong><br>Permet de d&eacute;fausser jusqu&rsquo;&agrave; 2 Adversit&eacute;s noires apr&egrave;s (10 &ndash; Trempe) x 10 minutes.</p>","prixpo":0,"prixca":100,"prixsc":0,"rarete":10,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.6fA5jRN6HAXN3sLM"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667055976728,"modifiedTime":1667056878533,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"q6gtm9fNDyIWJ90X"}
{"name":"Nuit sur le plancher de la salle commune ou à létable","type":"equipement","img":"systems/fvtt-hawkmoon-cyd/assets/icons/equipement.webp","system":{"description":"","prixpo":0,"prixca":0,"prixsc":1,"rarete":1,"equipped":false},"effects":[],"flags":{"core":{"sourceId":"Item.V0lq8ve5orlZBG3G"}},"_stats":{"systemId":"fvtt-hawkmoon-cyd","systemVersion":"10.0.7","coreVersion":"10.286","createdTime":1667049973754,"modifiedTime":1667056508034,"lastModifiedBy":"aU5ncDYkHS7NmLl4"},"folder":null,"sort":0,"ownership":{"default":0,"aU5ncDYkHS7NmLl4":3},"_id":"q8jVTrkQM9EDa6E1"}

View File

@@ -790,6 +790,7 @@ ul, li {
width: fit-content;
height: fit-content;
min-width: 6rem;
min-height: 1.2rem;
flex-basis: auto;
padding: 0;
line-height: 1rem;
@@ -896,6 +897,22 @@ ul, li {
border: 0px;
}
.hud-adversite-container {
position: relative;
text-align: center;
color: white;
width: 64px;
min-height: 64px;
}
.hud-adversite-text {
font-weight: bold;
font-size:0.9rem;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -85%);
}
.actor-icon {
float: left;
width: 48px;
@@ -1419,4 +1436,7 @@ ul, li {
}
.adversite-modify {
margin-top: 12px;
}
.argent-total-text {
margin-left: 4px;
}

View File

@@ -1,7 +1,7 @@
{
"id": "fvtt-hawkmoon-cyd",
"description": "Hawmoon RPG for FoundryVTT (CYD system - French)",
"version": "10.1.1",
"description": "Hawkmoon RPG for FoundryVTT (CYD system - French)",
"version": "10.1.7",
"authors": [
{
"name": "Uberwald/LeRatierBretonnien",
@@ -35,7 +35,15 @@
"gridUnits": "m",
"license": "LICENSE.txt",
"manifest": "https://www.uberwald.me/gitea/public/fvtt-hawkmoon-cyd/raw/branch/master/system.json",
"download": "https://www.uberwald.me/gitea/public/fvtt-hawkmoon-cyd/archive/fvtt-hawkmoon-cyd-10.1.1.zip",
"download": "https://www.uberwald.me/gitea/public/fvtt-hawkmoon-cyd/archive/fvtt-hawkmoon-cyd-10.1.7.zip",
"languages": [
{
"lang": "fr",
"name": "French",
"path": "lang/fr.json",
"flags": {}
}
],
"packs": [
{
"type": "Item",
@@ -117,6 +125,15 @@
"system": "fvtt-hawkmoon-cyd",
"private": false,
"flags": {}
},
{
"type": "JournalEntry",
"label": "Aides de Jeu",
"name": "aides-de-jeu",
"path": "packs/aides-de-jeu.db",
"system": "fvtt-hawkmoon-cyd",
"private": false,
"flags": {}
}
],
"primaryTokenAttribute": "sante.vigueur",

View File

@@ -124,6 +124,7 @@
"prixca": 0,
"prixsc": 0,
"rarete": 0,
"quantite": 0,
"equipped": false
},
"automation": {

View File

@@ -233,7 +233,7 @@
<ul class="item-list alternate-list">
<li class="item flexrow">
<button class="chat-card-button roll-initiative">Initiative</button>
<button class="chat-card-button roll-initiative">Initiative (actuelle : {{initiative}} )</button>
</li>
</ul>
@@ -340,6 +340,58 @@
<div class="tab equipement" data-group="primary" data-tab="equipement">
<div class="flexcol">
<hr>
<div class="sheet-box color-bg-archetype">
<h4>
<label class="argent-total-text">
Argent Total : {{richesse.po}} PO - {{richesse.pa}} PA - {{richesse.sc}} SC (total {{richesse.valueSC}} SC)
</label>
</h4>
</div>
<div class="sheet-box color-bg-archetype">
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header">
<h3><label class="items-title-text">Richesses et Argent</label></h3>
</span>
<span class="item-field-label-short">
<label class="short-label">Quantité</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-add" data-type="monnaie" title="Ajouter une monnaie"><i
class="fas fa-plus"></i></a>
</div>
</li>
{{#each monnaies as |monnaie key|}}
<li class="item flexrow " data-item-id="{{monnaie._id}}" data-item-type="monnaie">
<img class="item-name-img" src="{{monnaie.img}}" />
<span class="item-name-label competence-name">{{monnaie.name}}</span>
<span class="item-name-label competence-name item-field-label-medium">{{monnaie.system.quantite}}
<a class="quantity-modify plus-minus-button" data-quantite-value="-1">-</a>
<a class="quantity-modify plus-minus-button" data-quantite-value="+1">+</a>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div>
<hr>
<div class="sheet-box color-bg-archetype">
<h4>
<label class="argent-total-text">
Valeur Total Equipement : {{valeurEquipement.po}} PO - {{valeurEquipement.pa}} PA - {{valeurEquipement.sc}} SC (total {{valeurEquipement.valueSC}} SC)
</label>
</h4>
</div>
<div class="sheet-box color-bg-archetype">
<ul class="item-list alternate-list">
@@ -347,9 +399,14 @@
<span class="item-name-label-header">
<h3><label class="items-title-text">Equipements</label></h3>
</span>
<span class="item-field-label-short">
<label class="short-label">Quantité</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-add" data-type="arme" title="Ajouter une arme"><i
<a class="item-control item-add" data-type="equipement" title="Ajouter un équipement"><i
class="fas fa-plus"></i></a>
</div>
</li>
@@ -357,6 +414,45 @@
<li class="item flexrow " data-item-id="{{equipement._id}}" data-item-type="equipement">
<img class="item-name-img" src="{{equipement.img}}" />
<span class="item-name-label competence-name">{{equipement.name}}</span>
<span class="item-name-label competence-name item-field-label-medium">{{equipement.system.quantite}}
<a class="quantity-modify plus-minus-button" data-quantite-value="-1">-</a>
<a class="quantity-modify plus-minus-button" data-quantite-value="+1">+</a>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div>
<div class="sheet-box color-bg-archetype">
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header">
<h3><label class="items-title-text">Artefacts</label></h3>
</span>
<span class="item-field-label-short">
<label class="short-label">Quantité</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-add" data-type="artefact" title="Ajouter un artefact"><i
class="fas fa-plus"></i></a>
</div>
</li>
{{#each artefacts as |artefact key|}}
<li class="item flexrow " data-item-id="{{artefact._id}}" data-item-type="artefact">
<img class="item-name-img" src="{{artefact.img}}" />
<span class="item-name-label competence-name">{{artefact.name}}</span>
<span class="item-name-label competence-name item-field-label-medium">{{artefact.system.quantite}}
<a class="quantity-modify plus-minus-button" data-quantite-value="-1">-</a>
<a class="quantity-modify plus-minus-button" data-quantite-value="+1">+</a>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
@@ -377,6 +473,7 @@
<div>
<ul class="item-list alternate-list">
{{#each historiques as |historique key|}}
<li class="item flexrow" data-item-id="{{historique._id}}">
<label class="generic-label">Historique : </label>
<label class="generic-label">{{historique.name}}</label>
@@ -386,6 +483,7 @@
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
{{#each profils as |profil key|}}
<li class="item flexrow" data-item-id="{{profil._id}}">
<label class="generic-label">Profil : </label>

View File

@@ -0,0 +1,48 @@
<div class="control-icon hawkmoon-adversite ">
<img class="hawkmoon-hud-togglebutton" src="icons/svg/sword.svg" width="36" height="36" title="Action" />
<div class="hawkmoon-hud-list tokenhudext right">
<div class="flexrow tokenhudicon">
<div class="hawkmoon-hud-adversite hud-adversite-container" data-action-value="-1"
data-action-index="bleue" title="Adversite Bleue">
<img class="icon-adversite" src="systems/fvtt-hawkmoon-cyd/assets/icons/gemme_bleue.webp">
<div class="hud-adversite-text">&nbsp;-1</div>
</div>
<div class="hawkmoon-hud-adversite hud-adversite-container" data-action-value="+1"
data-action-index="bleue" title="Adversite Bleue">
<img class="icon-adversite" src="systems/fvtt-hawkmoon-cyd/assets/icons/gemme_bleue.webp">
<div class="hud-adversite-text">&nbsp;+1</div>
</div>
</div>
<div class="flexrow tokenhudicon">
<div class="hawkmoon-hud-adversite hud-adversite-container" data-action-value="-1"
data-action-index="rouge" title="Adversite Rouge">
<img class="icon-adversite" src="systems/fvtt-hawkmoon-cyd/assets/icons/gemme_rouge.webp">
<div class="hud-adversite-text">&nbsp;-1</div>
</div>
<div class="hawkmoon-hud-adversite hud-adversite-container" data-action-value="+1"
data-action-index="rouge" title="Adversite Rouge">
<img class="icon-adversite" src="systems/fvtt-hawkmoon-cyd/assets/icons/gemme_rouge.webp">
<div class="hud-adversite-text">&nbsp;+1</div>
</div>
</div>
<div class="flexrow tokenhudicon">
<div class="hawkmoon-hud-adversite hud-adversite-container" data-action-value="-1"
data-action-index="noire" title="Adversite Noire">
<img class="icon-adversite" src="systems/fvtt-hawkmoon-cyd/assets/icons/gemme_noire.webp">
<div class="hud-adversite-text">&nbsp;-1</div>
</div>
<div class="hawkmoon-hud-adversite hud-adversite-container" data-action-value="+1"
data-action-index="noire" title="Adversite Noire">
<img class="icon-adversite" src="systems/fvtt-hawkmoon-cyd/assets/icons/gemme_noire.webp">
<div class="hud-adversite-text">&nbsp;+1</div>
</div>
</div>
</div>
</div>

View File

@@ -13,8 +13,19 @@
<ul class="item-list alternate-list">
{{> systems/fvtt-hawkmoon-cyd/templates/partial-item-prix.html}}
<li class="flexrow item">
<label class="generic-label item-field-label-long">Quantite </label>
<input type="text" class="padd-right numeric-input item-field-label-short" name="system.quantite"
value="{{system.quantite}}" data-dtype="Number" />
</li>
<li class="flexrow item">
<label class="generic-label item-field-label-long">Valeur en Sous de Cuivre (SC)</label>
<input type="text" class="numeric-input item-field-label-short" name="system.prixsc" value="{{system.prixsc}}"
data-dtype="Number" />
</li>
</ul>
</div>

View File

@@ -9,6 +9,12 @@
<input type="checkbox" name="system.equipped" {{checked system.equipped}} />
</li>
<li class="flexrow item">
<label class="generic-label item-field-label-long">Quantite </label>
<input type="text" class="padd-right numeric-input item-field-label-short" name="system.quantite"
value="{{system.quantite}}" data-dtype="Number" />
</li>
<li class="flexrow item">
<label class="generic-label item-field-label-long">Prix (PA) </label>