forked from public/foundryvtt-reve-de-dragon
Bouton "don de haut-rêve"
Pour permettre au MJ de rendre un personnage haut rêvant sans avoir à chercher dans les compendiums
This commit is contained in:
@ -5,12 +5,12 @@ import { RdDBaseActorReve } from "../actor/base-actor-reve.js";
|
||||
import { Grammar } from "../grammar.js";
|
||||
import { Misc } from "../misc.js";
|
||||
import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
|
||||
import { RdDItemTete } from "../item/tete.js";
|
||||
|
||||
const WHITESPACES = "\\s+"
|
||||
const NUMERIC = "[\\+\\-]?\\d+"
|
||||
const NUMERIC_VALUE = "(?<value>" + NUMERIC + ")"
|
||||
|
||||
const XREGEXP_NAME = "(?<name>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+)"
|
||||
const XREGEXP_COMP_CREATURE = WHITESPACES + "(?<carac>\\d+)"
|
||||
+ WHITESPACES + NUMERIC_VALUE
|
||||
+ "(" + WHITESPACES + "(?<init>\\d+)?\\s+?(?<dommages>[\\+\\-]?\\d+)?" + ")?"
|
||||
@ -23,10 +23,11 @@ const compParser = {
|
||||
}
|
||||
|
||||
const XREGEXP_SORT_VOIE = "[OHNT\\/]+"
|
||||
const XREGEXP_SORT_NAME = "(?<name>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-']+)"
|
||||
const XREGEXP_SORT_CASE = "\\((?<case>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+)\\)";
|
||||
|
||||
const XREGEXP_SORT = "(" + XREGEXP_SORT_VOIE
|
||||
+ WHITESPACES + XREGEXP_NAME
|
||||
+ WHITESPACES + XREGEXP_SORT_NAME
|
||||
+ WHITESPACES + XREGEXP_SORT_CASE
|
||||
+ WHITESPACES + "R(?<diff>([\\-\\d]+|(\\w|\\s)+))"
|
||||
+ WHITESPACES + "r(?<reve>(\\d+(\\+)?|\\s\\w+))"
|
||||
@ -104,7 +105,7 @@ export class RdDStatBlockParser {
|
||||
return "vaisseau";
|
||||
}
|
||||
|
||||
static async parseStatBlock(statString, type = "npc") {
|
||||
static async parseStatBlock(statString) {
|
||||
|
||||
//statString = statBlock03;
|
||||
if (!statString) {
|
||||
@ -122,10 +123,10 @@ export class RdDStatBlockParser {
|
||||
statString = statString.trim();
|
||||
|
||||
// TODO: check for entite
|
||||
let actorType = RdDStatBlockParser.parseActorType(statString);
|
||||
let type = RdDStatBlockParser.parseActorType(statString);
|
||||
|
||||
// Now start carac
|
||||
let actorData = foundry.utils.deepClone(game.model.Actor[actorType]);
|
||||
let actorData = foundry.utils.deepClone(game.model.Actor[type]);
|
||||
for (let key in actorData.carac) {
|
||||
let caracDef = actorData.carac[key];
|
||||
// Parse the stat string for each caracteristic
|
||||
@ -136,7 +137,7 @@ export class RdDStatBlockParser {
|
||||
}
|
||||
|
||||
// If creature we need to setup additionnal fields
|
||||
switch (actorType) {
|
||||
switch (type) {
|
||||
case "creature":
|
||||
RdDStatBlockParser.parseCreature(statString, actorData)
|
||||
break
|
||||
@ -147,14 +148,14 @@ export class RdDStatBlockParser {
|
||||
|
||||
let items = [];
|
||||
// Get skills from compendium
|
||||
const competences = await SystemCompendiums.getCompetences(actorType);
|
||||
const competences = await SystemCompendiums.getCompetences(type);
|
||||
//console.log("Competences : ", competences);
|
||||
for (let comp of competences) {
|
||||
let compMatch = XRegExp.exec(statString, XRegExp(comp.name + compParser[actorType], 'giu'));
|
||||
let compMatch = XRegExp.exec(statString, XRegExp(comp.name + compParser[type], 'giu'));
|
||||
if (compMatch) {
|
||||
comp = comp.toObject()
|
||||
comp.system.niveau = Number(compMatch.value);
|
||||
if (actorType == "creature" || actorType == "entite") {
|
||||
if (type == "creature" || type == "entite") {
|
||||
comp.system.carac_value = Number(compMatch.carac);
|
||||
if (compMatch.dommages != undefined) {
|
||||
comp.system.dommages = Number(compMatch.dommages);
|
||||
@ -163,7 +164,7 @@ export class RdDStatBlockParser {
|
||||
}
|
||||
items.push(comp)
|
||||
}
|
||||
else if (actorType == "personnage") {
|
||||
else if (type == "personnage") {
|
||||
comp = comp.toObject()
|
||||
items.push(comp)
|
||||
}
|
||||
@ -213,82 +214,89 @@ export class RdDStatBlockParser {
|
||||
}
|
||||
}
|
||||
|
||||
// Attemp to detect spell
|
||||
let hautRevant = false
|
||||
let sorts = await SystemCompendiums.getWorldOrCompendiumItems("sort", "sorts-oniros")
|
||||
sorts = sorts.concat(await SystemCompendiums.getWorldOrCompendiumItems("sort", "sorts-hypnos"))
|
||||
sorts = sorts.concat(await SystemCompendiums.getWorldOrCompendiumItems("sort", "sorts-narcos"))
|
||||
sorts = sorts.concat(await SystemCompendiums.getWorldOrCompendiumItems("sort", "sorts-thanatos"))
|
||||
|
||||
if (type == "personnage") {
|
||||
// Attemp to detect spell
|
||||
await RdDStatBlockParser.parseHautReve(statString, items);
|
||||
|
||||
RdDStatBlockParser.parsePersonnage(statString, actorData);
|
||||
}
|
||||
|
||||
let name = RdDStatBlockParser.extractName(type, statString);
|
||||
|
||||
let newActor = RdDBaseActorReve.create({ name, type: type, system: actorData, items });
|
||||
|
||||
// DUmp....
|
||||
console.log(actorData);
|
||||
}
|
||||
|
||||
static async parseHautReve(statString, items) {
|
||||
let hautRevant = false;
|
||||
let sorts = await SystemCompendiums.getWorldOrCompendiumItems("sort", "sorts-oniros");
|
||||
sorts = sorts.concat(await SystemCompendiums.getWorldOrCompendiumItems("sort", "sorts-hypnos"));
|
||||
sorts = sorts.concat(await SystemCompendiums.getWorldOrCompendiumItems("sort", "sorts-narcos"));
|
||||
sorts = sorts.concat(await SystemCompendiums.getWorldOrCompendiumItems("sort", "sorts-thanatos"));
|
||||
|
||||
XRegExp.forEach(statString, XRegExp(XREGEXP_SORT, 'giu'),
|
||||
function (matchSort, i) {
|
||||
let sort = sorts.find(s => Grammar.equalsInsensitive(s.name, matchSort.name))
|
||||
let sort = sorts.find(s => Grammar.equalsInsensitive(s.name, matchSort.name));
|
||||
if (sort) {
|
||||
hautRevant = true
|
||||
hautRevant = true;
|
||||
sort = sort.toObject();
|
||||
if (matchSort.bonus && matchSort.bonuscase) {
|
||||
sort.system.bonuscase = `${matchSort.bonuscase}:${matchSort.bonus}`
|
||||
sort.system.bonuscase = `${matchSort.bonuscase}:${matchSort.bonus}`;
|
||||
}
|
||||
items.push(sort);
|
||||
}
|
||||
});
|
||||
|
||||
if (hautRevant) {
|
||||
let tetes = await SystemCompendiums.getWorldOrCompendiumItems("tete", "tetes-de-dragon-pour-tous-personnages")
|
||||
let donHR = tetes.find(t => Grammar.equalsInsensitive(t.name, "Don de Haut-Rêve"))
|
||||
const donHR = await RdDItemTete.teteDonDeHautReve();
|
||||
if (donHR) {
|
||||
items.push(donHR.toObject());
|
||||
}
|
||||
}
|
||||
if (actorType == "personnage") {
|
||||
}
|
||||
|
||||
let feminin = XRegExp.exec(statString, XRegExp("né(?<value>e?) à", 'giu'));
|
||||
actorData.sexe = (feminin?.value == 'e') ? 'féminin' : 'masculin'
|
||||
static parsePersonnage(statString, actorData) {
|
||||
let feminin = XRegExp.exec(statString, XRegExp("né(?<value>e?) à", 'giu'));
|
||||
actorData.sexe = (feminin?.value == 'e') ? 'féminin' : 'masculin';
|
||||
|
||||
// Get hour name : heure du XXXXX
|
||||
let heure = XRegExp.exec(statString, XRegExp("heure (du|de la|des|de l\')\\s*(?<value>[A-Za-zÀ-ÖØ-öø-ÿ\\s]+),", 'giu'));
|
||||
actorData.heure = this.getHeureKey(heure?.value || "Vaisseau");
|
||||
// Get hour name : heure du XXXXX
|
||||
let heure = XRegExp.exec(statString, XRegExp("heure (du|de la|des|de l\')\\s*(?<value>[A-Za-zÀ-ÖØ-öø-ÿ\\s]+),", 'giu'));
|
||||
actorData.heure = this.getHeureKey(heure?.value || "Vaisseau");
|
||||
|
||||
// Get age
|
||||
let age = XRegExp.exec(statString, XRegExp("(?<value>\\d+) ans", 'giu'));
|
||||
if (age?.value) {
|
||||
actorData.age = Number(age.value);
|
||||
}
|
||||
// Get height
|
||||
let taille = XRegExp.exec(statString, XRegExp("(?<value>\\d+m\\d+)", 'giu'));
|
||||
if (taille?.value) {
|
||||
actorData.taille = taille.value;
|
||||
}
|
||||
// Get weight
|
||||
let poids = XRegExp.exec(statString, XRegExp("(?<value>\\d+) kg", 'giu'));
|
||||
if (poids?.value) {
|
||||
actorData.poids = poids.value;
|
||||
}
|
||||
// Get cheveux
|
||||
let cheveux = XRegExp.exec(statString, XRegExp("kg,\\s+(?<value>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+),\\s+yeux", 'giu'));
|
||||
if (cheveux?.value) {
|
||||
actorData.cheveux = cheveux.value;
|
||||
}
|
||||
// Get yeux
|
||||
let yeux = XRegExp.exec(statString, XRegExp("yeux\\s+(?<value>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+), Beau", 'giu'));
|
||||
if (yeux?.value) {
|
||||
actorData.yeux = yeux.value;
|
||||
}
|
||||
|
||||
// Get beauty
|
||||
let beaute = XRegExp.exec(statString, XRegExp("beauté\\s+(?<value>\\d+)", 'giu'));
|
||||
if (beaute?.value) {
|
||||
actorData.beaute = Number(beaute.value);
|
||||
}
|
||||
// Get age
|
||||
let age = XRegExp.exec(statString, XRegExp("(?<value>\\d+) ans", 'giu'));
|
||||
if (age?.value) {
|
||||
actorData.age = Number(age.value);
|
||||
}
|
||||
// Get height
|
||||
let taille = XRegExp.exec(statString, XRegExp("(?<value>\\d+m\\d+)", 'giu'));
|
||||
if (taille?.value) {
|
||||
actorData.taille = taille.value;
|
||||
}
|
||||
// Get weight
|
||||
let poids = XRegExp.exec(statString, XRegExp("(?<value>\\d+) kg", 'giu'));
|
||||
if (poids?.value) {
|
||||
actorData.poids = poids.value;
|
||||
}
|
||||
// Get cheveux
|
||||
let cheveux = XRegExp.exec(statString, XRegExp("kg,\\s+(?<value>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+),\\s+yeux", 'giu'));
|
||||
if (cheveux?.value) {
|
||||
actorData.cheveux = cheveux.value;
|
||||
}
|
||||
// Get yeux
|
||||
let yeux = XRegExp.exec(statString, XRegExp("yeux\\s+(?<value>[A-Za-zÀ-ÖØ-öø-ÿ\\s\\-]+), Beau", 'giu'));
|
||||
if (yeux?.value) {
|
||||
actorData.yeux = yeux.value;
|
||||
}
|
||||
|
||||
// Name is all string before ', né'
|
||||
let name = RdDStatBlockParser.extractName(actorType, statString);
|
||||
|
||||
let newActor = RdDBaseActorReve.create({ name: name || "Importé", type: actorType, system: actorData, items: items });
|
||||
|
||||
// DUmp....
|
||||
console.log(actorData);
|
||||
// Get beauty
|
||||
let beaute = XRegExp.exec(statString, XRegExp("beauté\\s+(?<value>\\d+)", 'giu'));
|
||||
if (beaute?.value) {
|
||||
actorData.beaute = Number(beaute.value);
|
||||
}
|
||||
}
|
||||
|
||||
static parseCreature(statString, actorData) {
|
||||
@ -350,24 +358,17 @@ export class RdDStatBlockParser {
|
||||
|
||||
static extractName(actorType, statString) {
|
||||
switch (actorType) {
|
||||
case "personnage": return RdDStatBlockParser.extractNamePersonnage(statString);
|
||||
case "creature": return RdDStatBlockParser.extractNameCreature(statString);
|
||||
case "personnage":
|
||||
// Name is all string before first comma ','
|
||||
const namePersonnage = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\s\\d]+),", 'giu'));
|
||||
if (namePersonnage?.value) {
|
||||
return Misc.upperFirst(namePersonnage?.value);
|
||||
}
|
||||
}
|
||||
return RdDStatBlockParser.extractNameCreature(statString);
|
||||
}
|
||||
|
||||
static extractNamePersonnage(statString) {
|
||||
let name = XRegExp.exec(statString, XRegExp("(?<value>[\\p{Letter}\\s\\d]+),", 'giu'));
|
||||
if (!name?.value) {
|
||||
name = XRegExp.exec(statString, XRegExp("(?<value>.+)\\s+taille", 'giu'));
|
||||
}
|
||||
return Misc.upperFirst(name?.value || "Importé");
|
||||
}
|
||||
|
||||
static extractNameCreature(statString) {
|
||||
const name = XRegExp.exec(statString, XRegExp("(?<value>.+)\\s+taille", 'giu'));
|
||||
return Misc.upperFirst(name?.value || "Importé");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/************************************************************************************/
|
||||
|
Reference in New Issue
Block a user