Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a2b712b78d | |||
| fc6bb7a4b1 | |||
| f26130d208 | |||
| 39da08d4cb | |||
| e639b6ae3e | |||
| 8c247a8981 | |||
| a09e1a1d95 | |||
| 787f88873a | |||
| ac481e0dd9 | |||
| 375622d900 | |||
| 3bc055cc1f | |||
| c97b7a4889 | |||
| 5d13500838 | |||
| d21515e1e3 | |||
| 78ef009465 | |||
| e794611bf3 | |||
| 529a62045e | |||
| d462d22a0a | |||
| 710ee54531 | |||
| 7994aa7db4 | |||
| 5176b4ce87 | |||
| 3d6f195fc2 | |||
| 3693d68c24 | |||
| 16ccd2f3e1 | |||
| 631eb280ca | |||
| 88ca98945f | |||
| edfb2105d3 |
54
.gitignore
vendored
Normal file
54
.gitignore
vendored
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# Dependencies
|
||||||
|
node_modules/
|
||||||
|
package-lock.json
|
||||||
|
|
||||||
|
# Build outputs
|
||||||
|
styles/tedeum.css
|
||||||
|
styles/*.css.map
|
||||||
|
|
||||||
|
# IDE & Editor files
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# System files
|
||||||
|
Thumbs.db
|
||||||
|
desktop.ini
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Temporary files
|
||||||
|
*.tmp
|
||||||
|
*.temp
|
||||||
|
.cache/
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
.env
|
||||||
|
.env.local
|
||||||
|
|
||||||
|
# Optional: Uncomment if you want to ignore pack database files
|
||||||
|
# These are usually committed for systems, but can be regenerated
|
||||||
|
# packs/**/*.ldb
|
||||||
|
# packs/**/LOG
|
||||||
|
# packs/**/LOG.old
|
||||||
|
# packs/**/MANIFEST-*
|
||||||
|
# packs/**/CURRENT
|
||||||
|
|
||||||
|
# Compiled source
|
||||||
|
dist/
|
||||||
|
build/
|
||||||
|
|
||||||
|
# OS generated files
|
||||||
|
.DS_Store
|
||||||
|
.DS_Store?
|
||||||
|
._*
|
||||||
|
.Spotlight-V100
|
||||||
|
.Trashes
|
||||||
|
ehthumbs.db
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
# 13.0.0
|
||||||
|
|
||||||
|
- Support de Foundry v13
|
||||||
|
|
||||||
# 12.0.23
|
# 12.0.23
|
||||||
|
|
||||||
- Correction sur les jets réussie en tir
|
- Correction sur les jets réussie en tir
|
||||||
|
|||||||
24
gulpfile.js
24
gulpfile.js
@@ -1,25 +1,17 @@
|
|||||||
var gulp = require('gulp');
|
var gulp = require('gulp');
|
||||||
|
var less = require('gulp-less');
|
||||||
var postcss = require('gulp-postcss');
|
var postcss = require('gulp-postcss');
|
||||||
|
|
||||||
var autoprefixer = require('autoprefixer');
|
var autoprefixer = require('autoprefixer');
|
||||||
var cssnext = require('postcss-preset-env');
|
|
||||||
var precss = require('precss');
|
|
||||||
|
|
||||||
gulp.task('css', function () {
|
gulp.task('css', function () {
|
||||||
|
return gulp.src('./less/*.less')
|
||||||
var processors = [
|
.pipe(less())
|
||||||
autoprefixer,
|
.pipe(postcss([autoprefixer]))
|
||||||
cssnext,
|
|
||||||
precss
|
|
||||||
];
|
|
||||||
|
|
||||||
return gulp.src('./postcss/*.css')
|
|
||||||
.pipe(postcss(processors))
|
|
||||||
.pipe(gulp.dest('./styles'));
|
.pipe(gulp.dest('./styles'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
gulp.task('watch', function () {
|
||||||
|
gulp.watch('./less/*.less', gulp.series('css'));
|
||||||
|
});
|
||||||
|
|
||||||
function watchUpdates() {
|
gulp.task('default', gulp.series('css'));
|
||||||
gulp.watch('./postcss/*.css', css);
|
|
||||||
}
|
|
||||||
|
|||||||
BIN
images/icons/xpplus1.webp
Normal file
BIN
images/icons/xpplus1.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.1 KiB |
2070
less/tedeum.less
Normal file
2070
less/tedeum.less
Normal file
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@
|
|||||||
import { TeDeumUtility } from "../common/tedeum-utility.js";
|
import { TeDeumUtility } from "../common/tedeum-utility.js";
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
export class TeDeumActorPJSheet extends ActorSheet {
|
export class TeDeumActorPJSheet extends foundry.appv1.sheets.ActorSheet {
|
||||||
|
|
||||||
/** @override */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
@@ -15,7 +15,7 @@ export class TeDeumActorPJSheet extends ActorSheet {
|
|||||||
classes: ["fvtt-te-deum", "sheet", "actor"],
|
classes: ["fvtt-te-deum", "sheet", "actor"],
|
||||||
template: "systems/fvtt-te-deum/templates/actors/actor-sheet.hbs",
|
template: "systems/fvtt-te-deum/templates/actors/actor-sheet.hbs",
|
||||||
width: 860,
|
width: 860,
|
||||||
height:680,
|
height: 680,
|
||||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "skills" }],
|
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "skills" }],
|
||||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
|
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
|
||||||
editScore: true
|
editScore: true
|
||||||
@@ -42,6 +42,7 @@ export class TeDeumActorPJSheet extends ActorSheet {
|
|||||||
providence: this.actor.prepareProvidence(),
|
providence: this.actor.prepareProvidence(),
|
||||||
arbreCompetences: this.actor.prepareArbreCompetences(),
|
arbreCompetences: this.actor.prepareArbreCompetences(),
|
||||||
equipements: this.actor.getEquipements(),
|
equipements: this.actor.getEquipements(),
|
||||||
|
simples: this.actor.getSimples(),
|
||||||
armures: this.actor.getArmures(),
|
armures: this.actor.getArmures(),
|
||||||
graces: this.actor.getGraces(),
|
graces: this.actor.getGraces(),
|
||||||
blessures: this.actor.getBlessures(),
|
blessures: this.actor.getBlessures(),
|
||||||
@@ -55,10 +56,10 @@ export class TeDeumActorPJSheet extends ActorSheet {
|
|||||||
nbArmuresLourdes: this.actor.getNbArmuresLourdesActuel(),
|
nbArmuresLourdes: this.actor.getNbArmuresLourdesActuel(),
|
||||||
santeModifier: this.actor.getSanteModifier(),
|
santeModifier: this.actor.getSanteModifier(),
|
||||||
educations: this.actor.getEducations(),
|
educations: this.actor.getEducations(),
|
||||||
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
|
description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.description, { async: true }),
|
||||||
equipmentfree: await TextEditor.enrichHTML(this.object.system.equipmentfree, { async: true }),
|
equipmentfree: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.equipmentfree, { async: true }),
|
||||||
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),
|
notes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.notes, { async: true }),
|
||||||
histoire: await TextEditor.enrichHTML(this.object.system.histoire, { async: true }),
|
histoire: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.histoire, { async: true }),
|
||||||
options: this.options,
|
options: this.options,
|
||||||
owner: this.document.isOwner,
|
owner: this.document.isOwner,
|
||||||
editScore: this.options.editScore,
|
editScore: this.options.editScore,
|
||||||
@@ -66,7 +67,6 @@ export class TeDeumActorPJSheet extends ActorSheet {
|
|||||||
}
|
}
|
||||||
this.formData = formData;
|
this.formData = formData;
|
||||||
|
|
||||||
console.log("PC : ", formData, this.object);
|
|
||||||
return formData;
|
return formData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ export class TeDeumActorPJSheet extends ActorSheet {
|
|||||||
// 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;
|
||||||
|
|
||||||
html.bind("keydown", function(e) { // Ignore Enter in actores sheet
|
html.bind("keydown", function (e) { // Ignore Enter in actores sheet
|
||||||
if (e.keyCode === 13) return false;
|
if (e.keyCode === 13) return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ export class TeDeumActorPJSheet extends ActorSheet {
|
|||||||
html.find('.item-edit').click(ev => {
|
html.find('.item-edit').click(ev => {
|
||||||
const li = $(ev.currentTarget).parents(".item-id")
|
const li = $(ev.currentTarget).parents(".item-id")
|
||||||
let itemId = li.data("item-id")
|
let itemId = li.data("item-id")
|
||||||
const item = this.actor.items.get( itemId );
|
const item = this.actor.items.get(itemId);
|
||||||
item.sheet.render(true);
|
item.sheet.render(true);
|
||||||
});
|
});
|
||||||
// Delete Inventory Item
|
// Delete Inventory Item
|
||||||
@@ -99,16 +99,20 @@ export class TeDeumActorPJSheet extends ActorSheet {
|
|||||||
let dataType = $(ev.currentTarget).data("type")
|
let dataType = $(ev.currentTarget).data("type")
|
||||||
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouveau " + dataType, type: dataType }], { renderSheet: true })
|
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouveau " + dataType, type: dataType }], { renderSheet: true })
|
||||||
})
|
})
|
||||||
|
html.find('.blessure-add').click(ev => {
|
||||||
|
let dataType = $(ev.currentTarget).data("type")
|
||||||
|
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvelle " + dataType, type: dataType, system: { typeBlessure: "estafilade", localisation: "corps", value: 0, appliquee: true, description: "" } }], { renderSheet: true })
|
||||||
|
})
|
||||||
html.find('.competence-add').click(ev => {
|
html.find('.competence-add').click(ev => {
|
||||||
let dataType = $(ev.currentTarget).data("type")
|
let dataType = $(ev.currentTarget).data("type")
|
||||||
let caracKey = $(ev.currentTarget).data("carac-key")
|
let caracKey = $(ev.currentTarget).data("carac-key")
|
||||||
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvelle " + dataType, type: dataType, system: {caracteristique: caracKey} }], { renderSheet: true })
|
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvelle " + dataType, type: dataType, system: { caracteristique: caracKey } }], { renderSheet: true })
|
||||||
})
|
})
|
||||||
|
|
||||||
html.find('.subactor-edit').click(ev => {
|
html.find('.subactor-edit').click(ev => {
|
||||||
const li = $(ev.currentTarget).parents(".item");
|
const li = $(ev.currentTarget).parents(".item");
|
||||||
let actorId = li.data("actor-id");
|
let actorId = li.data("actor-id");
|
||||||
let actor = game.actors.get( actorId );
|
let actor = game.actors.get(actorId);
|
||||||
actor.sheet.render(true);
|
actor.sheet.render(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -119,12 +123,12 @@ export class TeDeumActorPJSheet extends ActorSheet {
|
|||||||
});
|
});
|
||||||
html.find('.quantity-minus').click(event => {
|
html.find('.quantity-minus').click(event => {
|
||||||
const li = $(event.currentTarget).parents(".item");
|
const li = $(event.currentTarget).parents(".item");
|
||||||
this.actor.incDecQuantity( li.data("item-id"), -1 );
|
this.actor.incDecQuantity(li.data("item-id"), -1);
|
||||||
} );
|
});
|
||||||
html.find('.quantity-plus').click(event => {
|
html.find('.quantity-plus').click(event => {
|
||||||
const li = $(event.currentTarget).parents(".item");
|
const li = $(event.currentTarget).parents(".item");
|
||||||
this.actor.incDecQuantity( li.data("item-id"), +1 );
|
this.actor.incDecQuantity(li.data("item-id"), +1);
|
||||||
} );
|
});
|
||||||
|
|
||||||
html.find('.roll-competence').click((event) => {
|
html.find('.roll-competence').click((event) => {
|
||||||
let compId = $(event.currentTarget).data("comp-id")
|
let compId = $(event.currentTarget).data("comp-id")
|
||||||
@@ -146,13 +150,13 @@ export class TeDeumActorPJSheet extends ActorSheet {
|
|||||||
});
|
});
|
||||||
html.find('.item-equip').click(ev => {
|
html.find('.item-equip').click(ev => {
|
||||||
const li = $(ev.currentTarget).parents(".item");
|
const li = $(ev.currentTarget).parents(".item");
|
||||||
this.actor.equipItem( li.data("item-id") );
|
this.actor.equipItem(li.data("item-id"));
|
||||||
this.render(true);
|
this.render(true);
|
||||||
});
|
});
|
||||||
html.find('.update-field').change(ev => {
|
html.find('.update-field').change(ev => {
|
||||||
const fieldName = $(ev.currentTarget).data("field-name");
|
const fieldName = $(ev.currentTarget).data("field-name");
|
||||||
let value = Number(ev.currentTarget.value);
|
let value = Number(ev.currentTarget.value);
|
||||||
this.actor.update( { [`${fieldName}`]: value } );
|
this.actor.update({ [`${fieldName}`]: value });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ export class TeDeumActor extends Actor {
|
|||||||
return actor;
|
return actor;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.type == 'pj' || data.type == 'pnj') {
|
if (data.type == 'pj' || data.type == 'pnj') {
|
||||||
const skills = await TeDeumUtility.loadCompendium("fvtt-te-deum.competences")
|
const skills = await TeDeumUtility.loadCompendium("fvtt-te-deum.competences")
|
||||||
data.items = data.items || []
|
data.items = data.items || []
|
||||||
for (let skill of skills) {
|
for (let skill of skills) {
|
||||||
@@ -65,14 +65,43 @@ export class TeDeumActor extends Actor {
|
|||||||
super._preUpdate(changed, options, user);
|
super._preUpdate(changed, options, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
getCompetenceScore(compName) {
|
getCompetenceScore(compName) {
|
||||||
let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase())
|
let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase())
|
||||||
if (competence) {
|
if (competence) {
|
||||||
|
if (competence.system.isBase) {
|
||||||
|
return this.system.caracteristiques[competence.system.caracteristique].value
|
||||||
|
}
|
||||||
return competence.system.score
|
return competence.system.score
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getMeilleureCompetenceMainGauche(comp) {
|
||||||
|
let compScore = this.getCompetenceScore(comp.name)
|
||||||
|
let mainGaucheScore = this.getCompetenceScore("main gauche")
|
||||||
|
if (mainGaucheScore < compScore) {
|
||||||
|
ui.notifications.info(`${this.name} : Utilisation de la compétence Main Gauche au lieu de ${comp.name}`)
|
||||||
|
let mainGaucheComp = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "main gauche")
|
||||||
|
if (!mainGaucheComp) {
|
||||||
|
// Create a fake competence object
|
||||||
|
mainGaucheComp = foundry.utils.duplicate(comp)
|
||||||
|
mainGaucheComp.name = "Main Gauche"
|
||||||
|
mainGaucheComp.system.isBase = false
|
||||||
|
mainGaucheComp.system.score = 0
|
||||||
|
mainGaucheComp.system.caracteristique = "adresse"
|
||||||
|
mainGaucheComp.system.description = "Compétence Main Gauche (automatique)"
|
||||||
|
mainGaucheComp.system.isMainGauche = true
|
||||||
|
return mainGaucheComp
|
||||||
|
} else {
|
||||||
|
return mainGaucheComp
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return comp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
_onUpdate(changed, options, userId) {
|
_onUpdate(changed, options, userId) {
|
||||||
let updates = []
|
let updates = []
|
||||||
@@ -112,12 +141,6 @@ export class TeDeumActor extends Actor {
|
|||||||
updates.push({ _id: initiative.id, "system.score": Number(newScore) })
|
updates.push({ _id: initiative.id, "system.score": Number(newScore) })
|
||||||
}
|
}
|
||||||
|
|
||||||
let actionsTour = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "actions/tour")
|
|
||||||
newScore = this.getCommonBaseValue(this.system.caracteristiques.adresse.value)
|
|
||||||
if (actionsTour && actionsTour?.system.score != newScore) {
|
|
||||||
updates.push({ _id: actionsTour.id, "system.score": Number(newScore) })
|
|
||||||
}
|
|
||||||
|
|
||||||
let effort = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "effort")
|
let effort = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "effort")
|
||||||
newScore = this.getCommonBaseValue(this.system.caracteristiques.puissance.value)
|
newScore = this.getCommonBaseValue(this.system.caracteristiques.puissance.value)
|
||||||
if (effort && effort?.system.score != newScore) {
|
if (effort && effort?.system.score != newScore) {
|
||||||
@@ -147,7 +170,7 @@ export class TeDeumActor extends Actor {
|
|||||||
getCommonBaseValue(value) {
|
getCommonBaseValue(value) {
|
||||||
return game.system.tedeum.config.COMMON_VALUE[value]?.value || 0
|
return game.system.tedeum.config.COMMON_VALUE[value]?.value || 0
|
||||||
}
|
}
|
||||||
getInitiative() {
|
getInitiativeValue() {
|
||||||
return game.system.tedeum.config.COMMON_VALUE[this.system.caracteristiques.adresse.value]?.value || 0
|
return game.system.tedeum.config.COMMON_VALUE[this.system.caracteristiques.adresse.value]?.value || 0
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -155,6 +178,24 @@ export class TeDeumActor extends Actor {
|
|||||||
return game.system.tedeum.config.BONUS_DEGATS[this.system.caracteristiques.puissance.value]
|
return game.system.tedeum.config.BONUS_DEGATS[this.system.caracteristiques.puissance.value]
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
getAttaqueBonusDegats(rollData = undefined) {
|
||||||
|
let base = game.system.tedeum.config.BONUS_DEGATS[this.system.caracteristiques.puissance.value].value
|
||||||
|
let additionalBonus = 0
|
||||||
|
if (rollData) {
|
||||||
|
// Spécificité armes naturelle avec gantelet
|
||||||
|
if (rollData?.arme?.system.specificites?.poing?.hasSpec && this.items.find(item => item.type == "armure" && item.name.toLowerCase() == "gantelet" && item.system.equipe)) {
|
||||||
|
additionalBonus += 1
|
||||||
|
rollData.gantelet = true
|
||||||
|
}
|
||||||
|
if (rollData.isChargeAPied) {
|
||||||
|
additionalBonus += this.getCompetenceScore("course")
|
||||||
|
} else if (rollData.isChargeACheval) {
|
||||||
|
additionalBonus += this.getCompetenceScore("equitation")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return base + additionalBonus
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
getNbArmures() {
|
getNbArmures() {
|
||||||
return game.system.tedeum.config.MAX_ARMURES_LOURDES[this.system.caracteristiques.puissance.value]
|
return game.system.tedeum.config.MAX_ARMURES_LOURDES[this.system.caracteristiques.puissance.value]
|
||||||
}
|
}
|
||||||
@@ -200,6 +241,11 @@ export class TeDeumActor extends Actor {
|
|||||||
TeDeumUtility.sortArrayObjectsByName(comp)
|
TeDeumUtility.sortArrayObjectsByName(comp)
|
||||||
return comp;
|
return comp;
|
||||||
}
|
}
|
||||||
|
getSimples() {
|
||||||
|
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'simple') || [])
|
||||||
|
TeDeumUtility.sortArrayObjectsByName(comp)
|
||||||
|
return comp;
|
||||||
|
}
|
||||||
getArmures() {
|
getArmures() {
|
||||||
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'armure') || [])
|
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'armure') || [])
|
||||||
TeDeumUtility.sortArrayObjectsByName(comp)
|
TeDeumUtility.sortArrayObjectsByName(comp)
|
||||||
@@ -261,41 +307,105 @@ export class TeDeumActor extends Actor {
|
|||||||
modTotal += blessDef.modifier
|
modTotal += blessDef.modifier
|
||||||
}
|
}
|
||||||
// Si le nombre de blessures est supérieur au score d'endurance, alors malus supplémentaire
|
// Si le nombre de blessures est supérieur au score d'endurance, alors malus supplémentaire
|
||||||
let endurance = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "endurance")
|
let enduranceScore = this.getCompetenceScore("endurance")
|
||||||
if (blessures.length > endurance.system.score) {
|
if (blessures.length > enduranceScore) {
|
||||||
modTotal += -1
|
modTotal += -1
|
||||||
}
|
}
|
||||||
return modTotal
|
return modTotal
|
||||||
}
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async appliquerBlessure(blessureId, locId, comment = "") {
|
||||||
|
let blessure = game.system.tedeum.config.blessures[blessureId]
|
||||||
|
if (!blessure) {
|
||||||
|
ui.notifications.warn("Type de blessure inconnu : " + blessureId)
|
||||||
|
console.error("Type de blessure inconnu : " + blessureId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// Create a new blessure object
|
||||||
|
let blessureObj = {
|
||||||
|
name: blessure.label,
|
||||||
|
type: "blessure",
|
||||||
|
system: {
|
||||||
|
typeBlessure: blessureId,
|
||||||
|
localisation: locId || "maindroite",
|
||||||
|
value: blessure.value,
|
||||||
|
appliquee: true,
|
||||||
|
description: comment,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.createEmbeddedDocuments('Item', [blessureObj]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
getArmorDegatsModifier(rollData, combat) {
|
||||||
|
let loc = combat[rollData.loc.id]
|
||||||
|
// Sans armure
|
||||||
|
if (loc.armures.length == 0) {
|
||||||
|
return rollData.arme.system.degatsArmure.sansarmure
|
||||||
|
}
|
||||||
|
// Avec armure de cuir
|
||||||
|
if (loc.armures.find(a => a.system.typeArmure == "cuir")) {
|
||||||
|
return rollData.arme.system.degatsArmure.cuir
|
||||||
|
}
|
||||||
|
// Avec armure de maille
|
||||||
|
if (loc.armures.find(a => a.system.typeArmure == "maille")) {
|
||||||
|
return rollData.arme.system.degatsArmure.mailles
|
||||||
|
}
|
||||||
|
// Avec armure de plate
|
||||||
|
if (loc.armures.find(a => a.system.typeArmure == "plate")) {
|
||||||
|
return rollData.arme.system.degatsArmure.plates
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async appliquerDegats(rollData) {
|
async appliquerDegats(rollData) {
|
||||||
let combat = this.prepareCombat()
|
let combat = this.prepareCombat()
|
||||||
rollData.defenderName = this.name
|
rollData.defenderName = this.name
|
||||||
let touche = combat[rollData.loc.id].touche
|
let touche = combat[rollData.loc.id].touche
|
||||||
|
let armorDegatModifier = this.getArmorDegatsModifier(rollData, combat)
|
||||||
|
rollData.degats += armorDegatModifier
|
||||||
|
rollData.armorDegatModifier = armorDegatModifier
|
||||||
|
|
||||||
|
let blessureId = "indemne"
|
||||||
if (rollData.degats > 0 && rollData.degats > touche) {
|
if (rollData.degats > 0 && rollData.degats > touche) {
|
||||||
let diff = rollData.degats - touche
|
let diff = rollData.degats - touche
|
||||||
for (let bId in game.system.tedeum.config.blessures) {
|
for (let bId in game.system.tedeum.config.blessures) {
|
||||||
let blessure = game.system.tedeum.config.blessures[bId]
|
let blessure = game.system.tedeum.config.blessures[bId]
|
||||||
if (diff >= blessure.degatsMin && diff <= blessure.degatsMax) {
|
if (diff >= blessure.degatsMin && diff <= blessure.degatsMax) {
|
||||||
// Create a new blessure object
|
if (rollData.isReussiteCritique) {
|
||||||
let blessureObj = {
|
bId = game.system.tedeum.config.blessuresOrder[blessure.value + 1]
|
||||||
name: blessure.label,
|
|
||||||
type: "blessure",
|
|
||||||
system: {
|
|
||||||
typeBlessure: bId,
|
|
||||||
localisation: rollData.loc.id,
|
|
||||||
appliquee: true,
|
|
||||||
description: "Blessure infligée par un coup de " + rollData.arme.name + " de " + rollData.alias,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
rollData.blessure = blessureObj
|
blessureId = bId
|
||||||
this.createEmbeddedDocuments('Item', [blessureObj]);
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (rollData.isReussiteCritique && blessureId == "indemne") { // Critical success without degats => lightest blessure
|
||||||
|
blessureId = "estafilade"
|
||||||
|
}
|
||||||
|
console.log("Appliquer dégats", rollData, combat, blessureId)
|
||||||
|
if (blessureId != "indemne") {
|
||||||
|
let blessure = game.system.tedeum.config.blessures[blessureId]
|
||||||
|
// Create a new blessure object
|
||||||
|
let blessureObj = {
|
||||||
|
name: blessure.label,
|
||||||
|
type: "blessure",
|
||||||
|
system: {
|
||||||
|
typeBlessure: blessureId,
|
||||||
|
localisation: rollData.loc.id,
|
||||||
|
value: blessure.value,
|
||||||
|
appliquee: true,
|
||||||
|
description: "Blessure infligée par un coup de " + rollData.arme.name + " de " + rollData.alias,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rollData.blessure = blessureObj
|
||||||
|
rollData.touche = touche
|
||||||
|
this.createEmbeddedDocuments('Item', [blessureObj]);
|
||||||
|
}
|
||||||
// Display the relevant chat message
|
// Display the relevant chat message
|
||||||
let msg = await TeDeumUtility.createChatWithRollMode(rollData.alias, {
|
let msg = await TeDeumUtility.createChatWithRollMode(rollData.alias, {
|
||||||
content: await renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-blessure-result.hbs`, rollData)
|
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-blessure-result.hbs`, rollData)
|
||||||
})
|
})
|
||||||
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
||||||
}
|
}
|
||||||
@@ -305,7 +415,11 @@ export class TeDeumActor extends Actor {
|
|||||||
c.key = key
|
c.key = key
|
||||||
c.name = game.system.tedeum.config.caracteristiques[key].label
|
c.name = game.system.tedeum.config.caracteristiques[key].label
|
||||||
c.generalqualite = game.system.tedeum.config.descriptionValeur[c.value].qualite
|
c.generalqualite = game.system.tedeum.config.descriptionValeur[c.value].qualite
|
||||||
c.qualite = game.system.tedeum.config.descriptionValeur[c.value][key]
|
if (this.system.genre.toLowerCase() == "homme") {
|
||||||
|
c.qualite = game.system.tedeum.config.descriptionValeur[c.value][key]
|
||||||
|
} else {
|
||||||
|
c.qualite = game.system.tedeum.config.descriptionValeurFemme[c.value][key]
|
||||||
|
}
|
||||||
c.dice = game.system.tedeum.config.descriptionValeur[c.value].dice
|
c.dice = game.system.tedeum.config.descriptionValeur[c.value].dice
|
||||||
c.negativeDice = game.system.tedeum.config.descriptionValeur[c.value].negativeDice
|
c.negativeDice = game.system.tedeum.config.descriptionValeur[c.value].negativeDice
|
||||||
}
|
}
|
||||||
@@ -324,7 +438,11 @@ export class TeDeumActor extends Actor {
|
|||||||
prepareProvidence() {
|
prepareProvidence() {
|
||||||
let providence = foundry.utils.deepClone(this.system.providence)
|
let providence = foundry.utils.deepClone(this.system.providence)
|
||||||
providence.name = "Providence"
|
providence.name = "Providence"
|
||||||
providence.qualite = game.system.tedeum.config.providence[providence.value].labelM
|
if (this.system.genre.toLowerCase() == "homme") {
|
||||||
|
providence.qualite = game.system.tedeum.config.providence[providence.value].labelM
|
||||||
|
} else {
|
||||||
|
providence.qualite = game.system.tedeum.config.providence[providence.value].labelF
|
||||||
|
}
|
||||||
providence.dice = game.system.tedeum.config.providence[providence.value].diceValue
|
providence.dice = game.system.tedeum.config.providence[providence.value].diceValue
|
||||||
providence.description = "La Providence représente la Volonté Divine à l'œuvre pour guider ou sauver un être humain. Les PJ montent dans l’échelle de la Providence en menant à bien leurs missions et en se montrant vertueux. Les points de Providence peuvent servir à augmenter temporairement une caractéris- tique, à modifier la gravité d'une blessure, et à résister au vieillissement. Chaque person- nage commence avec un score initial de 1 en Providence (au niveau Pauvre pécheur)."
|
providence.description = "La Providence représente la Volonté Divine à l'œuvre pour guider ou sauver un être humain. Les PJ montent dans l’échelle de la Providence en menant à bien leurs missions et en se montrant vertueux. Les points de Providence peuvent servir à augmenter temporairement une caractéris- tique, à modifier la gravité d'une blessure, et à résister au vieillissement. Chaque person- nage commence avec un score initial de 1 en Providence (au niveau Pauvre pécheur)."
|
||||||
return providence
|
return providence
|
||||||
@@ -369,6 +487,7 @@ export class TeDeumActor extends Actor {
|
|||||||
xp = Math.max(xp + value, 0)
|
xp = Math.max(xp + value, 0)
|
||||||
await this.update({ [`system.caracteristiques.${key}.experience`]: xp })
|
await this.update({ [`system.caracteristiques.${key}.experience`]: xp })
|
||||||
this.sheet?.render(true)
|
this.sheet?.render(true)
|
||||||
|
ui.notifications.info(`+${value} XP en ${game.system.tedeum.config.caracteristiques[key].label}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -441,7 +560,7 @@ export class TeDeumActor extends Actor {
|
|||||||
flag = armure.system.superposableCuir
|
flag = armure.system.superposableCuir
|
||||||
}
|
}
|
||||||
if (item.system.typeArmure == "maille") {
|
if (item.system.typeArmure == "maille") {
|
||||||
flag = armure.system.superposableMaille
|
flag = armure.system.superposableMaille
|
||||||
}
|
}
|
||||||
if (item.system.typeArmure == "plate") {
|
if (item.system.typeArmure == "plate") {
|
||||||
flag = armure.system.superposablePlate
|
flag = armure.system.superposablePlate
|
||||||
@@ -516,12 +635,16 @@ export class TeDeumActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getInitiativeScore() {
|
getInitiativeScore() {
|
||||||
let initiative = this.items.find(it => it.type == "competence" && it.name.toLowerCase() == "initiative")
|
let initiative = this.getInitiativeValue()
|
||||||
if (initiative) {
|
// Vérifie les armes avec bonus d'initiative
|
||||||
return initiative.system.score
|
let armes = this.getArmes()
|
||||||
|
for (let arme of armes) {
|
||||||
|
if (arme.system.equipe && Number(arme.system.initiativeBonus) && Number(arme.system.initiativeBonus) != 0) {
|
||||||
|
ui.notifications.info("L'arme " + arme.name + " vous confère un bonus d'initiative de " + arme.system.initiativeBonus)
|
||||||
|
initiative += arme.system.initiativeBonus
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ui.notifications.warn("Impossible de trouver la compétence Initiative pour l'acteur " + this.name)
|
return initiative
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -582,6 +705,7 @@ export class TeDeumActor extends Actor {
|
|||||||
let rollData = this.getCommonCompetence(compId)
|
let rollData = this.getCommonCompetence(compId)
|
||||||
rollData.mode = "competence"
|
rollData.mode = "competence"
|
||||||
rollData.title = rollData.competence.name
|
rollData.title = rollData.competence.name
|
||||||
|
rollData.compScore = rollData.competence.system.isBase ? this.system.caracteristiques[rollData.competence.system.caracteristique].value : rollData.competence.system.score
|
||||||
this.startRoll(rollData).catch("Error on startRoll")
|
this.startRoll(rollData).catch("Error on startRoll")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -589,13 +713,13 @@ export class TeDeumActor extends Actor {
|
|||||||
async rollDegatsArme(armeId) {
|
async rollDegatsArme(armeId) {
|
||||||
let weapon = this.items.get(armeId)
|
let weapon = this.items.get(armeId)
|
||||||
if (weapon) {
|
if (weapon) {
|
||||||
let bDegats = 0
|
let bDegats = { value: 0 }
|
||||||
if ( weapon.system.typeArme == "melee" ) {
|
if (weapon.system.typeArme == "melee") {
|
||||||
bDegats = this.getBonusDegats()
|
bDegats = this.getBonusDegats()
|
||||||
}
|
}
|
||||||
let formula = weapon.system.degats + "+" + bDegats.value
|
let formula = weapon.system.degats + "+" + bDegats.value
|
||||||
let degatsRoll = await new Roll(formula).roll()
|
let degatsRoll = await new Roll(formula).roll()
|
||||||
await TeDeumUtility.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode") )
|
await TeDeumUtility.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode"))
|
||||||
let rollData = this.getCommonRollData()
|
let rollData = this.getCommonRollData()
|
||||||
rollData.mode = "degats"
|
rollData.mode = "degats"
|
||||||
rollData.formula = formula
|
rollData.formula = formula
|
||||||
@@ -604,7 +728,7 @@ export class TeDeumActor extends Actor {
|
|||||||
rollData.degats = degatsRoll.total
|
rollData.degats = degatsRoll.total
|
||||||
|
|
||||||
let msg = await TeDeumUtility.createChatWithRollMode(rollData.alias, {
|
let msg = await TeDeumUtility.createChatWithRollMode(rollData.alias, {
|
||||||
content: await renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-degats-result.hbs`, rollData)
|
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-degats-result.hbs`, rollData)
|
||||||
})
|
})
|
||||||
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
||||||
console.log("Rolldata result", rollData)
|
console.log("Rolldata result", rollData)
|
||||||
@@ -640,9 +764,14 @@ export class TeDeumActor extends Actor {
|
|||||||
let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase())
|
let competence = this.items.find(item => item.type == "competence" && item.name.toLowerCase() == compName.toLowerCase())
|
||||||
if (competence) {
|
if (competence) {
|
||||||
rollData.competence = competence
|
rollData.competence = competence
|
||||||
|
rollData.compScore = rollData.competence.system.isBase ? this.system.caracteristiques[rollData.competence.system.caracteristique].value : rollData.competence.system.score
|
||||||
let c = foundry.utils.duplicate(this.system.caracteristiques[competence.system.caracteristique])
|
let c = foundry.utils.duplicate(this.system.caracteristiques[competence.system.caracteristique])
|
||||||
this.updateCarac(c, competence.system.caracteristique)
|
this.updateCarac(c, competence.system.caracteristique)
|
||||||
rollData.carac = c
|
rollData.carac = c
|
||||||
|
rollData.allongeLabel = game.system.tedeum.config.armeAllonges[weapon.system.allonge].label
|
||||||
|
rollData.allongeId = "courte"
|
||||||
|
rollData.allonges = foundry.utils.duplicate(game.system.tedeum.config.allonges[weapon.system.allonge])
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ui.notifications.warn("Impossible de trouver la compétence " + compName)
|
ui.notifications.warn("Impossible de trouver la compétence " + compName)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -6,13 +6,14 @@ export class TeDeumCharacterCreator {
|
|||||||
async init() {
|
async init() {
|
||||||
this.stages = {}
|
this.stages = {}
|
||||||
this.currentStage = "origineSociale"
|
this.currentStage = "origineSociale"
|
||||||
this.sex = undefined
|
this.sexe = undefined
|
||||||
this.origineSociale = undefined
|
this.origineSociale = undefined
|
||||||
this.religion = undefined
|
this.religion = undefined
|
||||||
this.caracBonus = {}
|
this.caracBonus = {}
|
||||||
this.competenceBonus = {}
|
this.competenceBonus = {}
|
||||||
this.suiviReponses = []
|
this.suiviReponses = []
|
||||||
this.competences = TeDeumUtility.getCompetencesForDropDown()
|
this.competences = TeDeumUtility.getCompetencesForDropDown()
|
||||||
|
this.choiceSummary = {}
|
||||||
|
|
||||||
for (let k in game.system.tedeum.config.caracteristiques) {
|
for (let k in game.system.tedeum.config.caracteristiques) {
|
||||||
this.caracBonus[k] = { value: 0 }
|
this.caracBonus[k] = { value: 0 }
|
||||||
@@ -39,6 +40,7 @@ export class TeDeumCharacterCreator {
|
|||||||
} else {
|
} else {
|
||||||
this.competenceBonus[compName].value += 1
|
this.competenceBonus[compName].value += 1
|
||||||
}
|
}
|
||||||
|
this.choiceSummary[this.currentStage].competences[compName] = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
/*--------------------------------------------*/
|
/*--------------------------------------------*/
|
||||||
@@ -69,7 +71,7 @@ export class TeDeumCharacterCreator {
|
|||||||
|
|
||||||
/*--------------------------------------------*/
|
/*--------------------------------------------*/
|
||||||
async askStageName(context) {
|
async askStageName(context) {
|
||||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-stage-name.hbs", context)
|
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-stage-name.hbs", context)
|
||||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||||
window: { title: context.title },
|
window: { title: context.title },
|
||||||
classes: ["fvtt-te-deum"],
|
classes: ["fvtt-te-deum"],
|
||||||
@@ -116,6 +118,7 @@ export class TeDeumCharacterCreator {
|
|||||||
/*--------------------------------------------*/
|
/*--------------------------------------------*/
|
||||||
async askQuestionnaire(stage, context) {
|
async askQuestionnaire(stage, context) {
|
||||||
context.subtitle = "Questionnaire"
|
context.subtitle = "Questionnaire"
|
||||||
|
this.choiceSummary[this.currentStage].questionnaire = {}
|
||||||
|
|
||||||
for (let key in stage.system.questionnaire) {
|
for (let key in stage.system.questionnaire) {
|
||||||
let question = stage.system.questionnaire[key]
|
let question = stage.system.questionnaire[key]
|
||||||
@@ -127,7 +130,7 @@ export class TeDeumCharacterCreator {
|
|||||||
context.competences = {}
|
context.competences = {}
|
||||||
context.responseKey = "reponse1" // By default
|
context.responseKey = "reponse1" // By default
|
||||||
|
|
||||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-questions.hbs", context)
|
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-questions.hbs", context)
|
||||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||||
window: { title: context.title },
|
window: { title: context.title },
|
||||||
classes: ["fvtt-te-deum"],
|
classes: ["fvtt-te-deum"],
|
||||||
@@ -170,13 +173,14 @@ export class TeDeumCharacterCreator {
|
|||||||
let compName = context.competences[context.responseKey] || selectedResponse.compName
|
let compName = context.competences[context.responseKey] || selectedResponse.compName
|
||||||
this.increaseCompetence(compName)
|
this.increaseCompetence(compName)
|
||||||
|
|
||||||
this.suiviReponses.push({ etape: stage.name, question: question.question, reponse: selectedResponse.reponse, compName: compName })
|
this.suiviReponses.push({ key: this.currentStage, etape: stage.name, question: question.question, reponse: selectedResponse.reponse, compName: compName })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------- -------------------------------*/
|
/*------------- -------------------------------*/
|
||||||
async askCompetences(stage, context) {
|
async askCompetences(stage, context) {
|
||||||
context.subtitle = "Choix des Compétences"
|
context.subtitle = "Choix des Compétences"
|
||||||
|
this.choiceSummary[this.currentStage].competences = {}
|
||||||
|
|
||||||
context.fixedCompetences = {}
|
context.fixedCompetences = {}
|
||||||
context.selectCompetences = {}
|
context.selectCompetences = {}
|
||||||
@@ -192,7 +196,7 @@ export class TeDeumCharacterCreator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-competences.hbs", context)
|
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-competences.hbs", context)
|
||||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||||
window: { title: context.title },
|
window: { title: context.title },
|
||||||
classes: ["fvtt-te-deum"],
|
classes: ["fvtt-te-deum"],
|
||||||
@@ -236,7 +240,7 @@ export class TeDeumCharacterCreator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-competences.hbs", context)
|
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-competences.hbs", context)
|
||||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||||
window: { title: context.title },
|
window: { title: context.title },
|
||||||
classes: ["fvtt-te-deum"],
|
classes: ["fvtt-te-deum"],
|
||||||
@@ -273,6 +277,10 @@ export class TeDeumCharacterCreator {
|
|||||||
/*------------- -------------------------------*/
|
/*------------- -------------------------------*/
|
||||||
async askCarac(stage, context) {
|
async askCarac(stage, context) {
|
||||||
context.subtitle = "Choix des Caractéristiques"
|
context.subtitle = "Choix des Caractéristiques"
|
||||||
|
this.choiceSummary[this.currentStage] = {
|
||||||
|
caracBonus : {},
|
||||||
|
competences : {}
|
||||||
|
}
|
||||||
|
|
||||||
let selected = []
|
let selected = []
|
||||||
for (let i = 0; i < stage.system.nbChoixCarac; i++) {
|
for (let i = 0; i < stage.system.nbChoixCarac; i++) {
|
||||||
@@ -283,7 +291,7 @@ export class TeDeumCharacterCreator {
|
|||||||
context.caracList.push(game.system.tedeum.config.caracteristiques[carac.caracId])
|
context.caracList.push(game.system.tedeum.config.caracteristiques[carac.caracId])
|
||||||
}
|
}
|
||||||
|
|
||||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-carac.hbs", context)
|
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-carac.hbs", context)
|
||||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||||
window: { title: context.title },
|
window: { title: context.title },
|
||||||
classes: ["fvtt-te-deum"],
|
classes: ["fvtt-te-deum"],
|
||||||
@@ -312,6 +320,7 @@ export class TeDeumCharacterCreator {
|
|||||||
}
|
}
|
||||||
this.caracBonus[choiceResult.carac].value += 1
|
this.caracBonus[choiceResult.carac].value += 1
|
||||||
selected.push(choiceResult.carac)
|
selected.push(choiceResult.carac)
|
||||||
|
this.choiceSummary[this.currentStage].caracBonus[choiceResult.carac] = 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -325,7 +334,7 @@ export class TeDeumCharacterCreator {
|
|||||||
origineChoice: game.system.tedeum.config.origineSociale
|
origineChoice: game.system.tedeum.config.origineSociale
|
||||||
}
|
}
|
||||||
|
|
||||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-origine.hbs", context)
|
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-origine.hbs", context)
|
||||||
const label = "Valider le choix de l'Origine Sociale"
|
const label = "Valider le choix de l'Origine Sociale"
|
||||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||||
window: { title: context.title },
|
window: { title: context.title },
|
||||||
@@ -360,6 +369,12 @@ export class TeDeumCharacterCreator {
|
|||||||
for (let key in this.origineSociale.caracteristiques) {
|
for (let key in this.origineSociale.caracteristiques) {
|
||||||
this.caracBonus[key].value += this.origineSociale.caracteristiques[key]
|
this.caracBonus[key].value += this.origineSociale.caracteristiques[key]
|
||||||
}
|
}
|
||||||
|
this.choiceSummary['origineSociale'] = {
|
||||||
|
sexe: this.sexe,
|
||||||
|
religion: this.religion,
|
||||||
|
origineSociale: this.origineSociale.label,
|
||||||
|
caracBonus: this.caracBonus,
|
||||||
|
}
|
||||||
this.currentStage = "pouponniere"
|
this.currentStage = "pouponniere"
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -388,6 +403,7 @@ export class TeDeumCharacterCreator {
|
|||||||
this.pouponniere = foundry.utils.duplicate(stage.items.find(item => item.id === choiceResult.selectedItem))
|
this.pouponniere = foundry.utils.duplicate(stage.items.find(item => item.id === choiceResult.selectedItem))
|
||||||
context.title = `La Pouponnière - ${this.pouponniere.name}`
|
context.title = `La Pouponnière - ${this.pouponniere.name}`
|
||||||
TeDeumUtility.prepareEducationContent(this.pouponniere);
|
TeDeumUtility.prepareEducationContent(this.pouponniere);
|
||||||
|
this.choiceSummary['pouponniere'] = {}
|
||||||
|
|
||||||
context.label = "Valider l'augmentation de caracteristique"
|
context.label = "Valider l'augmentation de caracteristique"
|
||||||
await this.askCarac(this.pouponniere, context)
|
await this.askCarac(this.pouponniere, context)
|
||||||
@@ -581,8 +597,36 @@ export class TeDeumCharacterCreator {
|
|||||||
await actor.update({ [`system.fortune.${this.origineSociale.cagnotteUnit}`]: newArgent})
|
await actor.update({ [`system.fortune.${this.origineSociale.cagnotteUnit}`]: newArgent})
|
||||||
|
|
||||||
let histoire = ""
|
let histoire = ""
|
||||||
for (let reponse of this.suiviReponses) {
|
for ( let key in this.choiceSummary) {
|
||||||
histoire += `<p>${reponse.question}<br>${reponse.reponse} (${reponse.compName})</p>`
|
let stageSummary = this.choiceSummary[key]
|
||||||
|
if (stageSummary.sexe) {
|
||||||
|
histoire += `<h3>Origine Sociale</h3>`
|
||||||
|
histoire += `<p>${stageSummary.sexe} - ${stageSummary.religion} - ${stageSummary.origineSociale}</p>`
|
||||||
|
} else {
|
||||||
|
histoire += `<h3>${game.system.tedeum.config.etapesEducation[key].label}</h3>`
|
||||||
|
}
|
||||||
|
if (stageSummary.caracBonus) {
|
||||||
|
histoire += `<p><strong>Caractéristiques : </strong><ul>`
|
||||||
|
for (let caracKey in stageSummary.caracBonus) {
|
||||||
|
histoire += `<li>${TeDeumUtility.upperFirst(caracKey)} +1</li>`
|
||||||
|
}
|
||||||
|
histoire += `</ul></p>`
|
||||||
|
}
|
||||||
|
if (stageSummary.competences) {
|
||||||
|
histoire += `<p><strong>Compétences : </strong><ul>`
|
||||||
|
for (let compName in stageSummary.competences) {
|
||||||
|
histoire += `<li>${TeDeumUtility.upperFirst(compName)} +1</li>`
|
||||||
|
}
|
||||||
|
histoire += `</ul></p>`
|
||||||
|
}
|
||||||
|
let questions = this.suiviReponses.filter( r => r.key === key)
|
||||||
|
if (questions.length > 0) {
|
||||||
|
histoire += `<p><strong>Réponses au questionnaire : </strong><ul>`
|
||||||
|
for (let question of questions) {
|
||||||
|
histoire += `<li>${question.question} : <i>${question.reponse}</i> (${TeDeumUtility.upperFirst(question.compName)}+1)</li>`
|
||||||
|
}
|
||||||
|
histoire += `</ul></p>`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
await actor.update({ "system.histoire": histoire})
|
await actor.update({ "system.histoire": histoire})
|
||||||
actor.render(true)
|
actor.render(true)
|
||||||
@@ -596,7 +640,7 @@ export class TeDeumCharacterCreator {
|
|||||||
"adresse": { score: actor.getCompetenceScore("Initiative"), label: "Adresse" },
|
"adresse": { score: actor.getCompetenceScore("Initiative"), label: "Adresse" },
|
||||||
}
|
}
|
||||||
|
|
||||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-finished.hbs", context)
|
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-finished.hbs", context)
|
||||||
const label = "Terminer"
|
const label = "Terminer"
|
||||||
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
||||||
window: { title: context.title },
|
window: { title: context.title },
|
||||||
|
|||||||
@@ -4,18 +4,42 @@ import { TeDeumUtility } from "../common/tedeum-utility.js";
|
|||||||
export class TeDeumCombat extends Combat {
|
export class TeDeumCombat extends Combat {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async rollInitiative(ids, formula = undefined, messageOptions = {} ) {
|
async rollInitiative(ids, formula = undefined, messageOptions = {}) {
|
||||||
//console.log("Roll INIT !")
|
//console.log("Roll INIT !")
|
||||||
ids = typeof ids === "string" ? [ids] : ids;
|
ids = typeof ids === "string" ? [ids] : ids;
|
||||||
for (let cId of ids) {
|
for (let cId of ids) {
|
||||||
const c = this.combatants.get(cId);
|
const c = this.combatants.get(cId);
|
||||||
let initBonus = c.actor ? c.actor.getInitiativeScore( this.id, cId ) : -1;
|
let initBonus = c.actor ? c.actor.getInitiativeScore(this.id, cId) : -1;
|
||||||
await this.updateEmbeddedDocuments("Combatant", [ { _id: cId, initiative: initBonus } ]);
|
console.log("Init Bonus : ", c.name, initBonus)
|
||||||
|
await this.updateEmbeddedDocuments("Combatant", [{ _id: cId, initiative: initBonus }]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
async modifyAction(combatantId, delta, isMainGauche = false) {
|
||||||
|
let combatant = this.combatants.get(combatantId)
|
||||||
|
if (!combatant) return;
|
||||||
|
let ca = combatant.getFlag("world", "available-actions")
|
||||||
|
if (!ca) {
|
||||||
|
ca = { nbActions: 1, nbActionsMainGauche: 0 }
|
||||||
|
}
|
||||||
|
if (isMainGauche) {
|
||||||
|
ca.nbActionsMainGauche += delta
|
||||||
|
} else {
|
||||||
|
ca.nbActions += delta
|
||||||
|
}
|
||||||
|
if (ca.nbActionsMainGauche < 0) ca.nbActionsMainGauche = 0
|
||||||
|
if (ca.nbActions < 0) ca.nbActions = 0
|
||||||
|
console.log("Modify Action : ", combatant.name, ca)
|
||||||
|
if (game.user.isGM) {
|
||||||
|
await TeDeumUtility.updateCombatantActions(combatant, ca)
|
||||||
|
} else {
|
||||||
|
game.socket.emit("system.fvtt-te-deum", { msg: "msg_modify_combat_action", data: { combatantId: combatantId, ca: ca } })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async checkTurnPosition() {
|
static async checkTurnPosition() {
|
||||||
while (game.combat.turn > 0) {
|
while (game.combat.turn > 0) {
|
||||||
|
|||||||
@@ -4,30 +4,46 @@ export const SYSTEM_ID = "fvtt-te-deum";
|
|||||||
export const TEDEUM_CONFIG = {
|
export const TEDEUM_CONFIG = {
|
||||||
|
|
||||||
BONUS_DEGATS: [{}, { label: "1d4", value: -2 }, { label: "1d6", value: -1 }, { label: "1d8", value: 0 },
|
BONUS_DEGATS: [{}, { label: "1d4", value: -2 }, { label: "1d6", value: -1 }, { label: "1d8", value: 0 },
|
||||||
{ label: "1d10", value: 1 }, { label: "1d12", value: 2 }, { label: "1d20", value: 3 }],
|
{ label: "1d10", value: 1 }, { label: "1d12", value: 2 }, { label: "1d20", value: 3 }],
|
||||||
MAX_ARMURES_LOURDES: [{}, { value: 1 }, { value: 3 }, { value: 5 },
|
MAX_ARMURES_LOURDES: [{}, { value: 1 }, { value: 3 }, { value: 5 },
|
||||||
{ value: 7 }, { value: 9 }, { value: 11 }],
|
{ value: 7 }, { value: 9 }, { value: 11 }],
|
||||||
ACTIONS_PAR_TOUR: [{}, { value: 1 }, { value: 2 }, { value: 2 },
|
ACTIONS_PAR_TOUR: [{}, { value: 1 }, { value: 2 }, { value: 2 },
|
||||||
{ value: 3 }, { value: 3 }, { value: 4 }],
|
{ value: 3 }, { value: 3 }, { value: 4 }],
|
||||||
COMMON_VALUE: [{}, { value: 1 }, { value: 2 }, { value: 3 },
|
COMMON_VALUE: [{}, { value: 1 }, { value: 2 }, { value: 3 },
|
||||||
{ value: 4 }, { value: 5 }, { value: 6 }],
|
{ value: 4 }, { value: 5 }, { value: 6 }],
|
||||||
COUT_XP: [{}, { value: 10 }, { value: 10 }, { value: 10 },
|
COUT_XP: [{}, { value: 10 }, { value: 10 }, { value: 10 },
|
||||||
{ value: 10 }, { value: 30 }, { value: 50 }],
|
{ value: 10 }, { value: 30 }, { value: 50 }],
|
||||||
|
|
||||||
LOCALISATION: {
|
LOCALISATION: {
|
||||||
"pieddroit": { label: "Pied Droit", value: 1, locMod: 0, id: "pieddroit", nbArmure: 1, score: { min: 1, max: 1 }, coord: { top: 500, left: 0 } },
|
"pieddroit": { label: "Pied Droit", value: 1, locMod: 0, id: "pieddroit", categorie: "pied", nbArmure: 1, score: { min: 1, max: 1 }, coord: { top: 500, left: 0 } },
|
||||||
"jambedroite": { label: "Jambe Droite", value: 1, locMod: -1, id: "jambedroite", nbArmure: 1, score: { min: 3, max: 4 }, coord: { top: 400, left: 100 } },
|
"jambedroite": { label: "Jambe Droite", value: 1, locMod: -1, id: "jambedroite", categorie: "jambe", nbArmure: 1, score: { min: 3, max: 4 }, coord: { top: 400, left: 100 } },
|
||||||
"jambegauche": { label: "Jambe Gauche", value: 1, locMod: -1, id: "jambegauche", nbArmure: 1, score: { min: 5, max: 6 }, coord: { top: 400, left: 300 } },
|
"jambegauche": { label: "Jambe Gauche", value: 1, locMod: -1, id: "jambegauche", categorie: "jambe", nbArmure: 1, score: { min: 5, max: 6 }, coord: { top: 400, left: 300 } },
|
||||||
"piedgauche": { label: "Pied Gauche", value: 1, locMod: 0, id: "piedgauche", nbArmure: 1, score: { min: 2, max: 2 }, coord: { top: 500, left: 400 } },
|
"piedgauche": { label: "Pied Gauche", value: 1, locMod: 0, id: "piedgauche", categorie: "pied", nbArmure: 1, score: { min: 2, max: 2 }, coord: { top: 500, left: 400 } },
|
||||||
"maindroite": { label: "Main Droite", value: 1, locMod: 0, id: "maindroite", nbArmure: 1, score: { min: 7, max: 7 }, coord: { top: 0, left: 0 } },
|
"maindroite": { label: "Main Droite", value: 1, locMod: 0, id: "maindroite", categorie: "main", nbArmure: 1, score: { min: 7, max: 7 }, coord: { top: 0, left: 0 } },
|
||||||
"maingauche": { label: "Main Gauche", value: 1, locMod: 0, id: "maingauche", nbArmure: 1, score: { min: 8, max: 8 }, coord: { top: 0, left: 400 } },
|
"maingauche": { label: "Main Gauche", value: 1, locMod: 0, id: "maingauche", categorie: "main", nbArmure: 1, score: { min: 8, max: 8 }, coord: { top: 0, left: 400 } },
|
||||||
"brasdroit": { label: "Bras Droit", value: 1, locMod: -1, id: "brasdroit", nbArmure: 2, score: { min: 9, max: 10 }, coord: { top: 200, left: 0 } },
|
"brasdroit": { label: "Bras Droit", value: 1, locMod: -1, id: "brasdroit", categorie: "bras", nbArmure: 2, score: { min: 9, max: 10 }, coord: { top: 200, left: 0 } },
|
||||||
"brasgauche": { label: "Bras Gauche", value: 1, locMod: -1, id: "brasgauche", nbArmure: 2, score: { min: 11, max: 12 }, coord: { top: 200, left: 400 } },
|
"brasgauche": { label: "Bras Gauche", value: 1, locMod: -1, id: "brasgauche", categorie: "bras", nbArmure: 2, score: { min: 11, max: 12 }, coord: { top: 200, left: 400 } },
|
||||||
"corps": { label: "Corps", value: 1, id: "corps", locMod: -2, nbArmure: 2, score: { min: 13, max: 17 }, coord: { top: 200, left: 200 } },
|
"corps": { label: "Corps", value: 1, id: "corps", categorie: "corps", locMod: -2, nbArmure: 2, score: { min: 13, max: 17 }, coord: { top: 200, left: 200 } },
|
||||||
"tete": { label: "Tête", value: 1, id: "tete", locMod: -2, nbArmure: 2, score: { min: 18, max: 20 }, coord: { top: 0, left: 200 } },
|
"tete": { label: "Tête", value: 1, id: "tete", categorie: "tete", locMod: -2, nbArmure: 2, score: { min: 18, max: 20 }, coord: { top: 0, left: 200 } },
|
||||||
|
},
|
||||||
|
|
||||||
|
ATTAQUE_CIBLEES: {
|
||||||
|
"aucune": { label: "Aucune", id: "aucune", locMod: 0, description: "Attaque non ciblée" },
|
||||||
|
"pieddroit": { label: "Pied Droit", id: "pieddroit", locMod: 0, description: "Attaque ciblée sur le pied droit" },
|
||||||
|
"jambedroite": { label: "Jambe Droite", id: "jambedroite", locMod: -1, description: "Attaque ciblée sur la jambe droite" },
|
||||||
|
"jambegauche": { label: "Jambe Gauche", id: "jambegauche", locMod: -1, description: "Attaque ciblée sur la jambe gauche" },
|
||||||
|
"piedgauche": { label: "Pied Gauche", id: "piedgauche", locMod: 0, description: "Attaque ciblée sur le pied gauche" },
|
||||||
|
"maindroite": { label: "Main Droite", id: "maindroite", locMod: 0, description: "Attaque ciblée sur la main droite" },
|
||||||
|
"maingauche": { label: "Main Gauche", id: "maingauche", locMod: 0, description: "Attaque ciblée sur la main gauche" },
|
||||||
|
"brasdroit": { label: "Bras Droit", id: "brasdroit", locMod: -1, description: "Attaque ciblée sur le bras droit" },
|
||||||
|
"brasgauche": { label: "Bras Gauche", id: "brasgauche", locMod: -1, description: "Attaque ciblée sur le bras gauche" },
|
||||||
|
"corps": { label: "Corps", id: "corps", locMod: -2, description: "Attaque ciblée sur le corps" },
|
||||||
|
"tete": { label: "Tête", id: "tete", locMod: -2, description: "Attaque ciblée sur la tête" },
|
||||||
},
|
},
|
||||||
|
|
||||||
ARME_SPECIFICITE: {
|
ARME_SPECIFICITE: {
|
||||||
|
"poing": { label: "Poings", id: "poing", melee: true, tir: false },
|
||||||
|
"pied": { label: "Pieds", id: "pied", melee: true, tir: false },
|
||||||
"encombrante": { label: "Encombrante", id: "encombrante", melee: true, tir: true },
|
"encombrante": { label: "Encombrante", id: "encombrante", melee: true, tir: true },
|
||||||
"maintiendistance": { label: "Maintien à distance", id: "maintiendistance", melee: true, tir: false },
|
"maintiendistance": { label: "Maintien à distance", id: "maintiendistance", melee: true, tir: false },
|
||||||
"coupassomant": { label: "Coup assomant", id: "coupassomant", melee: true, tir: false },
|
"coupassomant": { label: "Coup assomant", id: "coupassomant", melee: true, tir: false },
|
||||||
@@ -43,11 +59,11 @@ export const TEDEUM_CONFIG = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
ARME_PORTEES: {
|
ARME_PORTEES: {
|
||||||
"brulepourpoint": { label: "Brûle-pourpoint", difficulty: "facile", id: "brulepourpoint" },
|
"brulepourpoint": { label: "Brûle-pourpoint (5)", difficulty: "facile", id: "brulepourpoint" },
|
||||||
"courte": { label: "Courte", difficulty: "pardefaut", id: "courte" },
|
"courte": { label: "Courte (7)", difficulty: "pardefaut", id: "courte" },
|
||||||
"moyenne": { label: "Moyenne", difficulty: "difficile", id: "moyenne" },
|
"moyenne": { label: "Moyenne (11)", difficulty: "difficile", id: "moyenne" },
|
||||||
"longue": { label: "Longue", difficulty: "perilleux", id: "longue" },
|
"longue": { label: "Longue (13)", difficulty: "perilleux", id: "longue" },
|
||||||
"extreme": { label: "Extrême", difficulty: "desespere", id: "extreme" },
|
"extreme": { label: "Extrême (15)", difficulty: "desespere", id: "extreme" },
|
||||||
},
|
},
|
||||||
|
|
||||||
genre: {
|
genre: {
|
||||||
@@ -77,6 +93,14 @@ export const TEDEUM_CONFIG = {
|
|||||||
5: { valeur: 5, qualite: "Excellent", dice: "d12", negativeDice: "d6", savoir: "Docte", sensibilite: "Subtil", entregent: "Galant", puissance: "Musculeux", complexion: "Sanguin", adresse: "Preste" },
|
5: { valeur: 5, qualite: "Excellent", dice: "d12", negativeDice: "d6", savoir: "Docte", sensibilite: "Subtil", entregent: "Galant", puissance: "Musculeux", complexion: "Sanguin", adresse: "Preste" },
|
||||||
6: { valeur: 6, qualite: "Admirable", dice: "d20", negativeDice: "d4", savoir: "Humaniste", sensibilite: "Spirituel", entregent: "Sémillant", puissance: "Hercule", complexion: "Aguerri", adresse: "Alerte" },
|
6: { valeur: 6, qualite: "Admirable", dice: "d20", negativeDice: "d4", savoir: "Humaniste", sensibilite: "Spirituel", entregent: "Sémillant", puissance: "Hercule", complexion: "Aguerri", adresse: "Alerte" },
|
||||||
},
|
},
|
||||||
|
descriptionValeurFemme: {
|
||||||
|
1: { valeur: 1, qualite: "Mauvais", dice: "d4", negativeDice: "d20", savoir: "Sotte", sensibilite: "Obtuse", entregent: "Rustaude", puissance: "Menue", complexion: "Anémique", adresse: "Empesée" },
|
||||||
|
2: { valeur: 2, qualite: "Médiocre", dice: "d6", negativeDice: "d12", savoir: "Limitée", sensibilite: "Etriquée", entregent: "Fruste", puissance: "Délicate", complexion: "Languide", adresse: "Gauche" },
|
||||||
|
3: { valeur: 3, qualite: "Correct", dice: "d8", negativeDice: "d10", savoir: "Mêlée", sensibilite: "Ouverte", entregent: "Badine", puissance: "Membrue", complexion: "Dispose", adresse: "Ingambe" },
|
||||||
|
4: { valeur: 4, qualite: "Bon", dice: "d10", negativeDice: "d8", savoir: "Lettrée", sensibilite: "Fine", entregent: "Diserte", puissance: "Vigoureuse", complexion: "Gaillarde", adresse: "Leste" },
|
||||||
|
5: { valeur: 5, qualite: "Excellent", dice: "d12", negativeDice: "d6", savoir: "Docte", sensibilite: "Subtile", entregent: "Galante", puissance: "Musculeuse", complexion: "Sanguine", adresse: "Preste" },
|
||||||
|
6: { valeur: 6, qualite: "Admirable", dice: "d20", negativeDice: "d4", savoir: "Humaniste", sensibilite: "Spirituelle", entregent: "Sémillante", puissance: "Hercule", complexion: "Aguerrie", adresse: "Alerte" },
|
||||||
|
},
|
||||||
diceValeur: ["d4", "d6", "d8", "d10", "d12", "d20"],
|
diceValeur: ["d4", "d6", "d8", "d10", "d12", "d20"],
|
||||||
degatsArmure: {
|
degatsArmure: {
|
||||||
sansarmure: { label: "Sans armure" },
|
sansarmure: { label: "Sans armure" },
|
||||||
@@ -86,7 +110,7 @@ export const TEDEUM_CONFIG = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
caracteristiques: {
|
caracteristiques: {
|
||||||
savoir: { id: "savoir", value: "savoir", label: "Savoir", description:"Cette caractéristique correspond à la capacité d'abstraction intellectuelle ainsi qu'à la culture générale du personnage. Elle permet d'évaluer la compétence de base Mémoriser." },
|
savoir: { id: "savoir", value: "savoir", label: "Savoir", description: "Cette caractéristique correspond à la capacité d'abstraction intellectuelle ainsi qu'à la culture générale du personnage. Elle permet d'évaluer la compétence de base Mémoriser." },
|
||||||
sensibilite: { id: "sensibilite", value: "sensibilite", label: "Sensibilité", description: "Cette caractéristique correspond à l'ouverture du personnage sur le monde. Elle englobe l'altruisme, la spiritualité et la créativité du personnage. Elle permet d'évaluer la compétence de base Perception." },
|
sensibilite: { id: "sensibilite", value: "sensibilite", label: "Sensibilité", description: "Cette caractéristique correspond à l'ouverture du personnage sur le monde. Elle englobe l'altruisme, la spiritualité et la créativité du personnage. Elle permet d'évaluer la compétence de base Perception." },
|
||||||
entregent: { id: "entregent", value: "entregent", label: "Entregent", description: "Cette caractéristique correspond à l'ensemble des prédispositions sociales du personnage. Elle englobe le charisme et le respect des usages. Elle permet d'évaluer la compétence de base Charme." },
|
entregent: { id: "entregent", value: "entregent", label: "Entregent", description: "Cette caractéristique correspond à l'ensemble des prédispositions sociales du personnage. Elle englobe le charisme et le respect des usages. Elle permet d'évaluer la compétence de base Charme." },
|
||||||
complexion: { id: "complexion", value: "complexion", label: "Complexion", description: "Cette caractéristique permet d'évaluer la santé et la résistance physique du per- sonnage. Elle permet de calculer la com- pétence de base Endurance, capitale dans la résolution des blessures, la résistance à la douleur, au poison et aux maladies." },
|
complexion: { id: "complexion", value: "complexion", label: "Complexion", description: "Cette caractéristique permet d'évaluer la santé et la résistance physique du per- sonnage. Elle permet de calculer la com- pétence de base Endurance, capitale dans la résolution des blessures, la résistance à la douleur, au poison et aux maladies." },
|
||||||
@@ -94,10 +118,10 @@ export const TEDEUM_CONFIG = {
|
|||||||
adresse: { id: "adresse", value: "adresse", label: "Adresse", description: "Cette caractéristique correspond à la rapidité et la dextérité du personnage. Elle livre le nombre d'actions qu'un personnage peut accomplir en un tour de combat et permet d'évaluer les compétences de base Initiative & Course." },
|
adresse: { id: "adresse", value: "adresse", label: "Adresse", description: "Cette caractéristique correspond à la rapidité et la dextérité du personnage. Elle livre le nombre d'actions qu'un personnage peut accomplir en un tour de combat et permet d'évaluer les compétences de base Initiative & Course." },
|
||||||
},
|
},
|
||||||
allonges: {
|
allonges: {
|
||||||
courte: { courte: { malus: 0 }, moyenne: { malus: -1 }, longue: { malus: -2 }, treslongue: { malus: 0, esquive: 2 } },
|
courte: { courte: { label: "Courte (0)", malus: 0 }, moyenne: { label: "Moyenne (-1)", malus: -1 }, longue: { label: "Longue (-2)", malus: -2 }, treslongue: { label: "Très longue (0, 2 Esquives)", malus: 0, esquive: 2 } },
|
||||||
moyenne: { courte: { malus: 0 }, moyenne: { malus: 0 }, longue: { malus: -1 }, treslongue: { malus: 0, esquive: 2 } },
|
moyenne: { courte: { label: "Courte (0)", malus: 0 }, moyenne: { label: "Moyenne (0)", malus: 0 }, longue: { label: "Longue (-1)", malus: -1 }, treslongue: { label: "Très longue (0, 2 Esquives)", malus: 0, esquive: 2 } },
|
||||||
longue: { courte: { malus: -2 }, moyenne: { malus: -1 }, longue: { malus: 0 }, treslongue: { malus: -1, esquive: 1 } },
|
longue: { courte: { label: "Courte (-2)", malus: -2 }, moyenne: { label: "Moyenne (-1)", malus: -1 }, longue: { label: "Longue (0)", malus: 0 }, treslongue: { label: "Très longue (-1, 2 Esquives)", malus: -1, esquive: 1 } },
|
||||||
treslongue: { courte: { malus: 0, esquive: 2 }, moyenne: { malus: 0, esquive: 2 }, longue: { malus: 0, esquive: 1 }, treslongue: { malus: 0 } },
|
treslongue: { courte: { label: "Courte (0, 2 Esquives)", malus: 0, esquive: 2 }, moyenne: { label: "Moyenne (0, 2 Esquives)", malus: 0, esquive: 2 }, longue: { label: "Longue (0, 1 Esquive)", malus: 0, esquive: 1 }, treslongue: { label: "Très longue (0)", malus: 0 } },
|
||||||
},
|
},
|
||||||
providence: [
|
providence: [
|
||||||
{ labelM: "Brebis égarée", labelF: "Brebis égarée", value: 0, diceValue: "0" },
|
{ labelM: "Brebis égarée", labelF: "Brebis égarée", value: 0, diceValue: "0" },
|
||||||
@@ -144,19 +168,24 @@ export const TEDEUM_CONFIG = {
|
|||||||
},
|
},
|
||||||
difficulte: {
|
difficulte: {
|
||||||
aucune: { label: "Aucune", key: "aucune", value: 0 },
|
aucune: { label: "Aucune", key: "aucune", value: 0 },
|
||||||
routine: { label: "Routine", key: "routine", value: 3 },
|
routine: { label: "Routine (3)", key: "routine", value: 3 },
|
||||||
facile: { label: "Facile", key: "facile", value: 5 },
|
facile: { label: "Facile (5)", key: "facile", value: 5 },
|
||||||
pardefaut: { label: "Par Défaut", key: "pardefaut", value: 7 },
|
pardefaut: { label: "Par Défaut (7)", key: "pardefaut", value: 7 },
|
||||||
malaise: { label: "Malaisé", key: "malaise", value: 9 },
|
malaise: { label: "Malaisé (9)", key: "malaise", value: 9 },
|
||||||
difficile: { label: "Difficile", key: "difficile", value: 11 },
|
difficile: { label: "Difficile (11)", key: "difficile", value: 11 },
|
||||||
perilleux: { label: "Perilleux", key: "perilleux", value: 13 },
|
perilleux: { label: "Perilleux (13)", key: "perilleux", value: 13 },
|
||||||
desespere: { label: "Désespéré", key: "desespere", value: 15 }
|
desespere: { label: "Désespéré (15)", key: "desespere", value: 15 }
|
||||||
},
|
},
|
||||||
monnaie: {
|
monnaie: {
|
||||||
denier: { label: "Deniers", id: "denier", value: 1 },
|
denier: { label: "Deniers", id: "denier", value: 1 },
|
||||||
sol: { label: "Sols", id: "sol", value: 10 },
|
sol: { label: "Sols", id: "sol", value: 10 },
|
||||||
livre: { label: "Livres", id: "livre", value: 100 }
|
livre: { label: "Livres", id: "livre", value: 100 }
|
||||||
},
|
},
|
||||||
|
monnaieUnit: {
|
||||||
|
"1": { label: "Deniers", id: "denier", value: 1 },
|
||||||
|
"10": { label: "Sols", id: "sol", value: 10 },
|
||||||
|
"100": { label: "Livres", id: "livre", value: 100 }
|
||||||
|
},
|
||||||
etapesEducation: {
|
etapesEducation: {
|
||||||
pouponniere: { label: "La Pouponnière", value: "pouponniere", agemin: 0, agemax: 6, nbCompetences: 2, nbCaracteristiques: 3, hasGenre: false, hasQuestionnaire: true, hasDebouches: false, hasMultiplier: false, canCompetencesOpt: false },
|
pouponniere: { label: "La Pouponnière", value: "pouponniere", agemin: 0, agemax: 6, nbCompetences: 2, nbCaracteristiques: 3, hasGenre: false, hasQuestionnaire: true, hasDebouches: false, hasMultiplier: false, canCompetencesOpt: false },
|
||||||
petitsgrimauds: { label: "La classe des Petits Grimauds", value: "petitsgrimauds", agemin: 7, agemax: 12, nbCompetences: 10, hasGenre: true, nbCaracteristiques: 3, hasDebouches: false, hasQuestionnaire: true, hasMultiplier: false, canCompetencesOpt: false },
|
petitsgrimauds: { label: "La classe des Petits Grimauds", value: "petitsgrimauds", agemin: 7, agemax: 12, nbCompetences: 10, hasGenre: true, nbCaracteristiques: 3, hasDebouches: false, hasQuestionnaire: true, hasMultiplier: false, canCompetencesOpt: false },
|
||||||
@@ -182,13 +211,14 @@ export const TEDEUM_CONFIG = {
|
|||||||
{ value: "1", label: "+1 niveau" },
|
{ value: "1", label: "+1 niveau" },
|
||||||
{ value: "2", label: "+2 niveaux" }
|
{ value: "2", label: "+2 niveaux" }
|
||||||
],
|
],
|
||||||
|
blessuresOrder: ["indemne", "estafilade", "plaie", "plaiebeante", "plaieatroce", "tuenet", "tuenet", "tuenet", "tuenet", "tuenet"],
|
||||||
blessures: {
|
blessures: {
|
||||||
indemne: { value: 0, label: "Indemne", key: "indemne", degatsMax: -1, count: 0, modifier: 0 },
|
indemne: { value: 0, label: "Indemne", key: "indemne", degatsMax: -1, count: 0, modifier: 0 },
|
||||||
estafilade: { value: 1, label: "Estafilade", key: "estafilade", degatsMin: 0, degatsMax: 2, count: 1, modifier: 0 },
|
estafilade: { value: 1, label: "Estafilade", key: "estafilade", degatsMin: 0, degatsMax: 2, count: 1, modifier: 0 },
|
||||||
plaie: { value: 2, label: "Plaie", key: "plaie", degatsMin: 3, degatsMax: 4, count: 1, modifier: -1 },
|
plaie: { value: 2, label: "Plaie", key: "plaie", degatsMin: 3, degatsMax: 4, count: 1, modifier: -1 },
|
||||||
plaiebeante: { value: 3, label: "Plaie béante", key: "plaiebeante", degatsMin: 5, degatsMax: 6, count: 1, modifier: -2 },
|
plaiebeante: { value: 3, label: "Plaie béante", key: "plaiebeante", degatsMin: 5, degatsMax: 6, count: 1, modifier: -2 },
|
||||||
plaieatroce: { value: 4, label: "Plaie atroce", key: "plaieatroce", degatsMin: 7, degatsMax: 8, count: 1, horsCombat: true, modifier: -12 },
|
plaieatroce: { value: 4, label: "Plaie atroce", key: "plaieatroce", degatsMin: 7, degatsMax: 8, count: 1, horsCombat: true, modifier: -12 },
|
||||||
tunenet: { value: 5, label: "Tué net", key: "tuenet", degatsMin: 9, degatsMax: 100, count: 1, horsCombat: true, mort: true, modifier: -12 }
|
tuenet: { value: 5, label: "Tué net", key: "tuenet", degatsMin: 9, degatsMax: 100, count: 1, horsCombat: true, mort: true, modifier: -100 }
|
||||||
},
|
},
|
||||||
virulence: {
|
virulence: {
|
||||||
aucune: { label: "Aucune", value: "aucune", modifier: 0 },
|
aucune: { label: "Aucune", value: "aucune", modifier: 0 },
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
const ECRYME_WELCOME_MESSAGE_URL = "https://www.uberwald.me/gitea/public/fvtt-te-deum/raw/branch/main/welcome-message-tedeum.html"
|
||||||
|
|
||||||
export class TeDeumUtility {
|
export class TeDeumUtility {
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -12,22 +14,68 @@ export class TeDeumUtility {
|
|||||||
CONFIG.JournalEntry.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
|
CONFIG.JournalEntry.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
|
||||||
CONFIG.Macro.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
|
CONFIG.Macro.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
|
||||||
CONFIG.Adventure.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
|
CONFIG.Adventure.compendiumBanner = "systems/fvtt-te-deum/images/ui/compendium_banner.webp"
|
||||||
|
}
|
||||||
|
|
||||||
Hooks.on('renderChatLog', (log, html, data) => TeDeumUtility.chatListeners(html));
|
static installHooks() {
|
||||||
|
Hooks.on('renderChatMessageHTML', (message, html) => {
|
||||||
|
TeDeumUtility.chatListeners(html);
|
||||||
|
TeDeumUtility.onRenderChatMessage(message, html);
|
||||||
|
});
|
||||||
|
|
||||||
Hooks.on("renderActorDirectory", (app, html, data) => {
|
Hooks.on("renderActorDirectory", (app, html, data) => {
|
||||||
if (game.user.can('ACTOR_CREATE')) {
|
if (game.user.can('ACTOR_CREATE')) {
|
||||||
const button = document.createElement('button');
|
const button = document.createElement('button');
|
||||||
button.style.width = '90%';
|
button.style.width = '60%';
|
||||||
|
button.classList.add('tedeum-create-character');
|
||||||
button.innerHTML = 'Créer un Personnage'
|
button.innerHTML = 'Créer un Personnage'
|
||||||
button.addEventListener('click', () => {
|
button.addEventListener('click', () => {
|
||||||
let cr = new game.system.tedeum.TeDeumCharacterCreator();
|
let cr = new game.system.tedeum.TeDeumCharacterCreator();
|
||||||
cr.init()
|
cr.init()
|
||||||
})
|
})
|
||||||
html.find('.header-actions').after(button)
|
$(html).find('.header-actions').after(button)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
//Hooks.on("getChatLogEntryContext", (html, options) => TeDeumUtility.chatMenuManager(html, options));
|
|
||||||
|
Hooks.on("combatStart", async (combat, updateData, options) => {
|
||||||
|
this.resetCombatActions(combat)
|
||||||
|
});
|
||||||
|
|
||||||
|
Hooks.on("combatRound", (combat, updateData, updateOptions) => {
|
||||||
|
// List all actors related to combatant
|
||||||
|
if (game.user.isGM) {
|
||||||
|
this.resetCombatActions(combat)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
Hooks.on("getCombatTrackerContextOptions", (html, options) => {
|
||||||
|
console.log("Get Combat Tracker Context", html, options)
|
||||||
|
this.pushCombatOptions(html, options);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static pushCombatOptions(html, options) {
|
||||||
|
options.push({ name: "Actions +1", condition: true, icon: '<i class="fas fa-plus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), 1); } })
|
||||||
|
options.push({ name: "Actions -1", condition: true, icon: '<i class="fas fa-minus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), -1); } })
|
||||||
|
options.push({ name: "Actions MG +1", condition: true, icon: '<i class="fas fa-plus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), 1, true); } })
|
||||||
|
options.push({ name: "Actions MG -1", condition: true, icon: '<i class="fas fa-minus"></i>', callback: target => { game.combat.modifyAction($(target).data('combatant-id'), -1, true); } })
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async resetCombatActions(combat) {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
for (let c of combat.combatants) {
|
||||||
|
let actor = game.actors.get(c.actorId)
|
||||||
|
if (actor) {
|
||||||
|
let nbActions = actor.getNbActions()?.value || 0
|
||||||
|
let isMainGauche = (actor.getCompetenceScore("Main gauche") > 0)
|
||||||
|
let nbActionsMainGauche = isMainGauche ? nbActions : 0
|
||||||
|
await c.setFlag("world", "available-actions", { nbActions, nbActionsMainGauche })
|
||||||
|
await c.update({ name: `${c.token.name} (${nbActions} / ${nbActionsMainGauche})` })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -92,6 +140,13 @@ export class TeDeumUtility {
|
|||||||
Handlebars.registerHelper('isGM', function () {
|
Handlebars.registerHelper('isGM', function () {
|
||||||
return game.user.isGM
|
return game.user.isGM
|
||||||
})
|
})
|
||||||
|
Handlebars.registerHelper('monnaie', function (value) {
|
||||||
|
let monnaie = game.system.tedeum.config.monnaieUnit[String(value)]
|
||||||
|
if (monnaie) {
|
||||||
|
return monnaie.label
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
})
|
||||||
|
|
||||||
// Load compendium data
|
// Load compendium data
|
||||||
const competences = await TeDeumUtility.loadCompendium("fvtt-te-deum.competences")
|
const competences = await TeDeumUtility.loadCompendium("fvtt-te-deum.competences")
|
||||||
@@ -119,14 +174,24 @@ export class TeDeumUtility {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static welcomeMessage() {
|
static welcomeMessage() {
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
ChatMessage.create({
|
// Try to fetch the welcome message from the github repo "welcome-message-ecryme.html"
|
||||||
user: game.user.id,
|
fetch(ECRYME_WELCOME_MESSAGE_URL)
|
||||||
whisper: [game.user.id],
|
.then(response => response.text())
|
||||||
content: `<div id="chat-welcome welcome-message-tedeum"><span class="rdd-roll-part">
|
.then(html => {
|
||||||
<strong>Bienvenu dans Te Deum Pour Un Massacre !</strong>
|
ChatMessage.create({
|
||||||
<div class="chat-welcome">Ce système vous est proposé par Open Sesame Games.<br>
|
user: game.user.id,
|
||||||
Vous trouverez de l'aide dans @UUID[Compendium.fvtt-te-deum.aides.JournalEntry.uNwJgi4kXBCiZmAH]{Aide pour Te Deum}<br>
|
whisper: [game.user.id],
|
||||||
ainsi que sur le Discord de Foundry FR : https://discord.gg/pPSDNJk</div>` });
|
content: html
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
console.error("Error fetching welcome message:", error);
|
||||||
|
ChatMessage.create({
|
||||||
|
user: game.user.id,
|
||||||
|
whisper: [game.user.id],
|
||||||
|
content: "<b>Bienvenue dans Ecryme RPG !</b><br>Visitez le site officiel pour plus d'informations."
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,7 +258,7 @@ export class TeDeumUtility {
|
|||||||
return actor
|
return actor
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */ /* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async manageOpposition(rollData) {
|
static async manageOpposition(rollData) {
|
||||||
if (!this.currentOpposition) {
|
if (!this.currentOpposition) {
|
||||||
// Store rollData as current GM opposition
|
// Store rollData as current GM opposition
|
||||||
@@ -202,39 +267,76 @@ export class TeDeumUtility {
|
|||||||
} else {
|
} else {
|
||||||
// Perform the opposition
|
// Perform the opposition
|
||||||
let isAttackWinner = true
|
let isAttackWinner = true
|
||||||
let rWinner = this.currentOpposition
|
let rWinner, rLooser
|
||||||
let rLooser = rollData
|
if (this.currentOpposition.total <= rollData.total) {
|
||||||
if (rWinner.total < rLooser.total) {
|
rWinner = foundry.utils.duplicate(rollData)
|
||||||
rWinner = rollData
|
rLooser = foundry.utils.duplicate(this.currentOpposition)
|
||||||
rLooser = this.currentOpposition
|
|
||||||
isAttackWinner = false
|
isAttackWinner = false
|
||||||
|
} else {
|
||||||
|
rWinner = foundry.utils.duplicate(this.currentOpposition)
|
||||||
|
rLooser = foundry.utils.duplicate(rollData)
|
||||||
|
isAttackWinner = true
|
||||||
}
|
}
|
||||||
this.currentOpposition = undefined // Reset opposition
|
this.currentOpposition = undefined // Reset opposition
|
||||||
let oppositionData = {
|
let oppositionData = {
|
||||||
winner: rWinner,
|
winner: rWinner,
|
||||||
looser: rLooser
|
looser: rLooser
|
||||||
}
|
}
|
||||||
|
// Update difficulty
|
||||||
|
rWinner.difficulty = rLooser.total
|
||||||
|
rLooser.difficulty = rWinner.total
|
||||||
|
await this.computeResults(rWinner)
|
||||||
|
await this.computeResults(rLooser)
|
||||||
|
// Auto XP management when opposed
|
||||||
|
if (rWinner.isReussiteCritique) {
|
||||||
|
let actor = this.getActorFromRollData(rWinner)
|
||||||
|
actor.modifyXP(rWinner.carac.key, 1)
|
||||||
|
}
|
||||||
|
if (rLooser.isEchecCritique) {
|
||||||
|
let actor = this.getActorFromRollData(rLooser)
|
||||||
|
actor.modifyXP(rLooser.carac.key, 1)
|
||||||
|
}
|
||||||
|
|
||||||
let msg = await this.createChatWithRollMode(rollData.alias, {
|
let msg = await this.createChatWithRollMode(rollData.alias, {
|
||||||
content: await renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-opposition-result.hbs`, oppositionData)
|
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-opposition-result.hbs`, oppositionData)
|
||||||
})
|
})
|
||||||
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
||||||
|
|
||||||
// Si le gagnant est l'attaquant, appliquer les dégats sur la victime
|
// Si le gagnant est l'attaquant, appliquer les dégats sur la victime
|
||||||
if ( isAttackWinner && rWinner.isSuccess && rWinner.mode == "arme" && rWinner.arme?.system.typeArme == "melee" && rWinner.defenderTokenId) {
|
if (isAttackWinner && rWinner.isSuccess && rWinner.mode == "arme" && rWinner.arme?.system.typeArme == "melee" && rWinner.defenderTokenId) {
|
||||||
this.appliquerDegats(rWinner)
|
await this.appliquerDegats(rWinner)
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("Rolldata result", rollData)
|
console.log("Opposition result", rollData, isAttackWinner, oppositionData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */ /* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
static getTokenActorFromId(tokenId) {
|
||||||
|
for (let scene of game.scenes) {
|
||||||
|
const tokenDoc = scene.tokens.get(tokenId)
|
||||||
|
if (tokenDoc) return tokenDoc.actor
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
static async appliquerDegats(rollData) {
|
static async appliquerDegats(rollData) {
|
||||||
await this.processAttaqueMelee(rollData)
|
await this.processAttaqueMelee(rollData)
|
||||||
let defenderToken = canvas.tokens.placeables.find(t => t.id == rollData.defenderTokenId)
|
let defenderActor = this.getTokenActorFromId(rollData.defenderTokenId)
|
||||||
if (defenderToken) {
|
if (defenderActor) {
|
||||||
let actor = defenderToken.actor
|
if (game.user.isGM || defenderActor.isOwner) {
|
||||||
await actor.appliquerDegats(rollData)
|
await defenderActor.appliquerDegats(rollData)
|
||||||
|
} else {
|
||||||
|
// Send a socket message — seul le premier MJ actif le traitera
|
||||||
|
game.socket.emit("system.fvtt-te-deum", { name: "msg_apply_damage", data: { rollData } });
|
||||||
|
}
|
||||||
|
// Attaque naturelle avec dégats inférieur à -2
|
||||||
|
if ((rollData?.arme?.system.specificites?.poing?.hasSpec || rollData?.arme?.system.specificites?.pied?.hasSpec) && rollData.degats < -2) {
|
||||||
|
let attacker = this.getActorFromRollData(rollData)
|
||||||
|
attacker.appliquerBlessure("estafilade", "maindroite", "Contusion suite à une attaque naturelle")
|
||||||
|
ui.notifications.info(`${attacker.name} subit 1 contusion en infligeant ${rollData.degats} dégâts à mains nues`)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ui.notifications.error("Impossible de trouver la cible de l'attaque, aucun degats appliqué")
|
ui.notifications.error("Impossible de trouver la cible de l'attaque, aucun degats appliqué")
|
||||||
}
|
}
|
||||||
@@ -243,7 +345,7 @@ export class TeDeumUtility {
|
|||||||
/* -------------------------------------------- */ /* -------------------------------------------- */
|
/* -------------------------------------------- */ /* -------------------------------------------- */
|
||||||
static async chatListeners(html) {
|
static async chatListeners(html) {
|
||||||
|
|
||||||
html.on("click", '.chat-command-opposition', event => {
|
$(html).on("click", '.chat-command-opposition', event => {
|
||||||
let messageId = TeDeumUtility.findChatMessageId(event.currentTarget)
|
let messageId = TeDeumUtility.findChatMessageId(event.currentTarget)
|
||||||
let message = game.messages.get(messageId)
|
let message = game.messages.get(messageId)
|
||||||
let rollData = message.getFlag("world", "te-deum-rolldata")
|
let rollData = message.getFlag("world", "te-deum-rolldata")
|
||||||
@@ -251,7 +353,7 @@ export class TeDeumUtility {
|
|||||||
TeDeumUtility.manageOpposition(rollData, messageId)
|
TeDeumUtility.manageOpposition(rollData, messageId)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
html.on("click", '.chat-command-appliquer-degats', event => {
|
$(html).on("click", '.chat-command-appliquer-degats', event => {
|
||||||
let messageId = TeDeumUtility.findChatMessageId(event.currentTarget)
|
let messageId = TeDeumUtility.findChatMessageId(event.currentTarget)
|
||||||
let message = game.messages.get(messageId)
|
let message = game.messages.get(messageId)
|
||||||
let rollData = message.getFlag("world", "te-deum-rolldata")
|
let rollData = message.getFlag("world", "te-deum-rolldata")
|
||||||
@@ -259,6 +361,25 @@ export class TeDeumUtility {
|
|||||||
TeDeumUtility.appliquerDegats(rollData, messageId)
|
TeDeumUtility.appliquerDegats(rollData, messageId)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
$(html).on("click", '.chat-command-gain-xp', async event => {
|
||||||
|
let messageId = TeDeumUtility.findChatMessageId(event.currentTarget)
|
||||||
|
let message = game.messages.get(messageId)
|
||||||
|
let rollData = message.getFlag("world", "te-deum-rolldata")
|
||||||
|
if (rollData) {
|
||||||
|
let actor = TeDeumUtility.getActorFromRollData(rollData)
|
||||||
|
actor.modifyXP(rollData.carac.key, 1)
|
||||||
|
event.currentTarget.style.display = 'none'; // feedback immédiat local
|
||||||
|
await message.setFlag("world", "te-deum-xp-used", true) // sync tous les clients
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static onRenderChatMessage(message, html) {
|
||||||
|
if (message.getFlag("world", "te-deum-xp-used")) {
|
||||||
|
const btn = html.querySelector('.chat-command-gain-xp');
|
||||||
|
if (btn) btn.style.display = 'none';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -270,7 +391,7 @@ export class TeDeumUtility {
|
|||||||
'systems/fvtt-te-deum/templates/items/partial-item-description.hbs',
|
'systems/fvtt-te-deum/templates/items/partial-item-description.hbs',
|
||||||
'systems/fvtt-te-deum/templates/dialogs/partial-creator-status.hbs'
|
'systems/fvtt-te-deum/templates/dialogs/partial-creator-status.hbs'
|
||||||
]
|
]
|
||||||
return loadTemplates(templatePaths);
|
return foundry.applications.handlebars.loadTemplates(templatePaths);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -347,12 +468,34 @@ export class TeDeumUtility {
|
|||||||
let rollData = msg.data.rollData
|
let rollData = msg.data.rollData
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
let chatMsg = await this.createChatMessage(rollData.alias, "blindroll", {
|
let chatMsg = await this.createChatMessage(rollData.alias, "blindroll", {
|
||||||
content: await renderTemplate(msg.data.template, rollData),
|
content: await foundry.applications.handlebars.renderTemplate(msg.data.template, rollData),
|
||||||
whisper: game.user.id
|
whisper: game.user.id
|
||||||
})
|
})
|
||||||
chatMsg.setFlag("world", "tedeum-rolldata", rollData)
|
chatMsg.setFlag("world", "tedeum-rolldata", rollData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (msg.name == "msg_modify_combat_action") {
|
||||||
|
if (game.user.isGM) {
|
||||||
|
let { combatantId, ca } = msg.data
|
||||||
|
let combatant = game.combat.combatants.get(combatantId)
|
||||||
|
if (combatant) {
|
||||||
|
console.log("sock - Modify Combat Action : ", combatant.name, ca)
|
||||||
|
await TeDeumUtility.updateCombatantActions(combatant, ca)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (msg.name == "msg_apply_damage") {
|
||||||
|
const firstGM = game.users.find(u => u.isGM && u.active)
|
||||||
|
if (game.user === firstGM) {
|
||||||
|
let rollData = msg.data.rollData
|
||||||
|
let defenderActor = TeDeumUtility.getTokenActorFromId(rollData.defenderTokenId)
|
||||||
|
if (defenderActor) {
|
||||||
|
await defenderActor.appliquerDegats(rollData)
|
||||||
|
} else {
|
||||||
|
ui.notifications.error("Impossible de trouver la cible de l'attaque, aucun degats appliqué")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@@ -438,9 +581,11 @@ export class TeDeumUtility {
|
|||||||
}
|
}
|
||||||
if (rollData.diceSum == 1) {
|
if (rollData.diceSum == 1) {
|
||||||
let critiqueRoll = await new Roll(rollData.carac.negativeDice)
|
let critiqueRoll = await new Roll(rollData.carac.negativeDice)
|
||||||
|
rollData.isSuccess = false
|
||||||
await critiqueRoll.evaluate()
|
await critiqueRoll.evaluate()
|
||||||
await this.showDiceSoNice(critiqueRoll, game.settings.get("core", "rollMode"))
|
await this.showDiceSoNice(critiqueRoll, game.settings.get("core", "rollMode"))
|
||||||
rollData.critiqueRoll = foundry.utils.duplicate(critiqueRoll)
|
rollData.critiqueRoll = foundry.utils.duplicate(critiqueRoll)
|
||||||
|
rollData.critiqueTotal = critiqueRoll.total
|
||||||
if (critiqueRoll.total > rollData.competence.system.score) {
|
if (critiqueRoll.total > rollData.competence.system.score) {
|
||||||
rollData.isEchecCritique = true
|
rollData.isEchecCritique = true
|
||||||
}
|
}
|
||||||
@@ -469,9 +614,18 @@ export class TeDeumUtility {
|
|||||||
if (rollData.isMouvement) {
|
if (rollData.isMouvement) {
|
||||||
localModifier -= 1
|
localModifier -= 1
|
||||||
}
|
}
|
||||||
|
if (rollData.arme && rollData.allongeId) {
|
||||||
|
localModifier += rollData.allonges[rollData.allongeId].malus
|
||||||
|
rollData.allongeMalus = rollData.allonges[rollData.allongeId].malus
|
||||||
|
rollData.nbEsquives = rollData.allonges[rollData.allongeId]?.esquive || 0
|
||||||
|
}
|
||||||
|
if (rollData.attaqueCiblee && rollData.attaqueCiblee != "aucune") {
|
||||||
|
localModifier -= 1
|
||||||
|
rollData.loc = foundry.utils.duplicate(game.system.tedeum.config.LOCALISATION[rollData.attaqueCiblee])
|
||||||
|
}
|
||||||
let diceBase = this.modifyDice(rollData.carac.dice, localModifier + Number(rollData.bonusMalus) + rollData.santeModifier)
|
let diceBase = this.modifyDice(rollData.carac.dice, localModifier + Number(rollData.bonusMalus) + rollData.santeModifier)
|
||||||
if (!diceBase) return;
|
if (!diceBase) return;
|
||||||
diceFormula = diceBase + "x + " + rollData.competence.system.score
|
diceFormula = diceBase + "x + " + rollData.compScore
|
||||||
}
|
}
|
||||||
if (rollData.enableProvidence) {
|
if (rollData.enableProvidence) {
|
||||||
diceFormula += " + " + rollData.providence.dice
|
diceFormula += " + " + rollData.providence.dice
|
||||||
@@ -481,24 +635,30 @@ export class TeDeumUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async getLocalisation(rollData) {
|
static async getLocalisation(rollData) {
|
||||||
let locRoll = await new Roll("1d20").roll()
|
let locRoll
|
||||||
await this.showDiceSoNice(locRoll, game.settings.get("core", "rollMode"))
|
if (rollData.loc) {
|
||||||
rollData.locRoll = foundry.utils.duplicate(locRoll)
|
locRoll = await new Roll(String(rollData.loc.score.min)).roll()
|
||||||
for (let key in game.system.tedeum.config.LOCALISATION) {
|
} else {
|
||||||
let loc = game.system.tedeum.config.LOCALISATION[key]
|
locRoll = await new Roll("1d20").roll()
|
||||||
if (locRoll.total >= loc.score.min && locRoll.total <= loc.score.max) {
|
await this.showDiceSoNice(locRoll, game.settings.get("core", "rollMode"))
|
||||||
rollData.loc = foundry.utils.duplicate(loc)
|
for (let key in game.system.tedeum.config.LOCALISATION) {
|
||||||
break
|
let loc = game.system.tedeum.config.LOCALISATION[key]
|
||||||
|
if (locRoll.total >= loc.score.min && locRoll.total <= loc.score.max) {
|
||||||
|
rollData.loc = foundry.utils.duplicate(loc)
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rollData.locRoll = foundry.utils.duplicate(locRoll)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async processAttaqueMelee(rollData) {
|
static async processAttaqueMelee(rollData) {
|
||||||
await this.getLocalisation(rollData)
|
await this.getLocalisation(rollData)
|
||||||
let actor = game.actors.get(rollData.actorId)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
let bDegats = actor.getBonusDegats()
|
let bDegats = actor.getAttaqueBonusDegats(rollData)
|
||||||
let degatsRoll = await new Roll(rollData.arme.system.degats + "+" + bDegats.value).roll()
|
rollData.degatsFormula = rollData.arme.system.degats + "+" + bDegats
|
||||||
|
let degatsRoll = await new Roll(rollData.degatsFormula).roll()
|
||||||
await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode"))
|
await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode"))
|
||||||
rollData.degatsRoll = foundry.utils.duplicate(degatsRoll)
|
rollData.degatsRoll = foundry.utils.duplicate(degatsRoll)
|
||||||
rollData.degats = degatsRoll.total
|
rollData.degats = degatsRoll.total
|
||||||
@@ -514,12 +674,51 @@ export class TeDeumUtility {
|
|||||||
await this.getLocalisation(rollData)
|
await this.getLocalisation(rollData)
|
||||||
// Now the degats
|
// Now the degats
|
||||||
let degatsRoll = await new Roll(rollData.arme.system.degats).roll()
|
let degatsRoll = await new Roll(rollData.arme.system.degats).roll()
|
||||||
await this.showDiceSoNice(rollData.locRoll, game.settings.get("core", "rollMode"))
|
await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode"))
|
||||||
rollData.degatsRoll = foundry.utils.duplicate(degatsRoll)
|
rollData.degatsRoll = foundry.utils.duplicate(degatsRoll)
|
||||||
rollData.degats = degatsRoll.total
|
rollData.degats = degatsRoll.total
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async updateCombatantActions(combatant, ca) {
|
||||||
|
await combatant.setFlag("world", "available-actions", ca)
|
||||||
|
await combatant.update({ name: `${combatant.token.name} (${ca.nbActions} / ${ca.nbActionsMainGauche})` })
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static async manageCombatActions(actor, rollData) {
|
||||||
|
let combat = game.combats.active
|
||||||
|
if (!combat) return;
|
||||||
|
let combatant = combat.getCombatantByActor(actor)
|
||||||
|
if (!combatant) return;
|
||||||
|
let ca = combatant.getFlag("world", "available-actions")
|
||||||
|
if (!ca) return;
|
||||||
|
if (rollData.mode == "arme" && rollData.isMainGauche) {
|
||||||
|
if (ca.nbActionsMainGauche > 0) {
|
||||||
|
ca.nbActionsMainGauche -= 1
|
||||||
|
ca.nbActions = Math.max(ca.nbActions - 1, 0)
|
||||||
|
} else {
|
||||||
|
ui.notifications.error(`${actor.name} n'a plus d'actions disponibles à la main gauche pour ce round`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ca.nbActions > 0) {
|
||||||
|
ca.nbActions -= 1
|
||||||
|
} else {
|
||||||
|
ui.notifications.error(`${actor.name} n'a plus d'actions disponibles pour ce round`)
|
||||||
|
}
|
||||||
|
console.log("Manage combat actions 1", actor.name, combatant)
|
||||||
|
if (game.user.isGM) {
|
||||||
|
await this.updateCombatantActions(combatant, ca)
|
||||||
|
} else {
|
||||||
|
// Send a socket message
|
||||||
|
game.socket.emit("system.fvtt-te-deum", { name: "msg_modify_combat_action", data: { combatantId: combatant.id, ca } });
|
||||||
|
}
|
||||||
|
rollData.hasActions = true
|
||||||
|
rollData.remainingActions = ca.nbActions
|
||||||
|
rollData.remainingActionsMainGauche = ca.nbActionsMainGauche
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async rollTeDeum(rollData) {
|
static async rollTeDeum(rollData) {
|
||||||
|
|
||||||
@@ -529,6 +728,18 @@ export class TeDeumUtility {
|
|||||||
rollData.difficulty = "pardefaut"
|
rollData.difficulty = "pardefaut"
|
||||||
}
|
}
|
||||||
rollData.difficulty = game.system.tedeum.config.difficulte[rollData.difficulty].value
|
rollData.difficulty = game.system.tedeum.config.difficulte[rollData.difficulty].value
|
||||||
|
|
||||||
|
// Compute the real competence score
|
||||||
|
if (rollData.competence) {
|
||||||
|
if (rollData.isMainGauche) {
|
||||||
|
rollData.competence = actor.getMeilleureCompetenceMainGauche(rollData.competence)
|
||||||
|
}
|
||||||
|
if (rollData.competence.system.isBase) {
|
||||||
|
rollData.compScore = actor.system.caracteristiques[rollData.competence.system.caracteristique].value
|
||||||
|
} else {
|
||||||
|
rollData.compScore = rollData.competence.system.score
|
||||||
|
}
|
||||||
|
}
|
||||||
let diceFormula = this.computeRollFormula(rollData, actor)
|
let diceFormula = this.computeRollFormula(rollData, actor)
|
||||||
if (!diceFormula) return;
|
if (!diceFormula) return;
|
||||||
console.log("RollData", rollData, diceFormula)
|
console.log("RollData", rollData, diceFormula)
|
||||||
@@ -545,8 +756,10 @@ export class TeDeumUtility {
|
|||||||
|
|
||||||
await this.processAttaqueDistance(rollData)
|
await this.processAttaqueDistance(rollData)
|
||||||
|
|
||||||
|
await this.manageCombatActions(actor, rollData)
|
||||||
|
|
||||||
let msg = await this.createChatWithRollMode(rollData.alias, {
|
let msg = await this.createChatWithRollMode(rollData.alias, {
|
||||||
content: await renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-generic-result.hbs`, rollData)
|
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-te-deum/templates/chat/chat-generic-result.hbs`, rollData)
|
||||||
})
|
})
|
||||||
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
await msg.setFlag("world", "te-deum-rolldata", rollData)
|
||||||
console.log("Rolldata result", rollData)
|
console.log("Rolldata result", rollData)
|
||||||
@@ -555,10 +768,6 @@ export class TeDeumUtility {
|
|||||||
if (rollData.enableProvidence) {
|
if (rollData.enableProvidence) {
|
||||||
actor.modifyProvidence(-1)
|
actor.modifyProvidence(-1)
|
||||||
}
|
}
|
||||||
// Manage XP
|
|
||||||
if (rollData.isReussiteCritique || rollData.isEchecCritique) {
|
|
||||||
actor.modifyXP(rollData.carac.key, 1)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
export class TeDeumArmeSchema extends foundry.abstract.TypeDataModel {
|
export class TeDeumArmeSchema extends foundry.abstract.TypeDataModel {
|
||||||
static defineSchema() {
|
static defineSchema() {
|
||||||
const fields = foundry.data.fields;
|
const fields = foundry.data.fields;
|
||||||
const requiredInteger = { required: true, nullable: false, integer: true };
|
const requiredInteger = { required: true, nullable: false, integer: true };
|
||||||
const requiredDouble = { required: true, nullable: false, integer: false };
|
const requiredDouble = { required: true, nullable: false, integer: false };
|
||||||
const schema = {};
|
const schema = {};
|
||||||
|
|
||||||
schema.typeArme = new fields.StringField({required: true, choices: ["melee", "tir"], initial: "melee"});
|
schema.typeArme = new fields.StringField({ required: true, choices: ["melee", "tir"], initial: "melee" });
|
||||||
schema.allonge = new fields.StringField({required: true, choices: ["courte", "moyenne", "longue", "treslongue"], initial: "courte"});
|
schema.allonge = new fields.StringField({ required: true, choices: ["courte", "moyenne", "longue", "treslongue"], initial: "courte" });
|
||||||
|
|
||||||
schema.specificites = new fields.SchemaField(
|
schema.specificites = new fields.SchemaField(
|
||||||
Object.values((game.system.tedeum.config.ARME_SPECIFICITE)).reduce((obj, spec) => {
|
Object.values((game.system.tedeum.config.ARME_SPECIFICITE)).reduce((obj, spec) => {
|
||||||
obj[spec.id] = new fields.SchemaField({
|
obj[spec.id] = new fields.SchemaField({
|
||||||
hasSpec: new fields.BooleanField({initial: false}),
|
hasSpec: new fields.BooleanField({ initial: false }),
|
||||||
});
|
});
|
||||||
return obj;
|
return obj;
|
||||||
}, {})
|
}, {})
|
||||||
@@ -26,18 +26,18 @@ export class TeDeumArmeSchema extends foundry.abstract.TypeDataModel {
|
|||||||
}, {})
|
}, {})
|
||||||
);
|
);
|
||||||
|
|
||||||
schema.degatsArmure = new fields.SchemaField( {
|
schema.degatsArmure = new fields.SchemaField({
|
||||||
sansarmure : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
sansarmure: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||||
cuir : 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 }),
|
plates: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||||
mailles : new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
mailles: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
|
||||||
});
|
});
|
||||||
|
|
||||||
schema.tempsRecharge = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 });
|
schema.tempsRecharge = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 });
|
||||||
schema.competenceRecharge = new fields.StringField({ required: false, choices:["aucune", "archerie", "arquebusade"], initial: "aucune", blank: true });
|
schema.competenceRecharge = new fields.StringField({ required: false, choices: ["aucune", "archerie", "arquebusade"], initial: "aucune", blank: true });
|
||||||
schema.valeurEchecCritique = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 });
|
schema.valeurEchecCritique = new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 });
|
||||||
|
|
||||||
schema.initiativeBonus = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 });
|
schema.initiativeBonus = new fields.NumberField({ ...requiredInteger, initial: 0 });
|
||||||
|
|
||||||
schema.degats = new fields.StringField({ required: false, blank: true, initial: "0" });
|
schema.degats = new fields.StringField({ required: false, blank: true, initial: "0" });
|
||||||
schema.degatscrosse = new fields.StringField({ required: false, blank: true, initial: "0" });
|
schema.degatscrosse = new fields.StringField({ required: false, blank: true, initial: "0" });
|
||||||
@@ -46,15 +46,15 @@ export class TeDeumArmeSchema extends foundry.abstract.TypeDataModel {
|
|||||||
for (let key of Object.keys(game.system.tedeum.config.armeCompetences)) {
|
for (let key of Object.keys(game.system.tedeum.config.armeCompetences)) {
|
||||||
comp.push(key);
|
comp.push(key);
|
||||||
}
|
}
|
||||||
schema.competence = new fields.StringField({ required: true, choices:comp, initial: "bagarre" });
|
schema.competence = new fields.StringField({ required: true, choices: comp, initial: "bagarre" });
|
||||||
schema.competence2 = new fields.StringField({ required: false, choices:comp, initial: "", blank: true });
|
schema.competence2 = new fields.StringField({ required: false, choices: comp, initial: "", blank: true });
|
||||||
|
|
||||||
schema.prix = new fields.NumberField({ ...requiredDouble, initial: 0, min: 0 });
|
schema.prix = new fields.NumberField({ ...requiredDouble, initial: 0, min: 0 });
|
||||||
schema.monnaie = new fields.StringField({ required: true, blank: false, initial: "denier" });
|
schema.monnaie = new fields.StringField({ required: true, blank: false, initial: "denier" });
|
||||||
|
|
||||||
schema.equipe = new fields.BooleanField({initial: false}),
|
schema.equipe = new fields.BooleanField({ initial: false }),
|
||||||
|
|
||||||
schema.description = new fields.HTMLField({ required: true, blank: true });
|
schema.description = new fields.HTMLField({ required: true, blank: true });
|
||||||
|
|
||||||
return schema;
|
return schema;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,8 +4,9 @@ export class TeDeumBlessureSchema extends foundry.abstract.TypeDataModel {
|
|||||||
const requiredInteger = { required: true, nullable: false, integer: true };
|
const requiredInteger = { required: true, nullable: false, integer: true };
|
||||||
const schema = {};
|
const schema = {};
|
||||||
|
|
||||||
schema.typeBlessure = new fields.StringField({required: true, choices: ["indemne", "estafilade", "plaie", "plaiebeante", "plaieatroce", "tuenet"], initial: "estafilade"});
|
schema.typeBlessure = new fields.StringField({ required: true, choices: ["indemne", "estafilade", "plaie", "plaiebeante", "plaieatroce", "tuenet"], initial: "estafilade" });
|
||||||
schema.localisation = new fields.StringField({required: true, choices: ["piedgauche", "pieddroit", "jambegauche", "jambedroite", "maingauche", "maindroite", "brasgauche", "brasdroit", "tete", "corps"], initial: "corps"});
|
schema.value = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
|
||||||
|
schema.localisation = new fields.StringField({ required: true, choices: ["piedgauche", "pieddroit", "jambegauche", "jambedroite", "maingauche", "maindroite", "brasgauche", "brasdroit", "tete", "corps"], initial: "corps" });
|
||||||
|
|
||||||
schema.description = new fields.HTMLField({ required: true, blank: true });
|
schema.description = new fields.HTMLField({ required: true, blank: true });
|
||||||
|
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ export class TeDeumEducationSchema extends foundry.abstract.TypeDataModel {
|
|||||||
reponse: new fields.StringField({ required: true, blank: true, initial: "" }),
|
reponse: new fields.StringField({ required: true, blank: true, initial: "" }),
|
||||||
compName: new fields.StringField({ required: true, blank: true, initial: "" }),
|
compName: new fields.StringField({ required: true, blank: true, initial: "" }),
|
||||||
toSelect: new fields.BooleanField({ initial: false }),
|
toSelect: new fields.BooleanField({ initial: false }),
|
||||||
compList: new fields.SchemaField(Array.fromRange(10, 1).reduce((comps, i) => {
|
compList: new fields.SchemaField(Array.fromRange(16, 1).reduce((comps, i) => {
|
||||||
comps[`comp${i}`] = new fields.SchemaField({
|
comps[`comp${i}`] = new fields.SchemaField({
|
||||||
compName: new fields.StringField({ required: true, blank: true, initial: "" }),
|
compName: new fields.StringField({ required: true, blank: true, initial: "" }),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -13,4 +13,10 @@ export class TeDeumEquipementSchema extends foundry.abstract.TypeDataModel {
|
|||||||
|
|
||||||
return schema;
|
return schema;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get monnaieLabel() {
|
||||||
|
console.log("monnaieLabel", this.monnaie,game.system.tedeum.config.monnaieUnit)
|
||||||
|
return game.system.tedeum.config.monnaieUnit[String(this.monnaie)]?.label;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ export class TeDeumMaladieSchema extends foundry.abstract.TypeDataModel {
|
|||||||
schema.virulence = new fields.StringField({required: true, choices: ["fatigue", "epuisement", "souffrance", "agonie"], initial: "fatigue"});
|
schema.virulence = new fields.StringField({required: true, choices: ["fatigue", "epuisement", "souffrance", "agonie"], initial: "fatigue"});
|
||||||
schema.fievre = new fields.StringField({required: true, choices: ["aucune", "legere", "forte", "grave"], initial: "aucune"});
|
schema.fievre = new fields.StringField({required: true, choices: ["aucune", "legere", "forte", "grave"], initial: "aucune"});
|
||||||
schema.symptomes = new fields.HTMLField({ required: true, blank: true });
|
schema.symptomes = new fields.HTMLField({ required: true, blank: true });
|
||||||
schema.appliquee = new fields.BooleanField({initial: false}),
|
schema.complications = new fields.HTMLField({ required: true, blank: true });
|
||||||
|
schema.appliquee = new fields.BooleanField({initial: false});
|
||||||
|
|
||||||
schema.description = new fields.HTMLField({ required: true, blank: true });
|
schema.description = new fields.HTMLField({ required: true, blank: true });
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export class TeDeumRollDialog extends Dialog {
|
|||||||
static async create(actor, rollData) {
|
static async create(actor, rollData) {
|
||||||
|
|
||||||
let options = { classes: ["tedeum-roll-dialog"], width: 540, height: 'fit-content', 'z-index': 99999 }
|
let options = { classes: ["tedeum-roll-dialog"], width: 540, height: 'fit-content', 'z-index': 99999 }
|
||||||
let html = await renderTemplate('systems/fvtt-te-deum/templates/dialogs/roll-dialog-generic.hbs', rollData);
|
let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-te-deum/templates/dialogs/roll-dialog-generic.hbs', rollData);
|
||||||
return new TeDeumRollDialog(actor, rollData, html, options);
|
return new TeDeumRollDialog(actor, rollData, html, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ export class TeDeumRollDialog extends Dialog {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async refreshDialog() {
|
async refreshDialog() {
|
||||||
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/roll-dialog-generic.hbs", this.rollData)
|
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-te-deum/templates/dialogs/roll-dialog-generic.hbs", this.rollData)
|
||||||
this.data.content = content
|
this.data.content = content
|
||||||
this.render(true)
|
this.render(true)
|
||||||
}
|
}
|
||||||
@@ -60,9 +60,18 @@ export class TeDeumRollDialog extends Dialog {
|
|||||||
html.find('#bonusMalusPerso').change((event) => {
|
html.find('#bonusMalusPerso').change((event) => {
|
||||||
this.rollData.bonusMalusPerso = Number(event.currentTarget.value)
|
this.rollData.bonusMalusPerso = Number(event.currentTarget.value)
|
||||||
})
|
})
|
||||||
|
html.find('#roll-allonge').change((event) => {
|
||||||
|
this.rollData.allongeId = event.currentTarget.value
|
||||||
|
})
|
||||||
|
html.find('#roll-main-gauche').change((event) => {
|
||||||
|
this.rollData.isMainGauche = event.currentTarget.checked
|
||||||
|
})
|
||||||
html.find('#roll-difficulty').change((event) => {
|
html.find('#roll-difficulty').change((event) => {
|
||||||
this.rollData.difficulty = String(event.currentTarget.value) || "pardefaut"
|
this.rollData.difficulty = String(event.currentTarget.value) || "pardefaut"
|
||||||
})
|
})
|
||||||
|
html.find('#roll-attaque-ciblee').change((event) => {
|
||||||
|
this.rollData.attaqueCiblee = event.currentTarget.value || "0"
|
||||||
|
})
|
||||||
html.find('#roll-bonus-malus').change((event) => {
|
html.find('#roll-bonus-malus').change((event) => {
|
||||||
this.rollData.bonusMalus = event.currentTarget.value || "0"
|
this.rollData.bonusMalus = event.currentTarget.value || "0"
|
||||||
})
|
})
|
||||||
@@ -80,6 +89,12 @@ export class TeDeumRollDialog extends Dialog {
|
|||||||
html.find('#roll-tir-mouvement').change((event) => {
|
html.find('#roll-tir-mouvement').change((event) => {
|
||||||
this.rollData.isMouvement = event.currentTarget.checked
|
this.rollData.isMouvement = event.currentTarget.checked
|
||||||
})
|
})
|
||||||
|
html.find('#roll-charge-a-pied').change((event) => {
|
||||||
|
this.rollData.isChargeAPied = event.currentTarget.checked
|
||||||
|
})
|
||||||
|
html.find('#roll-charge-a-cheval').change((event) => {
|
||||||
|
this.rollData.isChargeACheval = event.currentTarget.checked
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { TeDeumUtility } from "../common/tedeum-utility.js";
|
|||||||
* Extend the basic ItemSheet with some very simple modifications
|
* Extend the basic ItemSheet with some very simple modifications
|
||||||
* @extends {ItemSheet}
|
* @extends {ItemSheet}
|
||||||
*/
|
*/
|
||||||
export class TeDeumItemSheet extends ItemSheet {
|
export class TeDeumItemSheet extends foundry.appv1.sheets.ItemSheet {
|
||||||
|
|
||||||
/** @override */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
@@ -49,8 +49,8 @@ export class TeDeumItemSheet extends ItemSheet {
|
|||||||
limited: this.object.limited,
|
limited: this.object.limited,
|
||||||
options: this.options,
|
options: this.options,
|
||||||
owner: this.document.isOwner,
|
owner: this.document.isOwner,
|
||||||
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
|
description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.description, { async: true }),
|
||||||
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),
|
notes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.notes, { async: true }),
|
||||||
isGM: game.user.isGM
|
isGM: game.user.isGM
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,7 +59,6 @@ export class TeDeumItemSheet extends ItemSheet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.options.editable = !(this.object.origin == "embeddedItem");
|
this.options.editable = !(this.object.origin == "embeddedItem");
|
||||||
console.log("ITEM DATA", formData, this);
|
|
||||||
return formData;
|
return formData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +91,7 @@ export class TeDeumItemSheet extends ItemSheet {
|
|||||||
payload: chatData,
|
payload: chatData,
|
||||||
});
|
});
|
||||||
|
|
||||||
renderTemplate('systems/fvtt-te-deum/templates/post-item.html', chatData).then(html => {
|
foundry.applications.handlebars.renderTemplate('systems/fvtt-te-deum/templates/post-item.html', chatData).then(html => {
|
||||||
let chatOptions = TeDeumUtility.chatDataSetup(html);
|
let chatOptions = TeDeumUtility.chatDataSetup(html);
|
||||||
ChatMessage.create(chatOptions)
|
ChatMessage.create(chatOptions)
|
||||||
});
|
});
|
||||||
@@ -157,7 +156,7 @@ export class TeDeumItemSheet extends ItemSheet {
|
|||||||
let itemType = li.data("item-type");
|
let itemType = li.data("item-type");
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
get template() {
|
get template() {
|
||||||
|
|||||||
@@ -82,14 +82,16 @@ Hooks.once("init", async function () {
|
|||||||
|
|
||||||
console.log("TeDeum RPG | Ready");
|
console.log("TeDeum RPG | Ready");
|
||||||
|
|
||||||
Actors.unregisterSheet("core", ActorSheet);
|
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
|
||||||
Actors.registerSheet("fvtt-te-deum", TeDeumActorPJSheet, { types: ["pj"], makeDefault: true });
|
foundry.documents.collections.Actors.registerSheet("fvtt-te-deum", TeDeumActorPJSheet, { types: ["pj"], makeDefault: true });
|
||||||
Actors.registerSheet("fvtt-te-deum", TeDeumActorPJSheet, { types: ["pnj"], makeDefault: true });
|
foundry.documents.collections.Actors.registerSheet("fvtt-te-deum", TeDeumActorPJSheet, { types: ["pnj"], makeDefault: true });
|
||||||
|
|
||||||
Items.unregisterSheet("core", ItemSheet);
|
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
|
||||||
Items.registerSheet("fvtt-te-deum", TeDeumItemSheet, { makeDefault: true });
|
foundry.documents.collections.Items.registerSheet("fvtt-te-deum", TeDeumItemSheet, { makeDefault: true });
|
||||||
|
|
||||||
TeDeumUtility.init()
|
TeDeumUtility.init()
|
||||||
|
|
||||||
|
TeDeumUtility.installHooks()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
@@ -98,6 +100,7 @@ Hooks.once("init", async function () {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
Hooks.once("ready", function () {
|
Hooks.once("ready", function () {
|
||||||
|
|
||||||
|
|
||||||
// User warning
|
// User warning
|
||||||
if (!game.user.isGM && game.user.character == undefined) {
|
if (!game.user.isGM && game.user.character == undefined) {
|
||||||
ui.notifications.info("Attention ! Aucun personnage relié au joueur !");
|
ui.notifications.info("Attention ! Aucun personnage relié au joueur !");
|
||||||
@@ -107,10 +110,10 @@ Hooks.once("ready", function () {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter=>{
|
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter => {
|
||||||
console.log("ClassCounter loaded", moduleCounter)
|
console.log("ClassCounter loaded", moduleCounter)
|
||||||
moduleCounter.ClassCounter.registerUsageCount()
|
moduleCounter.ClassCounter.registerUsageCount()
|
||||||
}).catch(err=>
|
}).catch(err =>
|
||||||
console.log("No stats available, giving up.")
|
console.log("No stats available, giving up.")
|
||||||
)
|
)
|
||||||
TeDeumUtility.ready();
|
TeDeumUtility.ready();
|
||||||
@@ -134,4 +137,3 @@ Hooks.on("chatMessage", (html, content, msg) => {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
21
package.json
Normal file
21
package.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "fvtt-te-deum",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Système Te Deum pour FoundryVTT",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"build:css": "gulp css",
|
||||||
|
"watch:css": "gulp watch"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"gulp": "^4.0.2",
|
||||||
|
"gulp-less": "^5.0.0",
|
||||||
|
"less": "^4.2.0",
|
||||||
|
"autoprefixer": "^10.4.20",
|
||||||
|
"gulp-postcss": "^9.0.1",
|
||||||
|
"postcss": "^8.4.49"
|
||||||
|
},
|
||||||
|
"keywords": ["foundry-vtt", "te-deum"],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC"
|
||||||
|
}
|
||||||
Binary file not shown.
BIN
packs/aides/000177.ldb
Normal file
BIN
packs/aides/000177.ldb
Normal file
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000087
|
MANIFEST-000226
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
2025/04/05-23:14:49.037668 7f9c6affd6c0 Recovering log #86
|
2026/02/25-16:17:49.096861 7f821f7fe6c0 Recovering log #224
|
||||||
2025/04/05-23:14:49.047402 7f9c6affd6c0 Delete type=0 #86
|
2026/02/25-16:17:49.106471 7f821f7fe6c0 Delete type=3 #222
|
||||||
2025/04/05-23:14:49.047473 7f9c6affd6c0 Delete type=3 #85
|
2026/02/25-16:17:49.106539 7f821f7fe6c0 Delete type=0 #224
|
||||||
2025/04/05-23:15:15.842682 7f9c69bff6c0 Level-0 table #90: started
|
|
||||||
2025/04/05-23:15:15.842744 7f9c69bff6c0 Level-0 table #90: 0 bytes OK
|
|
||||||
2025/04/05-23:15:15.848975 7f9c69bff6c0 Delete type=0 #88
|
|
||||||
2025/04/05-23:15:15.860649 7f9c69bff6c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
2025/04/05-18:56:55.040362 7fa86b7fe6c0 Recovering log #83
|
2026/02/25-15:53:40.937630 7f821ffff6c0 Recovering log #220
|
||||||
2025/04/05-18:56:55.054999 7fa86b7fe6c0 Delete type=3 #81
|
2026/02/25-15:53:40.949873 7f821ffff6c0 Delete type=3 #218
|
||||||
2025/04/05-18:56:55.055109 7fa86b7fe6c0 Delete type=0 #83
|
2026/02/25-15:53:40.949933 7f821ffff6c0 Delete type=0 #220
|
||||||
|
2026/02/25-16:16:19.716603 7f821d8d46c0 Level-0 table #225: started
|
||||||
|
2026/02/25-16:16:19.716652 7f821d8d46c0 Level-0 table #225: 0 bytes OK
|
||||||
|
2026/02/25-16:16:19.765894 7f821d8d46c0 Delete type=0 #223
|
||||||
|
2026/02/25-16:16:19.766155 7f821d8d46c0 Manual compaction at level-0 from '!journal!uNwJgi4kXBCiZmAH' @ 72057594037927935 : 1 .. '!journal.pages!uNwJgi4kXBCiZmAH.onhNU0mXhOpdNZJF' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
BIN
packs/aides/MANIFEST-000226
Normal file
BIN
packs/aides/MANIFEST-000226
Normal file
Binary file not shown.
Binary file not shown.
BIN
packs/armes/000280.ldb
Normal file
BIN
packs/armes/000280.ldb
Normal file
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000189
|
MANIFEST-000329
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
2025/04/05-23:14:48.938481 7f9c6a7fc6c0 Recovering log #188
|
2026/02/25-16:17:49.007591 7f821f7fe6c0 Recovering log #327
|
||||||
2025/04/05-23:14:48.948878 7f9c6a7fc6c0 Delete type=0 #188
|
2026/02/25-16:17:49.018485 7f821f7fe6c0 Delete type=3 #325
|
||||||
2025/04/05-23:14:48.948933 7f9c6a7fc6c0 Delete type=3 #187
|
2026/02/25-16:17:49.018548 7f821f7fe6c0 Delete type=0 #327
|
||||||
2025/04/05-23:15:15.775044 7f9c69bff6c0 Level-0 table #192: started
|
|
||||||
2025/04/05-23:15:15.775079 7f9c69bff6c0 Level-0 table #192: 0 bytes OK
|
|
||||||
2025/04/05-23:15:15.780958 7f9c69bff6c0 Delete type=0 #190
|
|
||||||
2025/04/05-23:15:15.800666 7f9c69bff6c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
2025/04/05-18:56:54.933660 7fa86affd6c0 Recovering log #185
|
2026/02/25-15:53:40.848906 7f821effd6c0 Recovering log #323
|
||||||
2025/04/05-18:56:54.943911 7fa86affd6c0 Delete type=3 #183
|
2026/02/25-15:53:40.858667 7f821effd6c0 Delete type=3 #321
|
||||||
2025/04/05-18:56:54.943971 7fa86affd6c0 Delete type=0 #185
|
2026/02/25-15:53:40.858720 7f821effd6c0 Delete type=0 #323
|
||||||
|
2026/02/25-16:16:19.467652 7f821d8d46c0 Level-0 table #328: started
|
||||||
|
2026/02/25-16:16:19.467677 7f821d8d46c0 Level-0 table #328: 0 bytes OK
|
||||||
|
2026/02/25-16:16:19.528659 7f821d8d46c0 Delete type=0 #326
|
||||||
|
2026/02/25-16:16:19.528885 7f821d8d46c0 Manual compaction at level-0 from '!folders!InCQeTRdT5jXMX82' @ 72057594037927935 : 1 .. '!items!wxIHkrq98eQ3cOvp' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
BIN
packs/armes/MANIFEST-000329
Normal file
BIN
packs/armes/MANIFEST-000329
Normal file
Binary file not shown.
Binary file not shown.
BIN
packs/armures/000304.ldb
Normal file
BIN
packs/armures/000304.ldb
Normal file
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000189
|
MANIFEST-000329
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
2025/04/05-23:14:48.952138 7f9c6affd6c0 Recovering log #188
|
2026/02/25-16:17:49.020792 7f821effd6c0 Recovering log #327
|
||||||
2025/04/05-23:14:48.962116 7f9c6affd6c0 Delete type=0 #188
|
2026/02/25-16:17:49.030955 7f821effd6c0 Delete type=3 #325
|
||||||
2025/04/05-23:14:48.962182 7f9c6affd6c0 Delete type=3 #187
|
2026/02/25-16:17:49.031024 7f821effd6c0 Delete type=0 #327
|
||||||
2025/04/05-23:15:15.788075 7f9c69bff6c0 Level-0 table #192: started
|
|
||||||
2025/04/05-23:15:15.788095 7f9c69bff6c0 Level-0 table #192: 0 bytes OK
|
|
||||||
2025/04/05-23:15:15.794438 7f9c69bff6c0 Delete type=0 #190
|
|
||||||
2025/04/05-23:15:15.800687 7f9c69bff6c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
2025/04/05-18:56:54.946918 7fa86b7fe6c0 Recovering log #185
|
2026/02/25-15:53:40.860848 7f821f7fe6c0 Recovering log #323
|
||||||
2025/04/05-18:56:54.957003 7fa86b7fe6c0 Delete type=3 #183
|
2026/02/25-15:53:40.871268 7f821f7fe6c0 Delete type=3 #321
|
||||||
2025/04/05-18:56:54.957057 7fa86b7fe6c0 Delete type=0 #185
|
2026/02/25-15:53:40.871372 7f821f7fe6c0 Delete type=0 #323
|
||||||
|
2026/02/25-16:16:19.298465 7f821d8d46c0 Level-0 table #328: started
|
||||||
|
2026/02/25-16:16:19.298546 7f821d8d46c0 Level-0 table #328: 0 bytes OK
|
||||||
|
2026/02/25-16:16:19.356349 7f821d8d46c0 Delete type=0 #326
|
||||||
|
2026/02/25-16:16:19.528831 7f821d8d46c0 Manual compaction at level-0 from '!folders!2wTJBj3dicRKzNOE' @ 72057594037927935 : 1 .. '!items!ufvhWG5V8pX0qrtR' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
BIN
packs/armures/MANIFEST-000329
Normal file
BIN
packs/armures/MANIFEST-000329
Normal file
Binary file not shown.
Binary file not shown.
BIN
packs/competences/000278.ldb
Normal file
BIN
packs/competences/000278.ldb
Normal file
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000186
|
MANIFEST-000327
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
2025/04/05-23:14:48.923788 7f9c6bfff6c0 Recovering log #185
|
2026/02/25-16:17:48.995540 7f821e7fc6c0 Recovering log #325
|
||||||
2025/04/05-23:14:48.933992 7f9c6bfff6c0 Delete type=0 #185
|
2026/02/25-16:17:49.005262 7f821e7fc6c0 Delete type=3 #323
|
||||||
2025/04/05-23:14:48.934095 7f9c6bfff6c0 Delete type=3 #184
|
2026/02/25-16:17:49.005349 7f821e7fc6c0 Delete type=0 #325
|
||||||
2025/04/05-23:15:15.781052 7f9c69bff6c0 Level-0 table #189: started
|
|
||||||
2025/04/05-23:15:15.781077 7f9c69bff6c0 Level-0 table #189: 0 bytes OK
|
|
||||||
2025/04/05-23:15:15.787996 7f9c69bff6c0 Delete type=0 #187
|
|
||||||
2025/04/05-23:15:15.800677 7f9c69bff6c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
2025/04/05-18:56:54.918444 7fa870bfa6c0 Recovering log #182
|
2026/02/25-15:53:40.836015 7f821ffff6c0 Recovering log #321
|
||||||
2025/04/05-18:56:54.929675 7fa870bfa6c0 Delete type=3 #180
|
2026/02/25-15:53:40.846129 7f821ffff6c0 Delete type=3 #319
|
||||||
2025/04/05-18:56:54.929721 7fa870bfa6c0 Delete type=0 #182
|
2026/02/25-15:53:40.846180 7f821ffff6c0 Delete type=0 #321
|
||||||
|
2026/02/25-16:16:19.415073 7f821d8d46c0 Level-0 table #326: started
|
||||||
|
2026/02/25-16:16:19.415106 7f821d8d46c0 Level-0 table #326: 0 bytes OK
|
||||||
|
2026/02/25-16:16:19.467523 7f821d8d46c0 Delete type=0 #324
|
||||||
|
2026/02/25-16:16:19.528868 7f821d8d46c0 Manual compaction at level-0 from '!folders!4OPhigzcPv46qbWW' @ 72057594037927935 : 1 .. '!items!yx4k7lQHGcom99mk' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
BIN
packs/competences/MANIFEST-000327
Normal file
BIN
packs/competences/MANIFEST-000327
Normal file
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000197
|
MANIFEST-000339
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
2025/04/05-23:14:48.965558 7f9c6b7fe6c0 Recovering log #196
|
2026/02/25-16:17:49.032966 7f821ffff6c0 Recovering log #337
|
||||||
2025/04/05-23:14:48.975684 7f9c6b7fe6c0 Delete type=0 #196
|
2026/02/25-16:17:49.043199 7f821ffff6c0 Delete type=3 #335
|
||||||
2025/04/05-23:14:48.975771 7f9c6b7fe6c0 Delete type=3 #195
|
2026/02/25-16:17:49.043264 7f821ffff6c0 Delete type=0 #337
|
||||||
2025/04/05-23:15:15.794548 7f9c69bff6c0 Level-0 table #200: started
|
|
||||||
2025/04/05-23:15:15.794568 7f9c69bff6c0 Level-0 table #200: 0 bytes OK
|
|
||||||
2025/04/05-23:15:15.800586 7f9c69bff6c0 Delete type=0 #198
|
|
||||||
2025/04/05-23:15:15.800695 7f9c69bff6c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
2025/04/05-18:56:54.959243 7fa86bfff6c0 Recovering log #193
|
2026/02/25-15:53:40.874436 7f821ffff6c0 Recovering log #333
|
||||||
2025/04/05-18:56:54.969916 7fa86bfff6c0 Delete type=3 #191
|
2026/02/25-15:53:40.884848 7f821ffff6c0 Delete type=3 #331
|
||||||
2025/04/05-18:56:54.970132 7fa86bfff6c0 Delete type=0 #193
|
2026/02/25-15:53:40.884904 7f821ffff6c0 Delete type=0 #333
|
||||||
|
2026/02/25-16:16:19.356498 7f821d8d46c0 Level-0 table #338: started
|
||||||
|
2026/02/25-16:16:19.356535 7f821d8d46c0 Level-0 table #338: 0 bytes OK
|
||||||
|
2026/02/25-16:16:19.414898 7f821d8d46c0 Delete type=0 #336
|
||||||
|
2026/02/25-16:16:19.528852 7f821d8d46c0 Manual compaction at level-0 from '!folders!9PQi3Lv54rpcxavo' @ 72057594037927935 : 1 .. '!items!zGlRtP7zSnkjuuue' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
BIN
packs/education/MANIFEST-000339
Normal file
BIN
packs/education/MANIFEST-000339
Normal file
Binary file not shown.
0
packs/education/lost/000283.log
Normal file
0
packs/education/lost/000283.log
Normal file
Binary file not shown.
BIN
packs/graces/000279.ldb
Normal file
BIN
packs/graces/000279.ldb
Normal file
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000188
|
MANIFEST-000328
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
2025/04/05-23:14:48.980636 7f9c6bfff6c0 Recovering log #187
|
2026/02/25-16:17:49.045639 7f821e7fc6c0 Recovering log #326
|
||||||
2025/04/05-23:14:48.991406 7f9c6bfff6c0 Delete type=0 #187
|
2026/02/25-16:17:49.056537 7f821e7fc6c0 Delete type=3 #324
|
||||||
2025/04/05-23:14:48.991533 7f9c6bfff6c0 Delete type=3 #186
|
2026/02/25-16:17:49.056606 7f821e7fc6c0 Delete type=0 #326
|
||||||
2025/04/05-23:15:15.806897 7f9c69bff6c0 Level-0 table #191: started
|
|
||||||
2025/04/05-23:15:15.806941 7f9c69bff6c0 Level-0 table #191: 0 bytes OK
|
|
||||||
2025/04/05-23:15:15.814152 7f9c69bff6c0 Delete type=0 #189
|
|
||||||
2025/04/05-23:15:15.826768 7f9c69bff6c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
2025/04/05-18:56:54.978266 7fa870bfa6c0 Recovering log #184
|
2026/02/25-15:53:40.888183 7f821effd6c0 Recovering log #322
|
||||||
2025/04/05-18:56:54.988217 7fa870bfa6c0 Delete type=3 #182
|
2026/02/25-15:53:40.897808 7f821effd6c0 Delete type=3 #320
|
||||||
2025/04/05-18:56:54.988347 7fa870bfa6c0 Delete type=0 #184
|
2026/02/25-15:53:40.897873 7f821effd6c0 Delete type=0 #322
|
||||||
|
2026/02/25-16:16:19.645632 7f821d8d46c0 Level-0 table #327: started
|
||||||
|
2026/02/25-16:16:19.645665 7f821d8d46c0 Level-0 table #327: 0 bytes OK
|
||||||
|
2026/02/25-16:16:19.716424 7f821d8d46c0 Delete type=0 #325
|
||||||
|
2026/02/25-16:16:19.766141 7f821d8d46c0 Manual compaction at level-0 from '!items!17mjvwS8R3B6LloG' @ 72057594037927935 : 1 .. '!items!zUYIVOuFpRur9aAR' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
BIN
packs/graces/MANIFEST-000328
Normal file
BIN
packs/graces/MANIFEST-000328
Normal file
Binary file not shown.
0
packs/graces/lost/000232.log
Normal file
0
packs/graces/lost/000232.log
Normal file
0
packs/graces/lost/000273.log
Normal file
0
packs/graces/lost/000273.log
Normal file
Binary file not shown.
BIN
packs/maladies/000279.ldb
Normal file
BIN
packs/maladies/000279.ldb
Normal file
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000188
|
MANIFEST-000328
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
2025/04/05-23:14:48.995168 7f9c6a7fc6c0 Recovering log #187
|
2026/02/25-16:17:49.058989 7f821effd6c0 Recovering log #326
|
||||||
2025/04/05-23:14:49.005707 7f9c6a7fc6c0 Delete type=0 #187
|
2026/02/25-16:17:49.068511 7f821effd6c0 Delete type=3 #324
|
||||||
2025/04/05-23:14:49.005879 7f9c6a7fc6c0 Delete type=3 #186
|
2026/02/25-16:17:49.068568 7f821effd6c0 Delete type=0 #326
|
||||||
2025/04/05-23:15:15.800840 7f9c69bff6c0 Level-0 table #191: started
|
|
||||||
2025/04/05-23:15:15.800872 7f9c69bff6c0 Level-0 table #191: 0 bytes OK
|
|
||||||
2025/04/05-23:15:15.806702 7f9c69bff6c0 Delete type=0 #189
|
|
||||||
2025/04/05-23:15:15.826756 7f9c69bff6c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
2025/04/05-18:56:54.993562 7fa86affd6c0 Recovering log #184
|
2026/02/25-15:53:40.899737 7f821f7fe6c0 Recovering log #322
|
||||||
2025/04/05-18:56:55.005280 7fa86affd6c0 Delete type=3 #182
|
2026/02/25-15:53:40.910545 7f821f7fe6c0 Delete type=3 #320
|
||||||
2025/04/05-18:56:55.005390 7fa86affd6c0 Delete type=0 #184
|
2026/02/25-15:53:40.910590 7f821f7fe6c0 Delete type=0 #322
|
||||||
|
2026/02/25-16:16:19.529006 7f821d8d46c0 Level-0 table #327: started
|
||||||
|
2026/02/25-16:16:19.529044 7f821d8d46c0 Level-0 table #327: 0 bytes OK
|
||||||
|
2026/02/25-16:16:19.584573 7f821d8d46c0 Delete type=0 #325
|
||||||
|
2026/02/25-16:16:19.766110 7f821d8d46c0 Manual compaction at level-0 from '!items!1icaxIywAwDXQcMz' @ 72057594037927935 : 1 .. '!items!ysGehYm1VkMWrI22' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
BIN
packs/maladies/MANIFEST-000328
Normal file
BIN
packs/maladies/MANIFEST-000328
Normal file
Binary file not shown.
0
packs/maladies/lost/000232.log
Normal file
0
packs/maladies/lost/000232.log
Normal file
0
packs/maladies/lost/000273.log
Normal file
0
packs/maladies/lost/000273.log
Normal file
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000126
|
MANIFEST-000265
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
2025/04/05-23:14:49.022817 7f9c6b7fe6c0 Recovering log #125
|
2026/02/25-16:17:49.082827 7f821e7fc6c0 Recovering log #263
|
||||||
2025/04/05-23:14:49.033064 7f9c6b7fe6c0 Delete type=0 #125
|
2026/02/25-16:17:49.093869 7f821e7fc6c0 Delete type=3 #261
|
||||||
2025/04/05-23:14:49.033117 7f9c6b7fe6c0 Delete type=3 #124
|
2026/02/25-16:17:49.093933 7f821e7fc6c0 Delete type=0 #263
|
||||||
2025/04/05-23:15:15.820812 7f9c69bff6c0 Level-0 table #129: started
|
|
||||||
2025/04/05-23:15:15.820832 7f9c69bff6c0 Level-0 table #129: 0 bytes OK
|
|
||||||
2025/04/05-23:15:15.826647 7f9c69bff6c0 Delete type=0 #127
|
|
||||||
2025/04/05-23:15:15.826788 7f9c69bff6c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
2025/04/05-18:56:55.022532 7fa86bfff6c0 Recovering log #122
|
2026/02/25-15:53:40.925187 7f821effd6c0 Recovering log #259
|
||||||
2025/04/05-18:56:55.035510 7fa86bfff6c0 Delete type=3 #120
|
2026/02/25-15:53:40.934520 7f821effd6c0 Delete type=3 #257
|
||||||
2025/04/05-18:56:55.035608 7fa86bfff6c0 Delete type=0 #122
|
2026/02/25-15:53:40.934568 7f821effd6c0 Delete type=0 #259
|
||||||
|
2026/02/25-16:16:19.945947 7f821d8d46c0 Level-0 table #264: started
|
||||||
|
2026/02/25-16:16:19.946001 7f821d8d46c0 Level-0 table #264: 0 bytes OK
|
||||||
|
2026/02/25-16:16:20.001848 7f821d8d46c0 Delete type=0 #262
|
||||||
|
2026/02/25-16:16:20.001994 7f821d8d46c0 Manual compaction at level-0 from '!scenes!FJXugdbkBpEJEdR6' @ 72057594037927935 : 1 .. '!scenes!FJXugdbkBpEJEdR6' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
BIN
packs/scenes/MANIFEST-000265
Normal file
BIN
packs/scenes/MANIFEST-000265
Normal file
Binary file not shown.
0
packs/scenes/lost/000169.log
Normal file
0
packs/scenes/lost/000169.log
Normal file
0
packs/scenes/lost/000210.log
Normal file
0
packs/scenes/lost/000210.log
Normal file
Binary file not shown.
BIN
packs/simples/000280.ldb
Normal file
BIN
packs/simples/000280.ldb
Normal file
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000188
|
MANIFEST-000329
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
2025/04/05-23:14:49.009401 7f9c6affd6c0 Recovering log #187
|
2026/02/25-16:17:49.070393 7f821ffff6c0 Recovering log #327
|
||||||
2025/04/05-23:14:49.019412 7f9c6affd6c0 Delete type=0 #187
|
2026/02/25-16:17:49.080654 7f821ffff6c0 Delete type=3 #325
|
||||||
2025/04/05-23:14:49.019467 7f9c6affd6c0 Delete type=3 #186
|
2026/02/25-16:17:49.080720 7f821ffff6c0 Delete type=0 #327
|
||||||
2025/04/05-23:15:15.814317 7f9c69bff6c0 Level-0 table #191: started
|
|
||||||
2025/04/05-23:15:15.814353 7f9c69bff6c0 Level-0 table #191: 0 bytes OK
|
|
||||||
2025/04/05-23:15:15.820737 7f9c69bff6c0 Delete type=0 #189
|
|
||||||
2025/04/05-23:15:15.826778 7f9c69bff6c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
2025/04/05-18:56:55.008325 7fa86b7fe6c0 Recovering log #184
|
2026/02/25-15:53:40.912618 7f821e7fc6c0 Recovering log #323
|
||||||
2025/04/05-18:56:55.018646 7fa86b7fe6c0 Delete type=3 #182
|
2026/02/25-15:53:40.922737 7f821e7fc6c0 Delete type=3 #321
|
||||||
2025/04/05-18:56:55.018796 7fa86b7fe6c0 Delete type=0 #184
|
2026/02/25-15:53:40.922804 7f821e7fc6c0 Delete type=0 #323
|
||||||
|
2026/02/25-16:16:19.584692 7f821d8d46c0 Level-0 table #328: started
|
||||||
|
2026/02/25-16:16:19.584724 7f821d8d46c0 Level-0 table #328: 0 bytes OK
|
||||||
|
2026/02/25-16:16:19.645484 7f821d8d46c0 Delete type=0 #326
|
||||||
|
2026/02/25-16:16:19.766128 7f821d8d46c0 Manual compaction at level-0 from '!items!1bAL2MQVpVBd0c5Z' @ 72057594037927935 : 1 .. '!items!zs67k4sxCid6oTK3' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
BIN
packs/simples/MANIFEST-000329
Normal file
BIN
packs/simples/MANIFEST-000329
Normal file
Binary file not shown.
0
packs/simples/lost/000233.log
Normal file
0
packs/simples/lost/000233.log
Normal file
0
packs/simples/lost/000274.log
Normal file
0
packs/simples/lost/000274.log
Normal file
1304
postcss/tedeum.css
1304
postcss/tedeum.css
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user