Génération aléatoire d'archétype
This commit is contained in:
+60
-15
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user