2025-01-31 11:54:52 +01:00
|
|
|
import { TeDeumUtility } from "../common/tedeum-utility.js";
|
2025-02-03 23:00:59 +01:00
|
|
|
import { TeDeumActor } from "../actors/tedeum-actor.js";
|
2025-01-31 11:54:52 +01:00
|
|
|
export class TeDeumCharacterCreator {
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
async init() {
|
|
|
|
this.stages = {}
|
|
|
|
this.currentStage = "origineSociale"
|
|
|
|
this.sex = undefined
|
|
|
|
this.origineSociale = undefined
|
|
|
|
this.religion = undefined
|
|
|
|
this.caracBonus = {}
|
|
|
|
this.competenceBonus = {}
|
2025-02-22 22:44:00 +01:00
|
|
|
this.suiviReponses = []
|
2025-01-31 11:54:52 +01:00
|
|
|
this.competences = TeDeumUtility.getCompetencesForDropDown()
|
|
|
|
|
|
|
|
for (let k in game.system.tedeum.config.caracteristiques) {
|
|
|
|
this.caracBonus[k] = { value: 0 }
|
|
|
|
}
|
|
|
|
|
|
|
|
for (let stage in game.system.tedeum.config.etapesEducation) {
|
|
|
|
this.stages[stage] = { selectedItem: null, items: [] }
|
|
|
|
}
|
|
|
|
|
|
|
|
const educations = await TeDeumUtility.loadCompendium("fvtt-te-deum.education")
|
|
|
|
for (let edu of educations) {
|
|
|
|
this.stages[edu.system.etape].items.push(edu)
|
|
|
|
}
|
|
|
|
|
|
|
|
this.processStage()
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
increaseCompetence(compName) {
|
2025-02-03 23:00:59 +01:00
|
|
|
if (compName === "" || compName == undefined || compName == "undefined") { return }
|
2025-01-31 11:54:52 +01:00
|
|
|
compName = compName.toLowerCase()
|
|
|
|
if (!this.competenceBonus[compName]) {
|
|
|
|
this.competenceBonus[compName] = { value: 1 }
|
|
|
|
} else {
|
|
|
|
this.competenceBonus[compName].value += 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
processReponses(question) {
|
|
|
|
let fullResponses = []
|
|
|
|
for (let key in question.reponses) {
|
|
|
|
let response = question.reponses[key]
|
2025-02-03 23:00:59 +01:00
|
|
|
fullResponses.push({ id: key, label: `${response.reponse} (${TeDeumUtility.upperFirst( response.compName)} +1)` })
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
return fullResponses
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
processReponsesRadio(question) {
|
|
|
|
let fullResponses = {}
|
2025-02-03 23:00:59 +01:00
|
|
|
let selected = true
|
2025-01-31 11:54:52 +01:00
|
|
|
for (let key in question.reponses) {
|
|
|
|
let response = question.reponses[key]
|
2025-02-03 23:00:59 +01:00
|
|
|
if (response.toSelect) {
|
|
|
|
fullResponses[key] = { label: `${response.reponse}`, competences: response.compList, selected }
|
|
|
|
} else {
|
|
|
|
fullResponses[key] = { label: `${response.reponse} (${response.compName} +1)`, selected }
|
|
|
|
}
|
|
|
|
selected = false
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
return fullResponses
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
async askStageName(context) {
|
|
|
|
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-stage-name.hbs", context)
|
|
|
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
|
|
|
window: { title: context.title },
|
|
|
|
classes: ["fvtt-te-deum"],
|
|
|
|
content,
|
|
|
|
buttons: [
|
|
|
|
{
|
|
|
|
label: context.label,
|
|
|
|
callback: (event, button, dialog) => {
|
|
|
|
const output = Array.from(button.form.elements).reduce((obj, input) => {
|
|
|
|
if (input.name) obj[input.name] = input.value
|
|
|
|
return obj
|
|
|
|
}, {})
|
|
|
|
return output
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
actions: {
|
|
|
|
},
|
|
|
|
rejectClose: false, // Click on Close button will not launch an error
|
|
|
|
render: (event, dialog) => {
|
2025-02-06 10:23:24 +01:00
|
|
|
$(".stage-selector").change(event => {
|
|
|
|
let stageId = event.target.value
|
|
|
|
let stage = context.choices.find(item => item.id === stageId)
|
|
|
|
let link = `<a class="content-link" draggable="true" data-link=""
|
|
|
|
data-uuid="Compendium.fvtt-te-deum.education.Item.${stageId}" data-id="${stageId}" data-type="Item"
|
|
|
|
data-pack="fvtt-te-deum.education" data-tooltip="Education Objet"><i class="fas fa-suitcase"></i>${stage.name}</a>`
|
|
|
|
$(".stage-main-details").html(`Voir le détail : ${link}`)
|
|
|
|
})
|
|
|
|
|
|
|
|
document.getElementById("stage-selector").dispatchEvent(new Event('change'))
|
|
|
|
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
})
|
|
|
|
return choiceResult
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
2025-02-03 23:00:59 +01:00
|
|
|
processCompetences(compList) {
|
|
|
|
for (let compName in compList) {
|
|
|
|
this.increaseCompetence(compName)
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
async askQuestionnaire(stage, context) {
|
2025-02-03 23:00:59 +01:00
|
|
|
context.subtitle = "Questionnaire"
|
|
|
|
|
2025-01-31 11:54:52 +01:00
|
|
|
for (let key in stage.system.questionnaire) {
|
|
|
|
let question = stage.system.questionnaire[key]
|
|
|
|
if (question.question === "") { break }
|
|
|
|
|
|
|
|
context.question = question.question
|
|
|
|
context.responses = this.processReponses(question)
|
|
|
|
context.responsesRadio = this.processReponsesRadio(question)
|
2025-02-03 23:00:59 +01:00
|
|
|
context.competences = {}
|
|
|
|
context.responseKey = "reponse1" // By default
|
2025-01-31 11:54:52 +01:00
|
|
|
|
|
|
|
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-questions.hbs", context)
|
|
|
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
|
|
|
window: { title: context.title },
|
|
|
|
classes: ["fvtt-te-deum"],
|
|
|
|
content,
|
|
|
|
buttons: [
|
|
|
|
{
|
|
|
|
label: context.label,
|
|
|
|
callback: (event, button, dialog) => {
|
|
|
|
const output = Array.from(button.form.elements).reduce((obj, input) => {
|
|
|
|
if (input.name) obj[input.name] = input.value
|
|
|
|
return obj
|
|
|
|
}, {})
|
|
|
|
return output
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
actions: {
|
|
|
|
},
|
|
|
|
rejectClose: false, // Click on Close button will not launch an error
|
|
|
|
render: (event, dialog) => {
|
2025-02-03 23:00:59 +01:00
|
|
|
$(".questionnaire-radio").click(event => {
|
|
|
|
let responseKey = $(event.target).data("response-key")
|
|
|
|
context.responseKey = responseKey
|
|
|
|
})
|
|
|
|
$(".questionnaire-select-competence").change(event => {
|
|
|
|
// Get the responseKey data
|
|
|
|
let responseKey = $(event.target).data("response-key")
|
|
|
|
let compName = event.target.value
|
|
|
|
console.log("Questionnaire Change", responseKey, compName)
|
|
|
|
context.competences[responseKey] = compName.toLowerCase()
|
|
|
|
})
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
})
|
2025-02-03 23:00:59 +01:00
|
|
|
if (choiceResult == null) {
|
|
|
|
this.currentStage = "cancelled"
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
let selectedResponse = question.reponses[context.responseKey]
|
|
|
|
let compName = context.competences[context.responseKey] || selectedResponse.compName
|
|
|
|
this.increaseCompetence(compName)
|
2025-02-22 22:44:00 +01:00
|
|
|
|
|
|
|
this.suiviReponses.push({ etape: stage.name, question: question.question, reponse: selectedResponse.reponse, compName: compName })
|
2025-02-03 23:00:59 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*------------- -------------------------------*/
|
|
|
|
async askCompetences(stage, context) {
|
|
|
|
context.subtitle = "Choix des Compétences"
|
|
|
|
|
|
|
|
context.fixedCompetences = {}
|
|
|
|
context.selectCompetences = {}
|
|
|
|
for (let compKey in stage.system.competences) {
|
|
|
|
let comp = stage.system.competences[compKey]
|
|
|
|
if (comp.valid && comp.compName !== "") {
|
|
|
|
if (comp.toSelect) {
|
|
|
|
context.hasSelectCompetences = true
|
|
|
|
context.selectCompetences[comp.compName] = TeDeumUtility.upperFirst(comp.compName)
|
|
|
|
} else {
|
|
|
|
context.fixedCompetences[comp.compName] = TeDeumUtility.upperFirst(comp.compName)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-competences.hbs", context)
|
|
|
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
|
|
|
window: { title: context.title },
|
|
|
|
classes: ["fvtt-te-deum"],
|
|
|
|
content,
|
|
|
|
buttons: [
|
|
|
|
{
|
|
|
|
label: context.label,
|
|
|
|
callback: (event, button, dialog) => {
|
|
|
|
const output = Array.from(button.form.elements).reduce((obj, input) => {
|
|
|
|
if (input.name) obj[input.name] = input.value
|
|
|
|
return obj
|
|
|
|
}, {})
|
|
|
|
return output
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
actions: {
|
|
|
|
},
|
|
|
|
rejectClose: false, // Click on Close button will not launch an error
|
|
|
|
render: (event, dialog) => {
|
|
|
|
}
|
|
|
|
})
|
|
|
|
if (choiceResult == null) {
|
|
|
|
this.currentStage = "cancelled"
|
|
|
|
return
|
|
|
|
}
|
|
|
|
context.fixedCompetences[choiceResult.selectedCompetence] = choiceResult.selectedCompetence
|
|
|
|
this.processCompetences(context.fixedCompetences)
|
|
|
|
|
|
|
|
// Handle specific case when multiple skills can be selected (ie compagnon case)
|
|
|
|
if ( stage.system.hasCompetencesOpt ) {
|
|
|
|
context.fixedCompetences = []
|
|
|
|
context.hasSelectCompetences = true
|
|
|
|
for (let i = 0; i < stage.system.competencesOptNumber; i++) {
|
|
|
|
context.competences = {}
|
|
|
|
context.selectCompetences = {}
|
|
|
|
for (let compKey in stage.system.competencesOpt) {
|
|
|
|
let comp = stage.system.competencesOpt[compKey]
|
|
|
|
if (comp.compName !== "") {
|
|
|
|
context.selectCompetences[comp.compName] = TeDeumUtility.upperFirst(comp.compName)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-select-competences.hbs", context)
|
|
|
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
|
|
|
window: { title: context.title },
|
|
|
|
classes: ["fvtt-te-deum"],
|
|
|
|
content,
|
|
|
|
buttons: [
|
|
|
|
{
|
|
|
|
label: context.label,
|
|
|
|
callback: (event, button, dialog) => {
|
|
|
|
const output = Array.from(button.form.elements).reduce((obj, input) => {
|
|
|
|
if (input.name) obj[input.name] = input.value
|
|
|
|
return obj
|
|
|
|
}, {})
|
|
|
|
return output
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
actions: {
|
|
|
|
},
|
|
|
|
rejectClose: false, // Click on Close button will not launch an error
|
|
|
|
render: (event, dialog) => {
|
|
|
|
}
|
|
|
|
})
|
|
|
|
if (choiceResult == null) {
|
|
|
|
this.currentStage = "cancelled"
|
|
|
|
return
|
|
|
|
}
|
|
|
|
context.fixedCompetences[choiceResult.selectedCompetence] = choiceResult.selectedCompetence
|
|
|
|
this.processCompetences(context.fixedCompetences)
|
|
|
|
}
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
2025-02-03 23:00:59 +01:00
|
|
|
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/*------------- -------------------------------*/
|
|
|
|
async askCarac(stage, context) {
|
2025-02-03 23:00:59 +01:00
|
|
|
context.subtitle = "Choix des Caractéristiques"
|
|
|
|
|
|
|
|
let selected = []
|
2025-01-31 11:54:52 +01:00
|
|
|
for (let i = 0; i < stage.system.nbChoixCarac; i++) {
|
|
|
|
context.caracList = []
|
|
|
|
for (let caracKey in stage.system.caracteristiques) {
|
|
|
|
let carac = stage.system.caracteristiques[caracKey]
|
2025-02-03 23:00:59 +01:00
|
|
|
if (selected.includes(carac.caracId)) { continue }
|
2025-01-31 11:54:52 +01:00
|
|
|
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 choiceResult = await foundry.applications.api.DialogV2.wait({
|
|
|
|
window: { title: context.title },
|
|
|
|
classes: ["fvtt-te-deum"],
|
|
|
|
content,
|
|
|
|
buttons: [
|
|
|
|
{
|
|
|
|
label: context.label,
|
|
|
|
callback: (event, button, dialog) => {
|
|
|
|
const output = Array.from(button.form.elements).reduce((obj, input) => {
|
|
|
|
if (input.name) obj[input.name] = input.value
|
|
|
|
return obj
|
|
|
|
}, {})
|
|
|
|
return output
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
actions: {
|
|
|
|
},
|
|
|
|
rejectClose: false, // Click on Close button will not launch an error
|
|
|
|
render: (event, dialog) => {
|
|
|
|
}
|
|
|
|
})
|
2025-02-03 23:00:59 +01:00
|
|
|
if (choiceResult == null) {
|
|
|
|
this.currentStage = "cancelled"
|
|
|
|
return
|
|
|
|
}
|
2025-01-31 11:54:52 +01:00
|
|
|
this.caracBonus[choiceResult.carac].value += 1
|
2025-02-03 23:00:59 +01:00
|
|
|
selected.push(choiceResult.carac)
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
async renderOrigineSociale(stage) {
|
|
|
|
let context = {
|
2025-02-03 23:00:59 +01:00
|
|
|
title: "Création de personnage",
|
|
|
|
subtitle: "Origine Sociale",
|
2025-02-04 21:20:54 +01:00
|
|
|
sexeChoice: { "Homme": "Homme", "Femme": "Femme" },
|
2025-01-31 11:54:52 +01:00
|
|
|
religionChoice: { "catholique": "Catholique", "protestante": "Protestante" },
|
|
|
|
origineChoice: game.system.tedeum.config.origineSociale
|
|
|
|
}
|
|
|
|
|
2025-02-03 23:00:59 +01:00
|
|
|
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-origine.hbs", context)
|
2025-01-31 11:54:52 +01:00
|
|
|
const label = "Valider le choix de l'Origine Sociale"
|
|
|
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
|
|
|
window: { title: context.title },
|
|
|
|
classes: ["fvtt-te-deum"],
|
|
|
|
content,
|
|
|
|
buttons: [
|
|
|
|
{
|
|
|
|
label: label,
|
|
|
|
callback: (event, button, dialog) => {
|
|
|
|
const output = Array.from(button.form.elements).reduce((obj, input) => {
|
|
|
|
if (input.name) obj[input.name] = input.value
|
|
|
|
return obj
|
|
|
|
}, {})
|
|
|
|
return output
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
actions: {
|
|
|
|
},
|
|
|
|
rejectClose: false, // Click on Close button will not launch an error
|
|
|
|
render: (event, dialog) => { }
|
|
|
|
})
|
|
|
|
|
2025-02-03 23:00:59 +01:00
|
|
|
if (choiceResult == null) {
|
|
|
|
this.currentStage = "cancelled"
|
|
|
|
return
|
|
|
|
}
|
2025-01-31 11:54:52 +01:00
|
|
|
|
|
|
|
this.sexe = choiceResult.sexe
|
|
|
|
this.religion = choiceResult.religion
|
|
|
|
this.origineSociale = foundry.utils.duplicate(game.system.tedeum.config.origineSociale[choiceResult.origineSociale])
|
2025-02-03 23:00:59 +01:00
|
|
|
for (let key in this.origineSociale.caracteristiques) {
|
|
|
|
this.caracBonus[key].value += this.origineSociale.caracteristiques[key]
|
|
|
|
}
|
2025-01-31 11:54:52 +01:00
|
|
|
this.currentStage = "pouponniere"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
async renderPouponniere(stage) {
|
|
|
|
|
|
|
|
// Filter available pouponniere from origineSociale
|
|
|
|
let pouponniereItems = stage.items.filter(item => item.system.accessible[this.origineSociale.id].isaccessible)
|
|
|
|
|
|
|
|
let context = {
|
|
|
|
title: "Création de personnage - La Pouponnière",
|
2025-02-03 23:00:59 +01:00
|
|
|
subtitle: "Choix de la Pouponnière",
|
2025-01-31 11:54:52 +01:00
|
|
|
label: "Valider le choix de la Pouponnière",
|
2025-02-03 23:00:59 +01:00
|
|
|
choices: pouponniereItems,
|
|
|
|
caracBonus: this.caracBonus,
|
|
|
|
competenceBonus: this.competenceBonus
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
let choiceResult = await this.askStageName(context)
|
2025-02-03 23:00:59 +01:00
|
|
|
if (choiceResult == null) {
|
|
|
|
this.currentStage = "cancelled"
|
|
|
|
return
|
|
|
|
}
|
2025-01-31 11:54:52 +01:00
|
|
|
|
|
|
|
this.pouponniere = foundry.utils.duplicate(stage.items.find(item => item.id === choiceResult.selectedItem))
|
2025-02-03 23:00:59 +01:00
|
|
|
context.title = `La Pouponnière - ${this.pouponniere.name}`
|
2025-01-31 11:54:52 +01:00
|
|
|
TeDeumUtility.prepareEducationContent(this.pouponniere);
|
|
|
|
|
|
|
|
context.label = "Valider l'augmentation de caracteristique"
|
|
|
|
await this.askCarac(this.pouponniere, context)
|
|
|
|
|
2025-02-03 23:00:59 +01:00
|
|
|
context.label = "Valider l'augmentation de compétences"
|
|
|
|
await this.askCompetences(this.pouponniere, context)
|
2025-01-31 11:54:52 +01:00
|
|
|
|
|
|
|
context.label = "Valider cette réponse"
|
|
|
|
await this.askQuestionnaire(this.pouponniere, context)
|
|
|
|
|
|
|
|
this.currentStage = "petitsgrimauds"
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
async renderPetitsGrimauds(stage) {
|
|
|
|
// Filter available pouponniere from origineSociale
|
|
|
|
let grimaudsItems = stage.items.filter(item => item.system.accessible[this.origineSociale.id].isaccessible)
|
|
|
|
|
|
|
|
let context = {
|
2025-02-03 23:00:59 +01:00
|
|
|
title: "Les Petits Grimauds",
|
2025-01-31 11:54:52 +01:00
|
|
|
label: "Valider le choix des Petits Grimauds",
|
2025-02-03 23:00:59 +01:00
|
|
|
choices: grimaudsItems,
|
|
|
|
caracBonus: this.caracBonus,
|
|
|
|
competenceBonus: this.competenceBonus
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
let choiceResult = await this.askStageName(context)
|
2025-02-03 23:00:59 +01:00
|
|
|
if (choiceResult == null) {
|
|
|
|
this.currentStage = "cancelled"
|
|
|
|
return
|
|
|
|
}
|
2025-01-31 11:54:52 +01:00
|
|
|
|
|
|
|
this.grimauds = foundry.utils.duplicate(stage.items.find(item => item.id === choiceResult.selectedItem))
|
2025-02-04 21:20:54 +01:00
|
|
|
context.title = `LesPetits Grimauds - ${this.grimauds.name}`
|
2025-01-31 11:54:52 +01:00
|
|
|
TeDeumUtility.prepareEducationContent(this.grimauds);
|
|
|
|
|
|
|
|
context.label = "Valider l'augmentation de caracteristique"
|
|
|
|
await this.askCarac(this.grimauds, context)
|
2025-02-03 23:00:59 +01:00
|
|
|
context.label = "Valider l'augmentation de compétences"
|
|
|
|
await this.askCompetences(this.grimauds, context)
|
2025-01-31 11:54:52 +01:00
|
|
|
|
|
|
|
context.label = "Valider cette réponse"
|
|
|
|
await this.askQuestionnaire(this.grimauds, context)
|
|
|
|
|
|
|
|
this.currentStage = "rosevie"
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
async renderRosesDeLaVie(stage) {
|
|
|
|
// Filter available pouponniere from origineSociale
|
|
|
|
let rosesItems = stage.items.filter(item => item.system.accessible[this.origineSociale.id].isaccessible)
|
|
|
|
|
|
|
|
let context = {
|
|
|
|
title: "Création de personnage - Les Roses de la Vie",
|
|
|
|
label: "Valider le choix des Roses de la Vie",
|
2025-02-03 23:00:59 +01:00
|
|
|
choices: rosesItems,
|
|
|
|
caracBonus: this.caracBonus,
|
|
|
|
competenceBonus: this.competenceBonus
|
|
|
|
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
let choiceResult = await this.askStageName(context)
|
2025-02-03 23:00:59 +01:00
|
|
|
if (choiceResult == null) {
|
|
|
|
this.currentStage = "cancelled"
|
|
|
|
return
|
|
|
|
}
|
2025-01-31 11:54:52 +01:00
|
|
|
|
|
|
|
this.roses = foundry.utils.duplicate(stage.items.find(item => item.id === choiceResult.selectedItem))
|
2025-02-03 23:00:59 +01:00
|
|
|
context.title = `Les Roses de la Vie - ${this.roses.name}`
|
2025-01-31 11:54:52 +01:00
|
|
|
TeDeumUtility.prepareEducationContent(this.roses);
|
|
|
|
|
|
|
|
context.label = "Valider l'augmentation de caracteristique"
|
|
|
|
await this.askCarac(this.roses, context)
|
2025-02-03 23:00:59 +01:00
|
|
|
context.label = "Valider l'augmentation de compétences"
|
|
|
|
await this.askCompetences(this.roses, context)
|
2025-01-31 11:54:52 +01:00
|
|
|
|
|
|
|
context.label = "Valider cette réponse"
|
|
|
|
await this.askQuestionnaire(this.roses, context)
|
|
|
|
|
|
|
|
this.currentStage = "ageviril"
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
async renderAgeViril(stage) {
|
2025-02-03 23:00:59 +01:00
|
|
|
let virilDebouche = this.roses.system.debouches
|
|
|
|
let ageVirilItems = []
|
|
|
|
for (let key in virilDebouche) {
|
|
|
|
let debouche = virilDebouche[key]
|
|
|
|
if (debouche.debouche === "") { continue }
|
|
|
|
let deboucheItem = stage.items.find(item => item.name.toLowerCase().includes(debouche.debouche.toLowerCase()))
|
|
|
|
if (deboucheItem) {
|
|
|
|
ageVirilItems.push(deboucheItem)
|
|
|
|
} else {
|
|
|
|
console.log(`Debouche ${debouche.debouche} not found !`)
|
|
|
|
}
|
|
|
|
}
|
2025-01-31 11:54:52 +01:00
|
|
|
|
|
|
|
let context = {
|
|
|
|
title: "Création de personnage - L'Age Viril",
|
|
|
|
label: "Valider le choix de l'Age Viril",
|
2025-02-03 23:00:59 +01:00
|
|
|
choices: ageVirilItems,
|
|
|
|
caracBonus: this.caracBonus,
|
|
|
|
competenceBonus: this.competenceBonus
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
let choiceResult = await this.askStageName(context)
|
2025-02-03 23:00:59 +01:00
|
|
|
if (choiceResult == null) {
|
|
|
|
this.currentStage = "cancelled"
|
|
|
|
return
|
|
|
|
}
|
2025-01-31 11:54:52 +01:00
|
|
|
|
|
|
|
this.ageViril = foundry.utils.duplicate(stage.items.find(item => item.id === choiceResult.selectedItem))
|
2025-02-03 23:00:59 +01:00
|
|
|
context.title = `L'Age Viril - ${this.ageViril.name}`
|
2025-01-31 11:54:52 +01:00
|
|
|
TeDeumUtility.prepareEducationContent(this.ageViril);
|
|
|
|
|
|
|
|
context.label = "Valider l'augmentation de caracteristique"
|
|
|
|
await this.askCarac(this.ageViril, context)
|
2025-02-03 23:00:59 +01:00
|
|
|
context.label = "Valider l'augmentation de compétences"
|
|
|
|
await this.askCompetences(this.ageViril, context)
|
2025-01-31 11:54:52 +01:00
|
|
|
|
|
|
|
this.currentStage = "finished"
|
|
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------*/
|
|
|
|
async processStage() {
|
|
|
|
while (this.currentStage !== "finished") {
|
|
|
|
let stage = this.stages[this.currentStage]
|
|
|
|
switch (this.currentStage) {
|
|
|
|
case "origineSociale":
|
|
|
|
await this.renderOrigineSociale(stage)
|
|
|
|
break
|
|
|
|
case "pouponniere":
|
|
|
|
await this.renderPouponniere(stage)
|
|
|
|
break
|
|
|
|
case "petitsgrimauds":
|
|
|
|
await this.renderPetitsGrimauds(stage)
|
|
|
|
break
|
|
|
|
case "rosevie":
|
|
|
|
await this.renderRosesDeLaVie(stage)
|
|
|
|
break
|
|
|
|
case "ageviril":
|
|
|
|
await this.renderAgeViril(stage)
|
|
|
|
break
|
2025-02-03 23:00:59 +01:00
|
|
|
case "cancelled":
|
|
|
|
return
|
|
|
|
break
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-03 23:00:59 +01:00
|
|
|
console.log("Carac Bonus", this.caracBonus)
|
2025-01-31 11:54:52 +01:00
|
|
|
console.log("Competence Bonus", this.competenceBonus)
|
2025-02-03 23:00:59 +01:00
|
|
|
let actor = await TeDeumActor.create({name: "Nouveau personnage", type: "pj"})
|
|
|
|
let updates = {}
|
|
|
|
for (let key in this.caracBonus) {
|
|
|
|
updates[`system.caracteristiques.${key}.value`] = Number(this.caracBonus[key].value)+1
|
|
|
|
}
|
|
|
|
updates['system.genre'] = this.sexe
|
2025-02-04 21:20:54 +01:00
|
|
|
updates['system.religion'] = TeDeumUtility.upperFirst(this.religion)
|
2025-02-03 23:00:59 +01:00
|
|
|
updates['system.statutocial'] = this.origineSociale.label
|
|
|
|
updates['system.equipmentfree'] = this.ageViril.system.trousseau
|
|
|
|
actor.update( updates);
|
|
|
|
|
|
|
|
// Process competences : increase know skills
|
|
|
|
let updateComp = []
|
|
|
|
let toAdd = []
|
|
|
|
for (let compName in this.competenceBonus) {
|
|
|
|
let comp = actor.items.find( i => i.type == "competence" && i.name.toLowerCase() === compName.toLowerCase())
|
|
|
|
if (comp) {
|
|
|
|
updateComp.push({ _id: comp._id, "system.score": this.competenceBonus[compName].value })
|
|
|
|
} else {
|
|
|
|
toAdd.push( compName)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
actor.updateEmbeddedDocuments("Item", updateComp)
|
|
|
|
|
|
|
|
// Process adding skills
|
|
|
|
let compendiumSkill = TeDeumUtility.getCompetences()
|
|
|
|
let compToAdd = [ this.pouponniere, this.grimauds, this.roses, this.ageViril ]
|
|
|
|
for (let compName of toAdd) {
|
|
|
|
let comp = compendiumSkill.find( i => i.name.toLowerCase() === compName.toLowerCase())
|
|
|
|
comp.system.score = this.competenceBonus[compName].value
|
|
|
|
compToAdd.push(comp)
|
|
|
|
}
|
|
|
|
await actor.createEmbeddedDocuments('Item', compToAdd)
|
|
|
|
|
|
|
|
let newArgent = this.origineSociale.cagnotte * this.ageViril.system.cagnotteMultiplier
|
|
|
|
newArgent /= this.ageViril.system.cagnotteDivider
|
|
|
|
await actor.update({ [`system.fortune.${this.origineSociale.cagnotteUnit}`]: newArgent})
|
|
|
|
|
2025-02-22 22:44:00 +01:00
|
|
|
let histoire = ""
|
|
|
|
for (let reponse of this.suiviReponses) {
|
|
|
|
histoire += `<p>${reponse.question}<br>${reponse.reponse} (${reponse.compName})</p>`
|
|
|
|
}
|
|
|
|
await actor.update({ "system.histoire": histoire})
|
2025-02-03 23:00:59 +01:00
|
|
|
actor.render(true)
|
|
|
|
|
2025-02-25 21:29:52 +01:00
|
|
|
context.pointsCompetence = {
|
|
|
|
"savoir": { score: actor.getCompetenceScore("Mémoriser"), label: "Savoir" },
|
|
|
|
"sensibilite": { score: actor.getCompetenceScore("Perception"), label: "Sensibilité" },
|
|
|
|
"entregent": { score: actor.getCompetenceScore("Charme"), label: "Entregent" },
|
|
|
|
"puissance": { score: actor.getCompetenceScore("Effort"), label: "Puissance" },
|
|
|
|
"complexion": { score: actor.getCompetenceScore("Endurance"), label: "Complexion" },
|
|
|
|
"adresse": { score: actor.getCompetenceScore("Initiative"), label: "Adresse" },
|
|
|
|
}
|
|
|
|
|
2025-02-03 23:00:59 +01:00
|
|
|
const content = await renderTemplate("systems/fvtt-te-deum/templates/dialogs/character-creator-finished.hbs", context)
|
|
|
|
const label = "Terminer"
|
|
|
|
const choiceResult = await foundry.applications.api.DialogV2.wait({
|
|
|
|
window: { title: context.title },
|
|
|
|
classes: ["fvtt-te-deum"],
|
|
|
|
content,
|
|
|
|
buttons: [
|
|
|
|
{
|
|
|
|
label: label,
|
|
|
|
callback: (event, button, dialog) => {
|
|
|
|
const output = Array.from(button.form.elements).reduce((obj, input) => {
|
|
|
|
if (input.name) obj[input.name] = input.value
|
|
|
|
return obj
|
|
|
|
}, {})
|
|
|
|
return output
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
actions: {
|
|
|
|
},
|
|
|
|
rejectClose: false, // Click on Close button will not launch an error
|
|
|
|
render: (event, dialog) => { }
|
|
|
|
})
|
|
|
|
|
2025-01-31 11:54:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|