Génération aléatoire d'archétype

This commit is contained in:
2026-06-20 18:38:48 +02:00
parent 749eb5ee13
commit f8a20b90ff
5 changed files with 95 additions and 27 deletions
+60 -15
View File
@@ -2975,19 +2975,19 @@ export class RdDActor extends RdDBaseActorSang {
}
async nouvelleIncarnation() {
let incarnation = this.toObject();
let incarnation = this.toObject()
incarnation.items = Array.from(this.items.filter(it => it.type == ITEM_TYPES.competence),
incarnation.items = Array.from(this.itemTypes[ITEM_TYPES.competence],
it => {
it = it.toObject();
it.id = undefined;
it.system.niveau = it.system.base;
it.system.niveau_archetype = Math.max(it.system.niveau + (it.system.xp > 0 ? 1 : 0), it.system.niveau_archetype);
it.system.xp = 0;
it.system.xp_sort = 0;
it.system.default_diffLibre = 0;
return it;
});
it = it.toObject()
it.id = undefined
it.system.niveau = it.system.base
it.system.niveau_archetype = Math.max(it.system.niveau + (it.system.xp > 0 ? 1 : 0), it.system.niveau_archetype)
it.system.xp = 0
it.system.xp_sort = 0
it.system.default_diffLibre = 0
return it
})
incarnation.name = 'Réincarnation de ' + incarnation.name
incarnation.system = {
@@ -3002,12 +3002,57 @@ export class RdDActor extends RdDBaseActorSang {
'reve.reve.value': this.system.carac.reve.value,
subacteurs: { suivants: [], montures: [], vehicules: [] },
}
incarnation = await RdDBaseActor.create(incarnation);
await incarnation.deleteEmbeddedDocuments('ActiveEffect', incarnation.getEmbeddedCollection("ActiveEffect").map(it => it.id));
await incarnation.remiseANeuf();
incarnation.sheet.render(true);
incarnation = await RdDBaseActor.create(incarnation)
await incarnation.deleteEmbeddedDocuments('ActiveEffect', incarnation.getEmbeddedCollection("ActiveEffect").map(it => it.id))
await incarnation.remiseANeuf()
incarnation.sheet.render(true)
}
async repartitionArchetypeAleatoire() {
const nivArchetypeDisponibles = RdDItemCompetence.computeResumeArchetype(this.itemTypes[ITEM_TYPES.competence])
.filter(it => it.reste > 0)
function proba(nivDispo, niveauActuel) {
return niveauActuel > 0 ? (nivDispo.reste + 3) : nivDispo.reste
}
async function takeNiveauArchetypeRandom(niveauMin) {
const potential = nivArchetypeDisponibles.filter(it => it.niveau >= niveauMin)
const totalChances = potential.map(it => proba(it, niveauMin)).reduce(Misc.sum(), 0)
if (totalChances > 0) {
let random = await Misc.random(totalChances)
for (const selected of potential) {
if (selected.reste > 0) {
const chances = proba(selected, niveauMin)
if (random <= chances) {
selected.nombre++
selected.reste--
return selected.niveau
}
random -= chances
}
}
}
return Math.max(0, niveauMin)
}
const compsByNiveau = Misc.classify(
this.itemTypes[ITEM_TYPES.competence].filter(it => it.system.niveau_archetype <= 0),
it => Math.max(0, it.system.niveau))
const niveaux = Object.keys(compsByNiveau).sort(Misc.descending())
const updates = []
for (let i = 0; i < niveaux.length; i++) {
const competencesDuNiveau = Misc.shuffled(compsByNiveau[niveaux[i]])
for (let j = 0; j < competencesDuNiveau.length; j++) {
const competence = competencesDuNiveau[j]
const nivArchetype = await takeNiveauArchetypeRandom(competence.system.niveau)
updates.push({ _id: competence.id, 'system.niveau_archetype': nivArchetype })
}
}
await this.updateEmbeddedDocuments('Item', updates)
}
/* -------------------------------------------- */
async _rollArtV2(oeuvreId) {