adding techniques

This commit is contained in:
Vlyan
2021-12-05 15:39:12 +01:00
parent ee2a485ab6
commit 36795e7b48
3 changed files with 135 additions and 5 deletions

View File

@@ -24,6 +24,7 @@ export class CharacterGeneratorDialog extends FormApplication {
generateNarrative: true, generateNarrative: true,
generatePeculiarities: true, generatePeculiarities: true,
generateItems: true, generateItems: true,
generateTechniques: true,
generateSocial: true, generateSocial: true,
}; };
@@ -100,7 +101,12 @@ export class CharacterGeneratorDialog extends FormApplication {
}); });
// Update current Object with new data to keep selection // Update current Object with new data to keep selection
this.object = formData; // Get selected value from generator for random values
this.object = {
...formData,
clan: generator.data.clan,
gender: generator.data.gender,
};
// Update actor with selection // Update actor with selection
const updatedDatas = await generator.toActor(this.actor, formData); const updatedDatas = await generator.toActor(this.actor, formData);

View File

@@ -294,6 +294,7 @@ export class CharacterGenerator {
* @param {boolean} generateDemeanor If true generate Demeanor and rings affinities * @param {boolean} generateDemeanor If true generate Demeanor and rings affinities
* @param {boolean} generatePeculiarities If true generate Advantage and Disadvantage * @param {boolean} generatePeculiarities If true generate Advantage and Disadvantage
* @param {boolean} generateItems If true generate Armor, Weapons and Items * @param {boolean} generateItems If true generate Armor, Weapons and Items
* @param {boolean} generateTechniques If true generate Shuji, Katas...
* @param {boolean} generateNarrative If true generate Narrative and fluff * @param {boolean} generateNarrative If true generate Narrative and fluff
* @return {Promise<Object>} * @return {Promise<Object>}
*/ */
@@ -306,6 +307,7 @@ export class CharacterGenerator {
generateDemeanor = true, generateDemeanor = true,
generatePeculiarities = true, generatePeculiarities = true,
generateItems = true, generateItems = true,
generateTechniques = true,
generateNarrative = true, generateNarrative = true,
} = {} } = {}
) { ) {
@@ -342,7 +344,7 @@ export class CharacterGenerator {
} }
// Items types // Items types
if (generatePeculiarities || generateItems) { if (generatePeculiarities || generateItems || generateTechniques) {
const newItemsData = []; const newItemsData = [];
// Advantage / Disadvantage // Advantage / Disadvantage
@@ -355,6 +357,11 @@ export class CharacterGenerator {
await this._generateItems(actor, newItemsData); await this._generateItems(actor, newItemsData);
} }
// Techniques
if (generateTechniques) {
await this._generateTechniques(actor, newItemsData);
}
// Add to actor // Add to actor
if (newItemsData.length > 0) { if (newItemsData.length > 0) {
await actor.createEmbeddedDocuments("Item", newItemsData); await actor.createEmbeddedDocuments("Item", newItemsData);
@@ -441,8 +448,8 @@ export class CharacterGenerator {
await actor.deleteEmbeddedDocuments("Item", deleteIds); await actor.deleteEmbeddedDocuments("Item", deleteIds);
} }
// Add peculiarities // Add 1 each peculiarity
for (const pack of ["adversities", "distinctions", "passions"]) { for (const pack of ["adversities", "distinctions", "passions", "anxieties"]) {
const item = await CharacterGenerator._getItemFromPack(`l5r5e.core-peculiarities-${pack}`); const item = await CharacterGenerator._getItemFromPack(`l5r5e.core-peculiarities-${pack}`);
if (item) { if (item) {
newItemsData.push(foundry.utils.duplicate(item.data)); newItemsData.push(foundry.utils.duplicate(item.data));
@@ -460,7 +467,6 @@ export class CharacterGenerator {
async _generateItems(actor, newItemsData) { async _generateItems(actor, newItemsData) {
// Clear actor items // Clear actor items
const deleteIds = actor.data.items.filter((e) => ["armor", "weapon", "item"].includes(e.type)).map((e) => e.id); const deleteIds = actor.data.items.filter((e) => ["armor", "weapon", "item"].includes(e.type)).map((e) => e.id);
if (deleteIds.length > 0) { if (deleteIds.length > 0) {
await actor.deleteEmbeddedDocuments("Item", deleteIds); await actor.deleteEmbeddedDocuments("Item", deleteIds);
} }
@@ -496,6 +502,120 @@ export class CharacterGenerator {
} }
} }
/**
* Generate Techniques
* @param {ActorL5r5e} actor
* @param {DocumentData[]} newItemsData
* @return {Promise<void>}
* @private
*/
async _generateTechniques(actor, newItemsData) {
// Clear actor items
const deleteIds = actor.data.items.filter((e) => e.type === "technique").map((e) => e.id);
if (deleteIds.length > 0) {
await actor.deleteEmbeddedDocuments("Item", deleteIds);
}
const avgrv = this.data.avgRingsValue;
/**
* Techs config
*
* exemple: {
* probability: .7,
* skill: {
* grp_name: "scholar",
* value_min: 1,
* },
* qty: {
* min: 1,
* max: avgrv,
* },
* },
*/
const techCfg = {
kata: {
probability: 1,
skill: {
grp_name: "martial",
value_min: 1,
},
qty: {
min: 1,
max: avgrv,
},
},
kiho: {
probability: 0.1,
skill: {
grp_name: "martial",
value_min: 1,
},
},
ninjutsu: {
probability: 0.1,
skill: {
grp_name: "martial",
value_min: 1,
},
},
shuji: {
probability: 1,
qty: {
min: 1,
},
},
rituals: {
probability: 0.2,
},
maho: {
probability: 0.1,
},
invocations: {
probability: 0.3,
skill: {
grp_name: "scholar",
value_min: 1,
},
qty: {
min: 2,
max: Math.max(2, avgrv),
},
},
};
for (const pack in techCfg) {
const cfg = techCfg[pack];
// Minimum skill required (npc only for now)
if (!!cfg.skill && actor.data.data.skills[cfg.skill.grp_name] < cfg.skill.value_min) {
console.log("1");
continue;
}
console.log("2");
// Check probabilities to have more than min qty
let qtyMax = cfg.qty?.min ?? 0;
if (Math.random() < cfg.probability) {
qtyMax = CharacterGenerator._randomInt(cfg.qty?.min ?? 0, cfg.qty?.max ?? avgrv);
}
for (let qty = 0; qty < qtyMax; qty++) {
// Rank is limited by avgRingsValue
let item;
do {
item = await CharacterGenerator._getItemFromPack(`l5r5e.core-techniques-${pack}`);
} while (item && item.data.data.rank > avgrv);
if (item) {
// console.log('adding', pack, item.data.name);
newItemsData.push(foundry.utils.duplicate(item.data));
}
} // fr qty
} // fr techCfg
}
/** /**
* Generate Narrative fluff * Generate Narrative fluff
* @param {DocumentData.data} actorDatas * @param {DocumentData.data} actorDatas

View File

@@ -51,6 +51,10 @@
<input type="checkbox" name="generateItems" {{checked data.generateItems}} /> <input type="checkbox" name="generateItems" {{checked data.generateItems}} />
{{localize 'l5r5e.char_generator.items'}} {{localize 'l5r5e.char_generator.items'}}
</label> </label>
<label>
<input type="checkbox" name="generateTechniques" {{checked data.generateTechniques}} />
{{localize 'l5r5e.techniques.title'}}
</label>
<label> <label>
<input type="checkbox" name="generateNarrative" {{checked data.generateNarrative}} /> <input type="checkbox" name="generateNarrative" {{checked data.generateNarrative}} />
{{localize 'l5r5e.char_generator.narrative'}} {{localize 'l5r5e.char_generator.narrative'}}