Fix Import entités de cauchemar&créatures

- utiliser les carac liées au type d'entités
- fix: +dom&protection 0 ou négatifs
- fix compétences (qui peuvent ne pas avoir d'init)
This commit is contained in:
Vincent Vandemeulebrouck 2024-12-02 21:59:55 +01:00
parent ce8616c34e
commit a27e3894a0

View File

@ -4,6 +4,7 @@ import { SystemCompendiums } from "../settings/system-compendiums.js";
import { RdDBaseActorReve } from "../actor/base-actor-reve.js"; import { RdDBaseActorReve } from "../actor/base-actor-reve.js";
import { Grammar } from "../grammar.js"; import { Grammar } from "../grammar.js";
import { Misc } from "../misc.js"; import { Misc } from "../misc.js";
import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js";
/************************************************************************************/ /************************************************************************************/
// Some internal test strings // Some internal test strings
@ -291,17 +292,13 @@ export class RdDStatBlockParser {
// Remove all leading and trailing spaces // Remove all leading and trailing spaces
statString = statString.trim(); statString = statString.trim();
let actorType = "personnage";
// TODO: check for entite // TODO: check for entite
let perception = XRegExp.exec(statString, XRegExp("perception\\s+(?<value>\\d+)", 'giu')) let actorType = RdDStatBlockParser.parseActorType(statString);
if (perception?.value) {
actorType = "creature";
}
// Now start carac // Now start carac
let actorData = foundry.utils.deepClone(game.model.Actor[actorType]); let actorData = foundry.utils.deepClone(game.model.Actor[actorType]);
for (let key in game.model.Actor.personnage.carac) { for (let key in actorData.carac) {
let caracDef = game.model.Actor.personnage.carac[key]; let caracDef = actorData.carac[key];
// Parse the stat string for each caracteristic // Parse the stat string for each caracteristic
let carac = XRegExp.exec(statString, XRegExp(caracDef.label + "\\s+(?<value>\\d+)", 'giu')); let carac = XRegExp.exec(statString, XRegExp(caracDef.label + "\\s+(?<value>\\d+)", 'giu'));
if (carac?.value) { if (carac?.value) {
@ -310,29 +307,13 @@ export class RdDStatBlockParser {
} }
// If creature we need to setup additionnal fields // If creature we need to setup additionnal fields
if (actorType == "creature") { switch (actorType) {
let plusDom = XRegExp.exec(statString, XRegExp("\\+dom\\s+(?<value>\\+\\d+)", 'giu')); case "creature":
if (plusDom?.values) { RdDStatBlockParser.parseCreature(statString, actorData)
actorData.attributs.plusdom.value = Number(plusDom.value); break
} case "entite":
let protection = XRegExp.exec(statString, XRegExp("protection\\s+(?<value>\\d+)", 'giu')); RdDStatBlockParser.parseEntite(statString, actorData)
if (protection?.value) { break
actorData.attributs.protection.value = Number(protection.value);
}
let endurance = XRegExp.exec(statString, XRegExp("endurance\\s+(?<value>\\d+)", 'giu'));
if (endurance?.value) {
actorData.sante.endurance.value = Number(endurance.value);
actorData.sante.endurance.max = Number(endurance.value);
}
let vie = XRegExp.exec(statString, XRegExp("vie\\s+(?<value>\\d+)", 'giu'));
if (vie.value) {
actorData.sante.vie.value = Number(vie.value);
actorData.sante.vie.max = Number(vie.value);
}
let vitesse = XRegExp.exec(statString, XRegExp("vitesse\\s+(?<value>[\\d\\/]+)", 'giu'));
if (vitesse?.value) {
actorData.attributs.vitesse.value = vitesse.value;
}
} }
let items = []; let items = [];
@ -353,11 +334,8 @@ export class RdDStatBlockParser {
} }
} }
} }
if (actorType == "creature" && skill.init) { if (actorType == "personnage" || skill!= undefined){
items.push(comp); // Only selective push items.push(comp)
}
if (actorType == "personnage") {
items.push(comp); // Always push
} }
} }
@ -474,6 +452,63 @@ export class RdDStatBlockParser {
console.log(actorData); console.log(actorData);
} }
static parseCreature(statString, actorData) {
let plusDom = XRegExp.exec(statString, XRegExp("\\+dom\\s+(?<value>[\\+\\-]?\\d+)", 'giu'));
if (plusDom?.values) {
actorData.attributs.plusdom.value = Number(plusDom.value);
}
let protection = XRegExp.exec(statString, XRegExp("protection\\s+(?<value>[\\-]?\\d+)", 'giu'));
if (protection?.value) {
actorData.attributs.protection.value = Number(protection.value);
}
let endurance = XRegExp.exec(statString, XRegExp("endurance\\s+(?<value>\\d+)", 'giu'));
if (endurance?.value) {
actorData.sante.endurance.value = Number(endurance.value);
actorData.sante.endurance.max = Number(endurance.value);
}
let vie = XRegExp.exec(statString, XRegExp("vie\\s+(?<value>\\d+)", 'giu'));
if (vie.value) {
actorData.sante.vie.value = Number(vie.value);
actorData.sante.vie.max = Number(vie.value);
}
let vitesse = XRegExp.exec(statString, XRegExp("vitesse\\s+(?<value>[\\d\\/]+)", 'giu'));
if (vitesse?.value) {
actorData.attributs.vitesse.value = vitesse.value;
}
}
static parseEntite(statString, actorData) {
let plusDom = XRegExp.exec(statString, XRegExp("\\+dom\\s+(?<value>[\\+\\-]?\\d+)", 'giu'));
if (plusDom?.values) {
actorData.attributs.plusdom.value = Number(plusDom.value);
}
actorData.definition.categorieentite = 'cauchemar'
actorData.definition.typeentite = ENTITE_NONINCARNE
let endurance = XRegExp.exec(statString, XRegExp("endurance\\s+(?<value>\\d+)", 'giu'));
if (endurance?.value) {
actorData.sante.endurance.value = Number(endurance.value);
actorData.sante.endurance.max = Number(endurance.value);
actorData.definition.typeentite = ENTITE_INCARNE
}
let vitesse = XRegExp.exec(statString, XRegExp("vitesse\\s+(?<value>[\\d\\/]+)", 'giu'));
if (vitesse?.value) {
actorData.attributs.vitesse.value = vitesse.value;
}
}
static parseActorType(statString) {
let niveau = XRegExp.exec(statString, XRegExp("Niveau\\s+(?<value>[\\+\\-]?\\d+)", 'giu'))
let perception = XRegExp.exec(statString, XRegExp("perception\\s+(?<value>\\d+)", 'giu'))
if (perception?.value) {
return "creature"
}
if (niveau?.value) {
return "entite"
}
return "personnage"
}
static extractName(actorType, statString) { static extractName(actorType, statString) {
switch (actorType) { switch (actorType) {
case "personnage": return RdDStatBlockParser.extractNamePersonnage(statString); case "personnage": return RdDStatBlockParser.extractNamePersonnage(statString);