Amélioration sur les voies de Draconic

- Ne pas proposer les voies de Draconic à -11 pour lire un signe
  draconic ou lancer un sort
- Trier les voies par ordre décroissant pour le sorts à voies multiples
- Les rencontres et les maîtrises dans les TMR peuvent être vaincues
  sans draconic si les voies sont négatives
This commit is contained in:
2026-07-10 19:26:34 +02:00
parent bbbc817e5f
commit 000e16f8b7
9 changed files with 36 additions and 28 deletions
+5 -2
View File
@@ -4,8 +4,11 @@
- suppression du type de TMR "Inconnu" des feuilles de création de signes draconiques (ce type sert uniquement pour le cas où une case saisie à la main est incorrecte)
- les jets de dés /rdd utilisent le mode de visibilité sélectionné
- Draconic
- Ne pas proposer les voies de Draconic à -11 pour lire un signe draconic
- Voies de Draconic
- Ne pas proposer les voies de Draconic à -11 pour lire un signe draconic ou lancer un sort
- Trier les voies par ordre décroissant pour le sorts à voies multiples
- Les rencontres et les maîtrises dans les TMR peuvent être vaincues sans
draconic si les voies sont négatives
## 13.0.47 - Les goûts et les couleurs d'Illisys
+1 -1
View File
@@ -106,7 +106,7 @@ export class RdDActorSheet extends RdDBaseActorSangSheet {
montures: this.actor.listeMontures(),
suivants: this.actor.listeSuivants()
}
if (this.actor.getBestDraconic().system.niveau > -11 && !this.actor.isHautRevant()) {
if (this.actor.getDraconics().find(it => it.system.niveau > -11) && !this.actor.isHautRevant()) {
ui.notifications.error(`${this.actor.name} a des compétences draconiques, mais pas le don de Haut-Rêve!
<br>Ajoutez-lui la tête "Don de Haut-Rêve" pour lui permettre d'utiliser ses compétences et d'accéder aux terres médianes du rêve`);
}
+3 -4
View File
@@ -41,7 +41,7 @@ import { RdDItemCompetence } from "./item-competence.js";
import { RdDItemSigneDraconique } from "./item/signedraconique.js";
import { RdDRencontre } from "./item/rencontre.js";
import { DialogSelect } from "./dialog-select.js";
import { CATEGORIES_COMPETENCES, PAS_DE_DRACONIC, POSSESSION_SANS_DRACONIC } from "./item/base-items.js";
import { CATEGORIES_COMPETENCES, PAS_DE_DRACONIC, SANS_DRACONIC } from "./item/base-items.js";
import { RdDRollResult } from "./rdd-roll-result.js";
import { RdDInitiative } from "./initiative.mjs";
@@ -165,10 +165,9 @@ export class RdDActor extends RdDBaseActorSang {
? this.itemTypes[ITEM_TYPES.competence].filter(it => it.system.categorie == CATEGORIES_COMPETENCES.draconic.key)
: []
}
getBestDraconic() { return foundry.utils.duplicate([...this.getDraconics(), PAS_DE_DRACONIC].sort(Misc.descending(it => it.system.niveau)).find(it => true)) }
getConjurationNaturelle() {
return new RdDItemCompetence(POSSESSION_SANS_DRACONIC)
return new RdDItemCompetence(SANS_DRACONIC)
}
isForceInsuffisante(forceRequise) {
@@ -694,7 +693,7 @@ export class RdDActor extends RdDBaseActorSang {
const rencontre = await game.system.rdd.rencontresTMR.getReveDeDragon(force);
let rollData = {
actor: this,
competence: this.getDraconicOuPossession().find(it => true),
competence: this.getBestDraconic(),
canClose: false,
rencontre: rencontre,
tmr: true,
+7 -6
View File
@@ -22,7 +22,7 @@ import { DialogValidationEncaissement } from "../dialog-validation-encaissement.
import { RdDCombat } from "../rdd-combat.js";
import { RdDEmpoignade } from "../rdd-empoignade.js";
import { RdDPossession } from "../rdd-possession.js";
import { BASE_CORPS_A_CORPS, BASE_ESQUIVE, CATEGORIES_COMPETENCES_CREATURES } from "../item/base-items.js";
import { BASE_CORPS_A_CORPS, BASE_ESQUIVE, CATEGORIES_COMPETENCES_CREATURES, SANS_DRACONIC } from "../item/base-items.js";
import { RollDataAjustements } from "../rolldata-ajustements-v1.js";
import { MappingCreatureArme } from "../item/mapping-creature-arme.mjs";
import RollDialog from "../roll/roll-dialog.mjs";
@@ -102,17 +102,18 @@ export class RdDBaseActorReve extends RdDBaseActor {
}
getDraconics() { return [] }
getDraconicOuPossession() {
getDraconicOuNaturel(options = {possession: false}) {
return [
...this.getDraconics(),
...this.itemTypes[ITEM_TYPES.competencecreature].filter(it => it.isCompetencePossession()),
this.getConjurationNaturelle()
options.possession ? this.getConjurationNaturelle() : SANS_DRACONIC
].sort(Misc.descending(it => it.system.niveau));
}
getConjurations() {
return this.getDraconicOuPossession()
.map(it => this.toActionConjuration(it))
getBestDraconic(options = {possession: false}) {
return this.getDraconicOuNaturel(options)
.find(it => true)
}
getConjurationNaturelle() {
+15 -10
View File
@@ -70,20 +70,25 @@ export class RdDItemSort extends RdDItem {
static diffReve(sort) { return RdDItemSort.toVar((sort.system.difficulte.match(/\-?(\d)+/) ? 'R' : 'R ') + sort.system.difficulte) }
static coutReve(sort) { return RdDItemSort.toVar((Number.isInteger(sort.system.ptreve) || sort.system.ptreve.match(/(\d)+\+?/) ? 'r' : 'r ') + sort.system.ptreve) }
static getDraconicsSort(competencesDraconic, sort) {
// se baser sur la voie du sort?
switch (Grammar.toLowerCaseNoAccent(sort.name)) {
case "lecture d'aura":
case "detection d'aura":
return competencesDraconic
case "annulation de magie":
return competencesDraconic.filter(it => !RdDItemCompetence.isThanatos(it))
function getVoies() {
switch (Grammar.toLowerCaseNoAccent(sort.name)) {
case "lecture d'aura":
case "detection d'aura":
return competencesDraconic
case "annulation de magie":
return competencesDraconic.filter(it => !RdDItemCompetence.isThanatos(it))
default:
return sort.system.draconic.split('/').map(voie => RdDItemCompetence.getVoieDraconic(competencesDraconic, voie))
}
}
const voies = sort.system.draconic.split('/')
return voies.map(voie => RdDItemCompetence.getVoieDraconic(competencesDraconic, voie))
return getVoies()
.filter(it => it.system.niveau > -11)
.sort(Misc.descending(it => it.system.niveau))
}
static getBestDraconicSort(competencesDraconic, sort) {
return RdDItemSort.getDraconicsSort(competencesDraconic, sort).sort(Misc.descending(it => it.system.niveau)).find(it => true)
return RdDItemSort.getDraconicsSort(competencesDraconic, sort).find(it => true)
}
static getOrdreCode(code) {
+1 -1
View File
@@ -23,7 +23,7 @@ export const CATEGORIES_COMPETENCES_CREATURES = {
possession: { key: 'possession', base: 0, label: "Possession" },
}
export const POSSESSION_SANS_DRACONIC = {
export const SANS_DRACONIC = {
name: 'Sans draconic',
type: ITEM_TYPES.competence,
img: RDD_CONFIG.icons.possession,
+1 -1
View File
@@ -95,7 +95,7 @@ export class RdDPossession {
}
static selectCompetenceDraconicOuPossession(rollData, rollingActor) {
rollData.competence = rollingActor.getDraconicOuPossession().find(it => true);
rollData.competence = rollingActor.getBestDraconic({possession: true})
if (rollingActor.isCreatureOuEntite()) {
rollData.carac = rollingActor.system.carac
rollData.competence.system.defaut_carac = CARACS.REVE
+2 -2
View File
@@ -682,7 +682,7 @@ export class RdDTMRDialog extends Dialog {
if (this.isCaseHumide(tmr)) {
let rollData = {
actor: this.actor,
competence: foundry.utils.duplicate(this.actor.getBestDraconic()),
competence: this.actor.getBestDraconic(),
tmr: tmr,
canClose: false,
diffLibre: -7,
@@ -807,7 +807,7 @@ export class RdDTMRDialog extends Dialog {
async _conquerir(tmr, options) {
let rollData = {
actor: this.actor,
competence: foundry.utils.duplicate(this.actor.getBestDraconic()),
competence: this.actor.getBestDraconic(),
tmr: tmr,
canClose: options.canClose ?? false,
diffLibre: options.difficulte ?? -7,
+1 -1
View File
@@ -30,7 +30,7 @@ export class RollPartPossession extends RollPartSelect {
choices(refs) { return refs.all }
$getActorConjurations(rollData) {
const competences = rollData.active.actor.getDraconicOuPossession()
const competences = rollData.active.actor.getBestDraconic({possession: true})
return competences.map(RollPartPossession.extractPossession)
}