Compare commits
No commits in common. "v10" and "fvtt-mournblade-10.0.1" have entirely different histories.
v10
...
fvtt-mourn
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
.history/
|
|
23
README.md
23
README.md
@ -1,23 +1,4 @@
|
|||||||
# Système Foundry pour Mournblade (French RPG, Titam France/Sombres Projets)
|
# fvtt-mournblade
|
||||||
|
|
||||||
## EN
|
FoundryVTT system for Mournblade from Sombres Projets
|
||||||
|
|
||||||
Unofficial system for Mournblade (French version from Titam France).
|
|
||||||
|
|
||||||
Books are mandatory to play and are available at : http://www.titam-france.fr
|
|
||||||
|
|
||||||
## FR
|
|
||||||
|
|
||||||
Système non-officiel pour le JDR Mournblade (Titam France).
|
|
||||||
|
|
||||||
Ce système a été autorisé par Le Département des Sombres Projets, merci à eux !
|
|
||||||
|
|
||||||
Les livres du jeu sont nécessaires pour jouer, et sont disponibles ici : http://www.titam-france.fr
|
|
||||||
|
|
||||||
# Credits
|
|
||||||
|
|
||||||
Mournblade, le jeu de rôle de Sword & Sorcery, is a property of Titam France/Sombres Projets.
|
|
||||||
|
|
||||||
# Developmement
|
|
||||||
|
|
||||||
LeRatierBretonnien
|
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 380 KiB |
201
lang/en.json
201
lang/en.json
@ -1,201 +0,0 @@
|
|||||||
{
|
|
||||||
"Adresse": "Agility",
|
|
||||||
"Clairvoyance": "Clarity",
|
|
||||||
"MNBL.abilities": "Gifts/Pacts",
|
|
||||||
"MNBL.activatedrunes": "Activated Runes",
|
|
||||||
"MNBL.addpredilection": "Add a specialization",
|
|
||||||
"MNBL.aimingbonus": "Aiming Bonus",
|
|
||||||
"MNBL.alignement": "Alignment",
|
|
||||||
"MNBL.all": "All",
|
|
||||||
"MNBL.allegiance": "Allegiance",
|
|
||||||
"MNBL.applydamage": "Apply damage/bonus/penalty",
|
|
||||||
"MNBL.aspect": "Aspect",
|
|
||||||
"MNBL.Assaut": "Smite",
|
|
||||||
"MNBL.attack": "Attack",
|
|
||||||
"MNBL.attackcapacity": "Offensive Ability",
|
|
||||||
"MNBL.attackmountbonus": "Mounted attacker vs ground defender (+5)",
|
|
||||||
"MNBL.attacks": "Attacks",
|
|
||||||
"MNBL.attribut": "Attribute",
|
|
||||||
"MNBL.attributes": "Attributes",
|
|
||||||
"MNBL.automalus": "Auto Penalty",
|
|
||||||
"MNBL.base": "Base",
|
|
||||||
"MNBL.beastslords": "Beast Lords",
|
|
||||||
"MNBL.bio": "Bio & Notes",
|
|
||||||
"MNBL.bonus": "Bonus",
|
|
||||||
"MNBL.candoublebonusskill": "Bonuses can be doubled (cf. Profession)",
|
|
||||||
"MNBL.chaos": "Chaos",
|
|
||||||
"MNBL.chaotictraits": "Chaotic Traits",
|
|
||||||
"MNBL.charge": "Charge",
|
|
||||||
"MNBL.consumed": "Consumed",
|
|
||||||
"MNBL.contain": "Contain the opponent",
|
|
||||||
"MNBL.creatureresourcecost": "Resource Cost (creatures)",
|
|
||||||
"MNBL.current": "Current",
|
|
||||||
"MNBL.currentmax": "Current Max",
|
|
||||||
"MNBL.damage": "Damage",
|
|
||||||
"MNBL.damagebonus": "Damage Bonus",
|
|
||||||
"MNBL.defense": "Defense",
|
|
||||||
"MNBL.defensebonus": "Defense Bonus",
|
|
||||||
"MNBL.defensecapacity": "Defensive Ability",
|
|
||||||
"MNBL.dice": "Dice",
|
|
||||||
"MNBL.difficulty": "Difficulty",
|
|
||||||
"MNBL.dirtyattack": "Cheap Shot",
|
|
||||||
"MNBL.disadvantagepositions": "Disadvantageous positions (Max bonus +15)",
|
|
||||||
"MNBL.disarm": "Disarm",
|
|
||||||
"MNBL.doubleD20": "Double d20 (1 Shard Point)",
|
|
||||||
"MNBL.dramaticfailure": "Dramatic Failure",
|
|
||||||
"MNBL.duration": "Duration",
|
|
||||||
"MNBL.easy": "Easy (5)",
|
|
||||||
"MNBL.eclat": "Shard",
|
|
||||||
"MNBL.elementslords": "Elemental Lords",
|
|
||||||
"MNBL.equipmentactions": "Equipment/Actions",
|
|
||||||
"MNBL.equipments": "Equipments",
|
|
||||||
"MNBL.equipped": "Equipped",
|
|
||||||
"MNBL.exp": "Experience",
|
|
||||||
"MNBL.eyes": "Eyes",
|
|
||||||
"MNBL.failure": "Failure",
|
|
||||||
"MNBL.feint": "Feint",
|
|
||||||
"MNBL.flee": "Flee",
|
|
||||||
"MNBL.formula": "Formula",
|
|
||||||
"MNBL.genre": "Gender",
|
|
||||||
"MNBL.gifts": "Gifts",
|
|
||||||
"MNBL.goodadventure": "Good Adventure",
|
|
||||||
"MNBL.hair": "Hair",
|
|
||||||
"MNBL.hard": "Hard (15)",
|
|
||||||
"MNBL.hascover": "Cover",
|
|
||||||
"MNBL.hazardous": "Tricky (20)",
|
|
||||||
"MNBL.health": "Health",
|
|
||||||
"MNBL.healthmalus": "Health Penalty",
|
|
||||||
"MNBL.heavycover": "Almost complete (-10)",
|
|
||||||
"MNBL.heroicsuccess": "Heroic Success",
|
|
||||||
"MNBL.highlanguage": "High Melnibonéan",
|
|
||||||
"MNBL.ignorearmor": "Ignore Armor",
|
|
||||||
"MNBL.ignorehealthmalus": "Ignore Health Penalty",
|
|
||||||
"MNBL.ignoresoulmalus": "Ignore Soul Penalty",
|
|
||||||
"MNBL.immobilize": "Immobilize",
|
|
||||||
"MNBL.insane": "Ridiculous (25)",
|
|
||||||
"MNBL.isdefense": "Defensive",
|
|
||||||
"MNBL.knockout": "Knock Out",
|
|
||||||
"MNBL.law": "Law",
|
|
||||||
"MNBL.legacy": "Legacy",
|
|
||||||
"MNBL.lessthanshort": "Less than short (10)",
|
|
||||||
"MNBL.lethal": "Lethal",
|
|
||||||
"MNBL.level": "Level",
|
|
||||||
"MNBL.lightcover": "Buckler or light (-2)",
|
|
||||||
"MNBL.longmore": "Long and more (25)",
|
|
||||||
"MNBL.longrange": "Long Range",
|
|
||||||
"MNBL.malus": "Penalty",
|
|
||||||
"MNBL.margin": "Margin",
|
|
||||||
"MNBL.medium": "Average (10)",
|
|
||||||
"MNBL.mediumcover": "Pavise or half (-5)",
|
|
||||||
"MNBL.mediummore": "Medium and more (20)",
|
|
||||||
"MNBL.mediumrange": "Medium Range",
|
|
||||||
"MNBL.meleethrowweapon": "Melee and Throwing Weapon",
|
|
||||||
"MNBL.meleeweapon": "Melee Weapon",
|
|
||||||
"MNBL.mode": "Mode",
|
|
||||||
"MNBL.modifier": "Modifiers",
|
|
||||||
"MNBL.modifiertype": "Modifier Type",
|
|
||||||
"MNBL.mounted": "Mounted",
|
|
||||||
"MNBL.nextactionmalus": "Penalty for next action",
|
|
||||||
"MNBL.nextattackbonus": "Bonus for next attack",
|
|
||||||
"MNBL.none": "None",
|
|
||||||
"MNBL.noneunknwon": "None/Unknown",
|
|
||||||
"MNBL.nonlethal": "Non-Lethal",
|
|
||||||
"MNBL.nonlethaldamage": "Non-Lethal Damage",
|
|
||||||
"MNBL.notarget": "No designated target",
|
|
||||||
"MNBL.origin": "Origin",
|
|
||||||
"MNBL.pacts": "Pacts",
|
|
||||||
"MNBL.points": "Points",
|
|
||||||
"MNBL.preciseattack": "Precision Attack",
|
|
||||||
"MNBL.predilections": "Specializations",
|
|
||||||
"MNBL.preferredhand": "Preferred Hand",
|
|
||||||
"MNBL.prerequisites": "Prerequisites",
|
|
||||||
"MNBL.price": "Price",
|
|
||||||
"MNBL.profession": "Profession",
|
|
||||||
"MNBL.pronounced": "Spoken",
|
|
||||||
"MNBL.pronouncedrune": "Spoken Rune",
|
|
||||||
"MNBL.pronouncerune": "Speak the rune",
|
|
||||||
"MNBL.protections": "Protections",
|
|
||||||
"MNBL.puremadness": "Insane (30)",
|
|
||||||
"MNBL.quantity": "Quantity",
|
|
||||||
"MNBL.range": "Range",
|
|
||||||
"MNBL.rarity": "Rarity",
|
|
||||||
"MNBL.registeredmodifiers": "Registered Modifiers",
|
|
||||||
"MNBL.reloadduration": "Reload Time",
|
|
||||||
"MNBL.ressources": "Resources",
|
|
||||||
"MNBL.roll": "Roll",
|
|
||||||
"MNBL.runes": "Runes",
|
|
||||||
"MNBL.runningtarget": "Running target (-5/-10 depending on range)",
|
|
||||||
"MNBL.shootmodifier": "Shooting Modifiers",
|
|
||||||
"MNBL.shootweapon": "Shoot Weapon",
|
|
||||||
"MNBL.shortmore": "Short and more (10)",
|
|
||||||
"MNBL.shortrange": "Short Range",
|
|
||||||
"MNBL.size": "Size",
|
|
||||||
"MNBL.skill": "Skill",
|
|
||||||
"MNBL.skills": "Skills",
|
|
||||||
"MNBL.smallroomtarget": "Target in confined space (+5)",
|
|
||||||
"MNBL.soul": "Soul",
|
|
||||||
"MNBL.soulmalus": "Soul Penalty",
|
|
||||||
"MNBL.soulmultiplier": "Soul Multiplier",
|
|
||||||
"MNBL.soulpoints": "Soul Points",
|
|
||||||
"MNBL.specialactions": "Special Actions",
|
|
||||||
"MNBL.specialweapon": "Special (ability/gift)",
|
|
||||||
"MNBL.speciestrait": "Species Trait",
|
|
||||||
"MNBL.speed": "Speed",
|
|
||||||
"MNBL.success": "Success",
|
|
||||||
"MNBL.target": "Target",
|
|
||||||
"MNBL.targetbelow": "Target below (+5)",
|
|
||||||
"MNBL.targetcantmove": "Target immobilized (+5)",
|
|
||||||
"MNBL.targetdefense": "Opponent's Defense",
|
|
||||||
"MNBL.targetground": "Target on the ground (+5)",
|
|
||||||
"MNBL.targetseeshoot": "Target is aware of the shot",
|
|
||||||
"MNBL.tendancies": "Tendencies",
|
|
||||||
"MNBL.throwweapon": "Throwing Weapon",
|
|
||||||
"MNBL.totalprotection": "Total Protection",
|
|
||||||
"MNBL.traced": "Written",
|
|
||||||
"MNBL.tracedrune": "Written Rune",
|
|
||||||
"MNBL.tracerune": "Write the rune",
|
|
||||||
"MNBL.treasuremoney": "Treasures and Money",
|
|
||||||
"MNBL.twohands": "Two-handed",
|
|
||||||
"MNBL.type": "Type",
|
|
||||||
"MNBL.unarmedtarget": "Unarmed target (+5)",
|
|
||||||
"MNBL.unit": "Unit",
|
|
||||||
"MNBL.use": "Use",
|
|
||||||
"MNBL.usedpredilection": "Used Predilection",
|
|
||||||
"MNBL.value": "Value",
|
|
||||||
"MNBL.weapon": "Weapon",
|
|
||||||
"MNBL.weaponbonusattack": "Handling Bonus (offensive)",
|
|
||||||
"MNBL.weaponbonusdefense": "Handling Bonus (defensive)",
|
|
||||||
"MNBL.weapons": "Weapons",
|
|
||||||
"MNBL.weaponscapacities": "Weapons/Abilities",
|
|
||||||
"MNBL.weapontype": "Weapon Type",
|
|
||||||
"MNBL.weight": "Weight",
|
|
||||||
"Présence": "Presence",
|
|
||||||
"Puissance": "Might",
|
|
||||||
"Trempe": "Mettle",
|
|
||||||
"TYPES": {
|
|
||||||
"Actor": {
|
|
||||||
"creature": "Creature",
|
|
||||||
"personnage": "Character"
|
|
||||||
},
|
|
||||||
"Item": {
|
|
||||||
"arme": "Weapon",
|
|
||||||
"bouclier": "Shield",
|
|
||||||
"capacite": "Ability",
|
|
||||||
"competence": "Skill",
|
|
||||||
"don": "Gifts",
|
|
||||||
"equipement": "Equipment",
|
|
||||||
"heritage": "Background",
|
|
||||||
"metier": "Profession",
|
|
||||||
"modifier": "Modifier",
|
|
||||||
"monnaie": "Currency",
|
|
||||||
"origine": "Origin",
|
|
||||||
"pacte": "Pacts",
|
|
||||||
"protection": "Protections",
|
|
||||||
"rune": "Rune",
|
|
||||||
"runeeffect": "Rune Effect",
|
|
||||||
"tendance": "Signs of Chaos",
|
|
||||||
"traitchaotique": "Background",
|
|
||||||
"traitespece": "Species Trait"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
213
lang/fr.json
213
lang/fr.json
@ -1,213 +0,0 @@
|
|||||||
{
|
|
||||||
"TYPES": {
|
|
||||||
"Actor": {
|
|
||||||
"personnage": "Personnage",
|
|
||||||
"creature": "Créature"
|
|
||||||
},
|
|
||||||
"Item": {
|
|
||||||
"arme": "Arme",
|
|
||||||
"competence": "Compétence",
|
|
||||||
"protection": "Protection",
|
|
||||||
"pacte": "Pacte",
|
|
||||||
"traitchaotique": "Trait Chaotique",
|
|
||||||
"monnaie": "Monnaie",
|
|
||||||
"don": "Don",
|
|
||||||
"tendance": "Tendance",
|
|
||||||
"rune": "Rune",
|
|
||||||
"equipement": "Equipement",
|
|
||||||
"capacite": "Capacité",
|
|
||||||
"origine": "Origine",
|
|
||||||
"heritage": "Héritage",
|
|
||||||
"metier": "Métier",
|
|
||||||
"runeeffect": "Effet de Rune",
|
|
||||||
"bouclier": "Bouclier",
|
|
||||||
"modifier": "Modificateur",
|
|
||||||
"traitespece": "Trait d'Espèce"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Adresse": "Adresse",
|
|
||||||
"Puissance": "Puissance",
|
|
||||||
"Clairvoyance": "Clairvoyance",
|
|
||||||
"Présence": "Présence",
|
|
||||||
"Trempe": "Trempe",
|
|
||||||
|
|
||||||
"MNBL.assaut": "Assaut",
|
|
||||||
"MNBL.preciseattack": "Attaque Précise",
|
|
||||||
"MNBL.feint": "Feinte",
|
|
||||||
"MNBL.dirtyattack": "Coup Bas",
|
|
||||||
"MNBL.charge": "Charger",
|
|
||||||
"MNBL.contain": "Contenir l'adversaire",
|
|
||||||
"MNBL.disarm": "Désarmer",
|
|
||||||
|
|
||||||
"MNBL.none": "Aucun",
|
|
||||||
"MNBL.lightcover": "Rondache ou léger (-2)",
|
|
||||||
"MNBL.mediumcover": "Pavois ou à moitié (-5)",
|
|
||||||
"MNBL.heavycover": "Quasi complet (-10)",
|
|
||||||
"MNBL.roll": "Jet",
|
|
||||||
"MNBL.defensecapacity": "Capacité défensive",
|
|
||||||
"MNBL.attackcapacity": "Capacité offensive",
|
|
||||||
|
|
||||||
"MNBL.lessthanshort": "Moins que courte (10)",
|
|
||||||
"MNBL.shortmore": "Courte et + (10)",
|
|
||||||
"MNBL.mediummore": "Moyenne et + (20)",
|
|
||||||
"MNBL.longmore": "Longue et + (25)",
|
|
||||||
|
|
||||||
"MNBL.noneunknwon": "Aucune/Inconnue",
|
|
||||||
"MNBL.easy": "Facile (5)",
|
|
||||||
"MNBL.medium": "Moyenne (10)",
|
|
||||||
"MNBL.hard": "Ardue (15)",
|
|
||||||
"MNBL.hazardous": "Hasardeuse (20)",
|
|
||||||
"MNBL.insane": "Insensée (25)",
|
|
||||||
"MNBL.puremadness": "Pure Folie (30)",
|
|
||||||
|
|
||||||
"MNBL.pronouncerune": "Prononcer la rune",
|
|
||||||
"MNBL.tracerune": "Tracer la rune",
|
|
||||||
"MNBL.pronounced": "Prononcée",
|
|
||||||
"MNBL.traced": "Tracée",
|
|
||||||
|
|
||||||
"MNBL.meleeweapon": "Arme de contact",
|
|
||||||
"MNBL.meleethrowweapon": "Arme de contact et de Jet",
|
|
||||||
"MNBL.throwweapon": "Arme de Lancer",
|
|
||||||
"MNBL.shootweapon": "Arme de Tir",
|
|
||||||
"MNBL.specialweapon": "Spécial (capacité/don)",
|
|
||||||
|
|
||||||
"MNBL.all": "Tous",
|
|
||||||
"MNBL.beastslords": "Seigneurs des Bêtes",
|
|
||||||
"MNBL.elementslords": "Seigneurs Elementaires",
|
|
||||||
|
|
||||||
"MNBL.law": "Loi",
|
|
||||||
"MNBL.chaos": "Chaos",
|
|
||||||
"MNBL.level": "Niveau",
|
|
||||||
"MNBL.points": "Points",
|
|
||||||
"MNBL.aspect": "Aspect",
|
|
||||||
"MNBL.margin": "Marge",
|
|
||||||
"MNBL.goodadventure" : "Bonne Aventure",
|
|
||||||
"MNBL.base": "Base",
|
|
||||||
"MNBL.current": "Actuelle",
|
|
||||||
"MNBL.alignement" : "Alignement",
|
|
||||||
"MNBL.eclat": "Eclat",
|
|
||||||
"MNBL.exp": "Expérience",
|
|
||||||
"MNBL.attributes": "Attributs",
|
|
||||||
"MNBL.skills": "Compétences",
|
|
||||||
"MNBL.abilities": "Dons/Pactes",
|
|
||||||
"MNBL.equipmentactions": "Equipements/Actions",
|
|
||||||
"MNBL.bio": "Bio&Notes",
|
|
||||||
"MNBL.health": "Santé",
|
|
||||||
"MNBL.bonus": "Bonus",
|
|
||||||
"MNBL.malus": "Malus",
|
|
||||||
"MNBL.nonlethal": "Non Létaux",
|
|
||||||
"MNBL.lethal": "Létaux",
|
|
||||||
"MNBL.automalus" : "Malus Auto",
|
|
||||||
"MNBL.soul": "Ame",
|
|
||||||
"MNBL.currentmax": "Max Actuel",
|
|
||||||
"MNBL.consumed": "Consommé",
|
|
||||||
"MNBL.damagebonus": "B. Dégats",
|
|
||||||
"MNBL.speed": "Vitesse",
|
|
||||||
"MNBL.defense": "Défense",
|
|
||||||
"MNBL.totalprotection": "Protection Totale",
|
|
||||||
"MNBL.modifier": "Modificateurs",
|
|
||||||
"MNBL.type": "Type",
|
|
||||||
"MNBL.value": "Valeur",
|
|
||||||
"MNBL.gifts": "Dons",
|
|
||||||
"MNBL.allegiance": "Allégeance",
|
|
||||||
"MNBL.pacts": "Pactes",
|
|
||||||
"MNBL.runes": "Runes",
|
|
||||||
"MNBL.highlanguage": "Haut Parler",
|
|
||||||
"MNBL.difficulty": "Difficulté",
|
|
||||||
"MNBL.tendancies": "Tendances",
|
|
||||||
"MNBL.chaotictraits": "Traits Chaotique",
|
|
||||||
"MNBL.activatedrunes": "Runes actives",
|
|
||||||
"MNBL.mode": "Mode",
|
|
||||||
"MNBL.duration": "Durée",
|
|
||||||
"MNBL.treasuremoney": "Richesses et Argent",
|
|
||||||
"MNBL.quantity": "Quantité",
|
|
||||||
"MNBL.unit": "Unité",
|
|
||||||
"MNBL.specialactions": "Actions spéciales",
|
|
||||||
"MNBL.knockout": "Assomer",
|
|
||||||
"MNBL.flee": "Fuir",
|
|
||||||
"MNBL.immobilize": "Immobiliser",
|
|
||||||
"MNBL.mounted": "Monté",
|
|
||||||
"MNBL.weapons": "Armes",
|
|
||||||
"MNBL.attack": "Attaque",
|
|
||||||
"MNBL.damage": "Dégats",
|
|
||||||
"MNBL.protections": "Protections",
|
|
||||||
"MNBL.equipments": "Equipements",
|
|
||||||
"MNBL.origin": "Origine",
|
|
||||||
"MNBL.legacy": "Héritage",
|
|
||||||
"MNBL.profession": "Métier",
|
|
||||||
"MNBL.genre": "Genre",
|
|
||||||
"MNBL.size": "Taille",
|
|
||||||
"MNBL.hair": "Cheveux",
|
|
||||||
"MNBL.eyes": "Yeux",
|
|
||||||
"MNBL.preferredhand": "Main Préférée",
|
|
||||||
"MNBL.weight": "Weight",
|
|
||||||
"MNBL.soulmultiplier": "Multiplicateur d'âme",
|
|
||||||
"MNBL.ignorehealthmalus": "Ignore le malus de santé",
|
|
||||||
"MNBL.ignoresoulmalus": "Ignore le malus d'âme",
|
|
||||||
|
|
||||||
"MNBL.weapon": "Arme",
|
|
||||||
"MNBL.nextattackbonus": "Bonus pour prochaine attaque",
|
|
||||||
"MNBL.nextactionmalus": "Malus au défenseur pour prochaine action",
|
|
||||||
"MNBL.applydamage": "Appliquer les dégats/bonus/malus",
|
|
||||||
"MNBL.attribut": "Attribut",
|
|
||||||
"MNBL.skill": "Compétence",
|
|
||||||
"MNBL.target": "Cible",
|
|
||||||
"MNBL.usedpredilection": "Prédilection utilisée",
|
|
||||||
"MNBL.soulpoints": "Points d'âme",
|
|
||||||
"MNBL.formula": "Formule",
|
|
||||||
"MNBL.dice":"Dé",
|
|
||||||
"MNBL.success": "Succés",
|
|
||||||
"MNBL.failure": "Echec",
|
|
||||||
"MNBL.heroicsuccess": "Succés Héroïque",
|
|
||||||
"MNBL.dramaticfailure": "Echec Dramatique",
|
|
||||||
|
|
||||||
"MNBL.attackmountbonus": "Attaquant monté vs def. au sol (+5)",
|
|
||||||
"MNBL.targetdefense": "Défense adversaire",
|
|
||||||
"MNBL.shootmodifier": "Modificateurs de Tir",
|
|
||||||
"MNBL.aimingbonus": "Bonus de visée",
|
|
||||||
"MNBL.targetseeshoot": "La cible est consciente du tir",
|
|
||||||
"MNBL.notarget": "Pas de cible désignée",
|
|
||||||
"MNBL.runningtarget": "La cible court (-5/-10 selon portée)",
|
|
||||||
"MNBL.hascover": "Couvert",
|
|
||||||
"MNBL.range": "Portée",
|
|
||||||
"MNBL.disadvantagepositions": "Positions désavantageuses (Bonus max +15)",
|
|
||||||
"MNBL.targetground": "Cible au sol (+5)",
|
|
||||||
"MNBL.unarmedtarget": "Cible désarmée (+5)",
|
|
||||||
"MNBL.smallroomtarget": "Cible en espace restreint (+5)",
|
|
||||||
"MNBL.targetcantmove": "Cible immobilisée (+5)",
|
|
||||||
"MNBL.targetbelow": "Cible surplombée (+5)",
|
|
||||||
"MNBL.healthmalus": "Malus de santé",
|
|
||||||
"MNBL.soulmalus": "Malus d'âme",
|
|
||||||
"MNBL.registeredmodifiers": "Modificateurs enregistrés",
|
|
||||||
"MNBL.doubleD20": "Doubler le d20 (1 Point d'Eclat)",
|
|
||||||
|
|
||||||
"MNBL.pronouncedrune": "Rune prononcée",
|
|
||||||
"MNBL.tracedrune": "Rune tracée",
|
|
||||||
"MNBL.equipped": "Equipé",
|
|
||||||
"MNBL.rarity": "Rareté",
|
|
||||||
"MNBL.price": "Prix",
|
|
||||||
"MNBL.modifiertype": "Type de modificateur",
|
|
||||||
"MNBL.prerequisites": "Prérequis",
|
|
||||||
"MNBL.predilections": "Prédilections",
|
|
||||||
"MNBL.candoublebonusskill": "Les bonus de Bonne Aventure et d'Eclat peuvent être doublés (cf. Métier)",
|
|
||||||
"MNBL.addpredilection": "Ajouter une prédilection",
|
|
||||||
"MNBL.defensebonus": "Bonus de défense",
|
|
||||||
"MNBL.nonlethaldamage": "Dégâts non létaux",
|
|
||||||
"MNBL.weapontype": "Type d'arme",
|
|
||||||
"MNBL.weaponbonusattack": "Bonus de maniement (offensif)",
|
|
||||||
"MNBL.weaponbonusdefense": "Bonus de maniement (défensif)",
|
|
||||||
"MNBL.isdefense": "Défensive",
|
|
||||||
"MNBL.twohands": "A deux mains",
|
|
||||||
"MNBL.ignorearmor": "Ignore l'armure",
|
|
||||||
"MNBL.creatureresourcecost": "Cout en Ressources (créatures)",
|
|
||||||
"MNBL.shortrange": "Portée courte",
|
|
||||||
"MNBL.mediumrange":"Portée moyenne",
|
|
||||||
"MNBL.longrange":"Portée longue",
|
|
||||||
"MNBL.reloadduration": "Temps de rechargement",
|
|
||||||
"MNBL.attacks": "Attaques",
|
|
||||||
"MNBL.ressources": "Ressources",
|
|
||||||
"MNBL.weaponscapacities": "Armes/Capacités",
|
|
||||||
"MNBL.use": "Utiliser",
|
|
||||||
"MNBL.speciestrait": "Trait d'espèce"
|
|
||||||
|
|
||||||
}
|
|
@ -12,7 +12,7 @@ export class MournbladeActorSheet extends ActorSheet {
|
|||||||
/** @override */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
|
|
||||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
return mergeObject(super.defaultOptions, {
|
||||||
classes: ["fvtt-mournblade", "sheet", "actor"],
|
classes: ["fvtt-mournblade", "sheet", "actor"],
|
||||||
template: "systems/fvtt-mournblade/templates/actor-sheet.html",
|
template: "systems/fvtt-mournblade/templates/actor-sheet.html",
|
||||||
width: 640,
|
width: 640,
|
||||||
@ -25,7 +25,7 @@ export class MournbladeActorSheet extends ActorSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
const objectData = foundry.utils.duplicate(this.object)
|
const objectData = duplicate(this.object)
|
||||||
let actorData = objectData
|
let actorData = objectData
|
||||||
|
|
||||||
let formData = {
|
let formData = {
|
||||||
@ -40,30 +40,17 @@ export class MournbladeActorSheet extends ActorSheet {
|
|||||||
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
|
effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)),
|
||||||
limited: this.object.limited,
|
limited: this.object.limited,
|
||||||
skills: this.actor.getSkills(),
|
skills: this.actor.getSkills(),
|
||||||
armes: foundry.utils.duplicate(this.actor.getWeapons()),
|
armes: duplicate(this.actor.getWeapons()),
|
||||||
protections: foundry.utils.duplicate(this.actor.getArmors()),
|
protections: duplicate(this.actor.getArmors()),
|
||||||
dons: foundry.utils.duplicate(this.actor.getDons()),
|
dons: duplicate(this.actor.getDons()),
|
||||||
pactes: foundry.utils.duplicate(this.actor.getPactes()),
|
|
||||||
alignement: this.actor.getAlignement(),
|
alignement: this.actor.getAlignement(),
|
||||||
aspect: this.actor.getAspect(),
|
tendances:duplicate(this.actor.getTendances()),
|
||||||
marge: this.actor.getMarge(),
|
runes:duplicate(this.actor.getRunes()),
|
||||||
tendances:foundry.utils.duplicate(this.actor.getTendances()),
|
origine: duplicate(this.actor.getOrigine() || {}),
|
||||||
runes:foundry.utils.duplicate(this.actor.getRunes()),
|
heritage: duplicate(this.actor.getHeritage() || {}),
|
||||||
traitsChaotiques:foundry.utils.duplicate(this.actor.getTraitsChaotiques()),
|
metier: duplicate(this.actor.getMetier() || {}),
|
||||||
traitsEspeces: foundry.utils.duplicate(this.actor.getTraitsEspeces()),
|
|
||||||
origine: foundry.utils.duplicate(this.actor.getOrigine() || {}),
|
|
||||||
heritage: foundry.utils.duplicate(this.actor.getHeritage() || {}),
|
|
||||||
metier: foundry.utils.duplicate(this.actor.getMetier() || {}),
|
|
||||||
combat: this.actor.getCombatValues(),
|
combat: this.actor.getCombatValues(),
|
||||||
equipements: foundry.utils.duplicate(this.actor.getEquipments()),
|
equipements: duplicate(this.actor.getEquipments()),
|
||||||
modifiers: foundry.utils.duplicate(this.actor.getModifiers()),
|
|
||||||
monnaies: foundry.utils.duplicate(this.actor.getMonnaies()),
|
|
||||||
runeEffects: foundry.utils.duplicate(this.actor.getRuneEffects()),
|
|
||||||
config: game.system.mournblade.config,
|
|
||||||
protectionTotal: this.actor.getProtectionTotal(),
|
|
||||||
santeMalus: this.actor.getStatusMalus(),
|
|
||||||
ameMalus: this.actor.getAmeMalus(),
|
|
||||||
description: await TextEditor.enrichHTML(this.object.system.biodata.description, {async: true}),
|
|
||||||
options: this.options,
|
options: this.options,
|
||||||
owner: this.document.isOwner,
|
owner: this.document.isOwner,
|
||||||
editScore: this.options.editScore,
|
editScore: this.options.editScore,
|
||||||
@ -136,44 +123,11 @@ export class MournbladeActorSheet extends ActorSheet {
|
|||||||
let armeId = li.data("item-id")
|
let armeId = li.data("item-id")
|
||||||
this.actor.rollArmeOffensif(armeId)
|
this.actor.rollArmeOffensif(armeId)
|
||||||
})
|
})
|
||||||
html.find('.roll-assomer').click((event) => {
|
|
||||||
this.actor.rollAssomer()
|
|
||||||
})
|
|
||||||
html.find('.roll-fuir').click((event) => {
|
|
||||||
this.actor.rollFuir()
|
|
||||||
})
|
|
||||||
html.find('.roll-immobiliser').click((event) => {
|
|
||||||
this.actor.rollImmobiliser()
|
|
||||||
})
|
|
||||||
html.find('.roll-arme-special').click((event) => {
|
|
||||||
const li = $(event.currentTarget).parents(".item")
|
|
||||||
let armeId = li.data("item-id")
|
|
||||||
this.actor.rollArmeSpecial(armeId)
|
|
||||||
})
|
|
||||||
|
|
||||||
html.find('.roll-arme-degats').click((event) => {
|
html.find('.roll-arme-degats').click((event) => {
|
||||||
const li = $(event.currentTarget).parents(".item")
|
const li = $(event.currentTarget).parents(".item")
|
||||||
let armeId = li.data("item-id")
|
let armeId = li.data("item-id")
|
||||||
this.actor.rollArmeDegats(armeId)
|
this.actor.rollArmeDegats(armeId)
|
||||||
})
|
})
|
||||||
html.find('.quantity-modify').click(event => {
|
|
||||||
const li = $(event.currentTarget).parents(".item")
|
|
||||||
const value = Number($(event.currentTarget).data("quantite-value"))
|
|
||||||
this.actor.incDecQuantity( li.data("item-id"), value );
|
|
||||||
})
|
|
||||||
html.find('.item-add').click((event) => {
|
|
||||||
const itemType = $(event.currentTarget).data("type")
|
|
||||||
this.actor.createEmbeddedDocuments('Item', [{ name: `Nouveau ${itemType}`, type: itemType }], { renderSheet: true })
|
|
||||||
})
|
|
||||||
html.find('.sante-modify').click((event) => {
|
|
||||||
const santeType = $(event.currentTarget).data("type")
|
|
||||||
const value = $(event.currentTarget).data("value")
|
|
||||||
this.actor.incDecSante(santeType, value, false)
|
|
||||||
})
|
|
||||||
html.find('.ame-modify').click((event) => {
|
|
||||||
const value = $(event.currentTarget).data("value")
|
|
||||||
this.actor.incDecAme(value)
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
html.find('.lock-unlock-sheet').click((event) => {
|
html.find('.lock-unlock-sheet').click((event) => {
|
||||||
|
@ -31,7 +31,7 @@ export class MournbladeActor extends Actor {
|
|||||||
if (data instanceof Array) {
|
if (data instanceof Array) {
|
||||||
return super.create(data, options);
|
return super.create(data, options);
|
||||||
}
|
}
|
||||||
// If the created actor has items (only applicable to foundry.utils.duplicated actors) bypass the new actor creation logic
|
// If the created actor has items (only applicable to duplicated actors) bypass the new actor creation logic
|
||||||
if (data.items) {
|
if (data.items) {
|
||||||
let actor = super.create(data, options);
|
let actor = super.create(data, options);
|
||||||
return actor;
|
return actor;
|
||||||
@ -41,42 +41,29 @@ export class MournbladeActor extends Actor {
|
|||||||
const skills = await MournbladeUtility.loadCompendium("fvtt-mournblade.skills")
|
const skills = await MournbladeUtility.loadCompendium("fvtt-mournblade.skills")
|
||||||
data.items = skills.map(i => i.toObject())
|
data.items = skills.map(i => i.toObject())
|
||||||
}
|
}
|
||||||
if (data.type == 'creature') {
|
if (data.type == 'pnj') {
|
||||||
const skills = await MournbladeUtility.loadCompendium("fvtt-mournblade.skills-creatures")
|
|
||||||
data.items = skills.map(i => i.toObject())
|
|
||||||
data.items.push({ name: "Arme naturelle 1", type: 'arme', img: "systems/fvtt-mournblade/assets/icons/arme.webp", system: { typearme: "contact", bonusmaniementoff: 0, seuildefense: 0, degats: "0" } })
|
|
||||||
data.items.push({ name: "Arme naturelle 2", type: 'arme', img: "systems/fvtt-mournblade/assets/icons/arme.webp", system: { typearme: "contact", bonusmaniementoff: 0, seuildefense: 0, degats: "0" } })
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return super.create(data, options);
|
return super.create(data, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
setModifier(name, type, value) {
|
|
||||||
this.createEmbeddedDocuments("Item", [{ type: "modifier", name: name, system: { modifiertype: type, value: value } }])
|
|
||||||
ui.notifications.info("Le modificateur " + name + " a été ajouté à " + this.name + ".")
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
prepareArme(arme) {
|
prepareArme(arme) {
|
||||||
arme = foundry.utils.duplicate(arme)
|
arme = duplicate(arme)
|
||||||
let combat = this.getCombatValues()
|
let combat = this.getCombatValues()
|
||||||
if (arme.system.typearme == "contact" || arme.system.typearme == "contactjet") {
|
if (arme.system.typearme == "contact" || arme.system.typearme == "contactjet") {
|
||||||
arme.system.isMelee = true
|
arme.system.competence = duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée"))
|
||||||
arme.system.competence = foundry.utils.duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée"))
|
|
||||||
arme.system.attrKey = "pui"
|
arme.system.attrKey = "pui"
|
||||||
arme.system.totalDegats = arme.system.degats + "+" + combat.bonusDegatsTotal
|
arme.system.totalDegats = arme.system.degats + "+" + combat.bonusDegatsTotal
|
||||||
arme.system.totalOffensif = this.system.attributs.pui.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff + combat.attaqueModifier
|
arme.system.totalOffensif = this.system.attributs.pui.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff
|
||||||
if (arme.system.isdefense) {
|
if (arme.system.isdefense) {
|
||||||
arme.system.totalDefensif = combat.defenseTotal + arme.system.competence.system.niveau + arme.system.bonusmaniementdef
|
arme.system.totalDefensif = combat.defenseTotal + arme.system.competence.system.niveau + arme.system.bonusmaniementdef
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (arme.system.typearme == "jet" || arme.system.typearme == "tir") {
|
if (arme.system.typearme == "jet" || arme.system.typearme == "tir") {
|
||||||
arme.system.isDistance = true
|
arme.system.competence = duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "armes à distance"))
|
||||||
arme.system.competence = foundry.utils.duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "armes à distance"))
|
|
||||||
arme.system.attrKey = "adr"
|
arme.system.attrKey = "adr"
|
||||||
arme.system.totalOffensif = this.system.attributs.adr.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff + combat.attaqueModifier
|
arme.system.totalOffensif = this.system.attributs.adr.value + arme.system.competence.system.niveau + arme.system.bonusmaniementoff
|
||||||
arme.system.totalDegats = arme.system.degats
|
arme.system.totalDegats = arme.system.degats
|
||||||
if (arme.system.isdefense) {
|
if (arme.system.isdefense) {
|
||||||
arme.system.totalDefensif = combat.defenseTotal + arme.system.competence.system.niveau + arme.system.bonusmaniementdef
|
arme.system.totalDefensif = combat.defenseTotal + arme.system.competence.system.niveau + arme.system.bonusmaniementdef
|
||||||
@ -84,19 +71,6 @@ export class MournbladeActor extends Actor {
|
|||||||
}
|
}
|
||||||
return arme
|
return arme
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
|
||||||
prepareBouclier(bouclier) {
|
|
||||||
bouclier = foundry.utils.duplicate(bouclier)
|
|
||||||
let combat = this.getCombatValues()
|
|
||||||
bouclier.system.competence = foundry.utils.duplicate(this.items.find(item => item.type == "competence" && item.name.toLowerCase() == "mêlée"))
|
|
||||||
bouclier.system.attrKey = "pui"
|
|
||||||
bouclier.system.totalDegats = bouclier.system.degats + "+" + combat.bonusDegatsTotal
|
|
||||||
bouclier.system.totalOffensif = this.system.attributs.pui.value + bouclier.system.competence.system.niveau
|
|
||||||
bouclier.system.isdefense = true
|
|
||||||
bouclier.system.bonusmaniementoff = 0
|
|
||||||
bouclier.system.totalDefensif = combat.defenseTotal + bouclier.system.competence.system.niveau + bouclier.system.bonusdefense
|
|
||||||
return bouclier
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getWeapons() {
|
getWeapons() {
|
||||||
@ -105,66 +79,28 @@ export class MournbladeActor extends Actor {
|
|||||||
if (arme.type == "arme") {
|
if (arme.type == "arme") {
|
||||||
armes.push(this.prepareArme(arme))
|
armes.push(this.prepareArme(arme))
|
||||||
}
|
}
|
||||||
if (arme.type == "bouclier") {
|
|
||||||
armes.push(this.prepareBouclier(arme))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
MournbladeUtility.sortArrayObjectsByName(armes)
|
|
||||||
return armes
|
return armes
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getModifiersForRoll() {
|
|
||||||
let modifiers = []
|
|
||||||
for (let mod of this.items) {
|
|
||||||
if (mod.type == "modifier" && mod.system.modifiertype == "roll") {
|
|
||||||
let modObj = mod.toObject()
|
|
||||||
modObj.system.apply = true
|
|
||||||
modifiers.push(modObj)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MournbladeUtility.sortArrayObjectsByName(modifiers)
|
|
||||||
return modifiers
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getItemSorted(types) {
|
|
||||||
let items = this.items.filter(item => types.includes(item.type)) || []
|
|
||||||
MournbladeUtility.sortArrayObjectsByName(items)
|
|
||||||
return items
|
|
||||||
}
|
|
||||||
getDons() {
|
getDons() {
|
||||||
return this.getItemSorted(["don"])
|
return this.items.filter(item => item.type == "don")
|
||||||
}
|
|
||||||
getPactes() {
|
|
||||||
return this.getItemSorted(["pacte"])
|
|
||||||
}
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
getTendances() {
|
getTendances() {
|
||||||
return this.getItemSorted(["tendance"])
|
return this.items.filter(item => item.type == "tendance")
|
||||||
}
|
}
|
||||||
getRunes() {
|
getRunes() {
|
||||||
return this.getItemSorted(["rune"])
|
return this.items.filter(item => item.type == "rune")
|
||||||
}
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
getEquipments() {
|
getEquipments() {
|
||||||
return this.getItemSorted(["equipement"])
|
return this.items.filter(item => item.type == "equipement")
|
||||||
}
|
|
||||||
getModifiers() {
|
|
||||||
return this.getItemSorted(["modifier"])
|
|
||||||
}
|
|
||||||
getTraitsChaotiques() {
|
|
||||||
return this.getItemSorted(["traitchaotique"])
|
|
||||||
}
|
|
||||||
getTraitsEspeces() {
|
|
||||||
return this.getItemSorted(["traitespece"])
|
|
||||||
}
|
|
||||||
getMonnaies() {
|
|
||||||
return this.getItemSorted(["monnaie"])
|
|
||||||
}
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
getArmors() {
|
getArmors() {
|
||||||
return this.getItemSorted(["protection"])
|
return this.items.filter(item => item.type == "protection")
|
||||||
}
|
|
||||||
getRuneEffects() {
|
|
||||||
return this.getItemSorted(["runeeffect"])
|
|
||||||
}
|
}
|
||||||
getOrigine() {
|
getOrigine() {
|
||||||
return this.items.find(item => item.type == "origine")
|
return this.items.find(item => item.type == "origine")
|
||||||
@ -179,7 +115,7 @@ export class MournbladeActor extends Actor {
|
|||||||
getSkills() {
|
getSkills() {
|
||||||
let comp = []
|
let comp = []
|
||||||
for (let item of this.items) {
|
for (let item of this.items) {
|
||||||
item = foundry.utils.duplicate(item)
|
item = duplicate(item)
|
||||||
if (item.type == "competence") {
|
if (item.type == "competence") {
|
||||||
item.system.attribut1total = item.system.niveau + (this.system.attributs[item.system.attribut1]?.value || 0)
|
item.system.attribut1total = item.system.niveau + (this.system.attributs[item.system.attribut1]?.value || 0)
|
||||||
item.system.attribut2total = item.system.niveau + (this.system.attributs[item.system.attribut2]?.value || 0)
|
item.system.attribut2total = item.system.niveau + (this.system.attributs[item.system.attribut2]?.value || 0)
|
||||||
@ -195,28 +131,20 @@ export class MournbladeActor extends Actor {
|
|||||||
comp.push(item)
|
comp.push(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MournbladeUtility.sortArrayObjectsByName(comp)
|
return comp.sort(function (a, b) {
|
||||||
return comp
|
let fa = a.name.toLowerCase(),
|
||||||
}
|
fb = b.name.toLowerCase();
|
||||||
|
if (fa < fb) {
|
||||||
/* -------------------------------------------- */
|
return -1;
|
||||||
getProtectionTotal() {
|
|
||||||
let protection = 0
|
|
||||||
for (let item of this.items) {
|
|
||||||
if (item.type == "protection" && item.system.equipped) {
|
|
||||||
protection += item.system.protection
|
|
||||||
}
|
}
|
||||||
}
|
if (fa > fb) {
|
||||||
return protection
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getAspect() {
|
|
||||||
return (this.system.balance.loi > this.system.balance.chaos) ? this.system.balance.loi : this.system.balance.chaos
|
|
||||||
}
|
|
||||||
getMarge() {
|
|
||||||
return Math.abs(this.system.balance.loi - this.system.balance.chaos)
|
|
||||||
}
|
|
||||||
getAlignement() {
|
getAlignement() {
|
||||||
return (this.system.balance.loi > this.system.balance.chaos) ? "loyal" : "chaotique"
|
return (this.system.balance.loi > this.system.balance.chaos) ? "loyal" : "chaotique"
|
||||||
}
|
}
|
||||||
@ -233,14 +161,7 @@ export class MournbladeActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getCombatValues() {
|
getCombatValues() {
|
||||||
let defenserModifier = 0
|
|
||||||
this.items.filter(item => item.type == "modifier" && item.system.modifiertype == "defense").map(e => defenserModifier += e.system.value)
|
|
||||||
let attaqueModifier = 0
|
|
||||||
this.items.filter(item => item.type == "modifier" && item.system.modifiertype == "attaque").map(e => attaqueModifier += e.system.value)
|
|
||||||
|
|
||||||
let combat = {
|
let combat = {
|
||||||
defenserModifier,
|
|
||||||
attaqueModifier,
|
|
||||||
initBase: this.system.attributs.adr.value,
|
initBase: this.system.attributs.adr.value,
|
||||||
initTotal: this.system.attributs.adr.value + this.system.combat.initbonus,
|
initTotal: this.system.attributs.adr.value + this.system.combat.initbonus,
|
||||||
bonusDegats: this.getBonusDegats(),
|
bonusDegats: this.getBonusDegats(),
|
||||||
@ -248,11 +169,10 @@ export class MournbladeActor extends Actor {
|
|||||||
vitesseBase: this.getVitesseBase(),
|
vitesseBase: this.getVitesseBase(),
|
||||||
vitesseTotal: this.getVitesseBase() + this.system.combat.vitessebonus,
|
vitesseTotal: this.getVitesseBase() + this.system.combat.vitessebonus,
|
||||||
defenseBase: this.getDefenseBase(),
|
defenseBase: this.getDefenseBase(),
|
||||||
defenseTotal: this.getDefenseBase() + this.system.combat.defensebonus + defenserModifier
|
defenseTotal: this.getDefenseBase() + this.system.combat.defensebonus
|
||||||
}
|
}
|
||||||
return combat
|
return combat
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
prepareBaseData() {
|
prepareBaseData() {
|
||||||
}
|
}
|
||||||
@ -268,11 +188,11 @@ export class MournbladeActor extends Actor {
|
|||||||
if (this.type == 'personnage') {
|
if (this.type == 'personnage') {
|
||||||
let newSante = this.system.sante.bonus + (this.system.attributs.pui.value + this.system.attributs.tre.value) * 2 + 5
|
let newSante = this.system.sante.bonus + (this.system.attributs.pui.value + this.system.attributs.tre.value) * 2 + 5
|
||||||
if (this.system.sante.base != newSante) {
|
if (this.system.sante.base != newSante) {
|
||||||
this.update({ 'system.sante.base': newSante })
|
this.update({ 'data.sante.base': newSante })
|
||||||
}
|
}
|
||||||
let newAme = (this.system.attributs.cla.value + this.system.attributs.tre.value) * this.system.biodata.amemultiplier + 5
|
let newAme = (this.system.attributs.cla.value + this.system.attributs.tre.value) * this.system.biodata.amemultiplier + 5
|
||||||
if (this.system.ame.fullmax != newAme) {
|
if (this.system.ame.fullmax != newAme) {
|
||||||
this.update({ 'system.ame.fullmax': newAme })
|
this.update({ 'data.ame.fullmax': newAme })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,57 +209,20 @@ export class MournbladeActor extends Actor {
|
|||||||
getItemById(id) {
|
getItemById(id) {
|
||||||
let item = this.items.find(item => item.id == id);
|
let item = this.items.find(item => item.id == id);
|
||||||
if (item) {
|
if (item) {
|
||||||
item = foundry.utils.duplicate(item)
|
item = duplicate(item)
|
||||||
}
|
}
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async equipItem(itemId) {
|
async equipItem(itemId) {
|
||||||
let item = this.items.find(item => item.id == itemId)
|
let item = this.items.find(item => item.id == itemId);
|
||||||
if (item?.system) {
|
if (item && item.system.data) {
|
||||||
let update = { _id: item.id, "system.equipped": !item.system.equipped }
|
let update = { _id: item.id, "data.equipped": !item.system.equipped };
|
||||||
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
|
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getStatusMalus() {
|
|
||||||
if (this.system.biodata.ignoresantemalus) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
let malusL = 0
|
|
||||||
let malusNL = 0
|
|
||||||
if (this.system.sante.base - this.system.sante.letaux < 10) {
|
|
||||||
malusL = -2
|
|
||||||
}
|
|
||||||
if (this.system.sante.base - this.system.sante.letaux < 5) {
|
|
||||||
malusL = -5
|
|
||||||
}
|
|
||||||
if (this.system.sante.base - this.system.sante.nonletaux < 10) {
|
|
||||||
malusNL = -2
|
|
||||||
}
|
|
||||||
if (this.system.sante.base - this.system.sante.nonletaux < 5) {
|
|
||||||
malusNL = -5
|
|
||||||
}
|
|
||||||
return Math.min(malusL, malusNL)
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getAmeMalus() {
|
|
||||||
if (this.system.biodata.ignoreamemalus) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
let malusA = 0
|
|
||||||
if (this.system.ame.currentmax - this.system.ame.value < 10) {
|
|
||||||
malusA = -2
|
|
||||||
}
|
|
||||||
if (this.system.ame.currentmax - this.system.ame.value < 5) {
|
|
||||||
malusA = -5
|
|
||||||
}
|
|
||||||
return malusA
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
editItemField(itemId, itemType, itemField, dataType, value) {
|
editItemField(itemId, itemType, itemField, dataType, value) {
|
||||||
let item = this.items.find(item => item.id == itemId)
|
let item = this.items.find(item => item.id == itemId)
|
||||||
@ -350,49 +233,11 @@ export class MournbladeActor extends Actor {
|
|||||||
} else {
|
} else {
|
||||||
value = String(value)
|
value = String(value)
|
||||||
}
|
}
|
||||||
let update = { _id: item.id, [`system.${itemField}`]: value };
|
let update = { _id: item.id, [`data.${itemField}`]: value };
|
||||||
this.updateEmbeddedDocuments("Item", [update])
|
this.updateEmbeddedDocuments("Item", [update])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
incDecSante(type, value, applyArmure = true) {
|
|
||||||
value = Number(value)
|
|
||||||
if (value && applyArmure) {
|
|
||||||
let protection = this.getProtectionTotal()
|
|
||||||
value -= protection
|
|
||||||
value = Math.max(0, Number(value))
|
|
||||||
}
|
|
||||||
if (value) {
|
|
||||||
let newSante = foundry.utils.duplicate(this.system.sante)
|
|
||||||
newSante[type] += Number(value)
|
|
||||||
newSante[type] = Math.max(0, newSante[type])
|
|
||||||
if (newSante[type] > this.system.sante.base) {
|
|
||||||
value -= this.system.sante.base - newSante[type]
|
|
||||||
newSante[type] = this.system.sante.base
|
|
||||||
} else {
|
|
||||||
value = 0
|
|
||||||
}
|
|
||||||
newSante[type] = Math.min(newSante[type], newSante.base)
|
|
||||||
if (value && type == "nonletaux") {
|
|
||||||
newSante["letaux"] += value
|
|
||||||
}
|
|
||||||
this.update({ 'system.sante': newSante })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
incDecAme(value) {
|
|
||||||
value = Number(value)
|
|
||||||
if (value) {
|
|
||||||
let newAme = foundry.utils.duplicate(this.system.ame)
|
|
||||||
newAme.value += Number(value)
|
|
||||||
newAme.value = Math.max(0, newAme.value)
|
|
||||||
newAme.value = Math.min(newAme.value, newAme.currentmax)
|
|
||||||
this.update({ 'system.ame': newAme })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getBonneAventure() {
|
getBonneAventure() {
|
||||||
return this.system.bonneaventure.actuelle
|
return this.system.bonneaventure.actuelle
|
||||||
@ -402,7 +247,7 @@ export class MournbladeActor extends Actor {
|
|||||||
changeBonneAventure(value) {
|
changeBonneAventure(value) {
|
||||||
let newBA = this.system.bonneaventure.actuelle
|
let newBA = this.system.bonneaventure.actuelle
|
||||||
newBA += value
|
newBA += value
|
||||||
this.update({ 'system.bonneaventure.actuelle': newBA })
|
this.update({ 'data.bonneaventure.actuelle': newBA })
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -414,7 +259,7 @@ export class MournbladeActor extends Actor {
|
|||||||
changeEclat(value) {
|
changeEclat(value) {
|
||||||
let newE = this.system.eclat.value
|
let newE = this.system.eclat.value
|
||||||
newE += value
|
newE += value
|
||||||
this.update({ 'system.eclat.value': newE })
|
this.update({ 'data.eclat.value': newE })
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -423,13 +268,13 @@ export class MournbladeActor extends Actor {
|
|||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
subPointsAme(runeMode, value) {
|
subPointsAme(runeMode, value) {
|
||||||
let ame = foundry.utils.duplicate(this.system.ame)
|
let ame = duplicate(this.system.ame)
|
||||||
if (runeMode == "prononcer") {
|
if(runeMode == "prononcer") {
|
||||||
ame.value += value
|
ame.value -= value
|
||||||
} else {
|
} else {
|
||||||
ame.currentmax -= value
|
ame.currentmax -= value
|
||||||
}
|
}
|
||||||
this.update({ 'system.ame': ame })
|
this.update( {'data.ame': ame})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -450,9 +295,6 @@ export class MournbladeActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getBonusDegats() {
|
getBonusDegats() {
|
||||||
if (this.type == "creature") {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
return __degatsBonus[this.system.attributs.pui.value]
|
return __degatsBonus[this.system.attributs.pui.value]
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -460,7 +302,7 @@ export class MournbladeActor extends Actor {
|
|||||||
async equipGear(equipmentId) {
|
async equipGear(equipmentId) {
|
||||||
let item = this.items.find(item => item.id == equipmentId);
|
let item = this.items.find(item => item.id == equipmentId);
|
||||||
if (item && item.system.data) {
|
if (item && item.system.data) {
|
||||||
let update = { _id: item.id, "system.equipped": !item.system.equipped };
|
let update = { _id: item.id, "data.equipped": !item.system.equipped };
|
||||||
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
|
await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -469,15 +311,15 @@ export class MournbladeActor extends Actor {
|
|||||||
getSubActors() {
|
getSubActors() {
|
||||||
let subActors = [];
|
let subActors = [];
|
||||||
for (let id of this.system.subactors) {
|
for (let id of this.system.subactors) {
|
||||||
subActors.push(foundry.utils.duplicate(game.actors.get(id)));
|
subActors.push(duplicate(game.actors.get(id)));
|
||||||
}
|
}
|
||||||
return subActors;
|
return subActors;
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async addSubActor(subActorId) {
|
async addSubActor(subActorId) {
|
||||||
let subActors = foundry.utils.duplicate(this.system.subactors);
|
let subActors = duplicate(this.system.subactors);
|
||||||
subActors.push(subActorId);
|
subActors.push(subActorId);
|
||||||
await this.update({ 'system.subactors': subActors });
|
await this.update({ 'data.subactors': subActors });
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async delSubActor(subActorId) {
|
async delSubActor(subActorId) {
|
||||||
@ -487,17 +329,18 @@ export class MournbladeActor extends Actor {
|
|||||||
newArray.push(id);
|
newArray.push(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
await this.update({ 'system.subactors': newArray });
|
await this.update({ 'data.subactors': newArray });
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async incDecQuantity(objetId, incDec = 0) {
|
async incDecQuantity(objetId, incDec = 0) {
|
||||||
let objetQ = this.items.get(objetId)
|
let objetQ = this.items.get(objetId)
|
||||||
if (objetQ) {
|
if (objetQ) {
|
||||||
let newQ = objetQ.system.quantite + incDec;
|
let newQ = objetQ.system.quantity + incDec;
|
||||||
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantite': newQ }]); // pdates one EmbeddedEntity
|
const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'data.quantity': newQ }]); // pdates one EmbeddedEntity
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getCompetence(compId) {
|
getCompetence(compId) {
|
||||||
return this.items.get(compId)
|
return this.items.get(compId)
|
||||||
@ -506,54 +349,9 @@ export class MournbladeActor extends Actor {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async setPredilectionUsed(compId, predIdx) {
|
async setPredilectionUsed(compId, predIdx) {
|
||||||
let comp = this.items.get(compId)
|
let comp = this.items.get(compId)
|
||||||
let pred = foundry.utils.duplicate(comp.system.predilections)
|
let pred = duplicate(comp.system.predilections)
|
||||||
pred[predIdx].used = true
|
pred[predIdx].used = true
|
||||||
await this.updateEmbeddedDocuments('Item', [{ _id: compId, 'system.predilections': pred }])
|
await this.updateEmbeddedDocuments('Item', [{ _id: compId, 'data.predilections': pred }])
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getInitiativeScore() {
|
|
||||||
return Number(this.system.attributs.adr.value) + Number(this.system.combat.initbonus)
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
getBestDefenseValue() {
|
|
||||||
let defenseList = this.items.filter(item => (item.type == "arme" || item.type == "bouclier") && item.system.equipped)
|
|
||||||
let maxDef = 0
|
|
||||||
let bestArme
|
|
||||||
for (let arme of defenseList) {
|
|
||||||
if (arme.type == "arme" && arme.system.isdefense) {
|
|
||||||
arme = this.prepareArme(arme)
|
|
||||||
}
|
|
||||||
if (arme.type == "bouclier") {
|
|
||||||
arme = this.prepareBouclier(arme)
|
|
||||||
}
|
|
||||||
if (arme.system.totalDefensif > maxDef) {
|
|
||||||
maxDef = arme.system.totalDefensif
|
|
||||||
bestArme = foundry.utils.duplicate(arme)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return bestArme
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
depenseRessources(arme) {
|
|
||||||
if (arme.system.nbressources && Number(arme.system.nbressources) > 0) {
|
|
||||||
if (this.type == "creature") {
|
|
||||||
let ressources = foundry.utils.duplicate(this.system.ressources)
|
|
||||||
if (Number(ressources.value) >= Number(arme.system.nbressources)) {
|
|
||||||
ressources.value -= arme.system.nbressources
|
|
||||||
this.update({ 'system.ressources': ressources })
|
|
||||||
ChatMessage.create({
|
|
||||||
content: "L'utilisation de la capacité/arme a dépensé " + arme.system.nbressources + " ressources.",
|
|
||||||
whisper: game.user._id,
|
|
||||||
user: game.user._id
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
ui.notifications.warn("Points de ressources insuffisants.")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ui.notifications.warn("Les ressources ne sont pas disponibles pour les personnages.")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -562,34 +360,24 @@ export class MournbladeActor extends Actor {
|
|||||||
rollData.alias = this.name
|
rollData.alias = this.name
|
||||||
rollData.actorImg = this.img
|
rollData.actorImg = this.img
|
||||||
rollData.actorId = this.id
|
rollData.actorId = this.id
|
||||||
rollData.tokenId = this.token?.id
|
|
||||||
rollData.img = this.img
|
rollData.img = this.img
|
||||||
rollData.canEclatDoubleD20 = this.canEclatDoubleD20()
|
rollData.canEclatDoubleD20 = this.canEclatDoubleD20()
|
||||||
rollData.doubleD20 = false
|
rollData.doubleD20 = false
|
||||||
rollData.attributs = MournbladeUtility.getAttributs()
|
rollData.attributs = MournbladeUtility.getAttributs()
|
||||||
rollData.selectDifficulte = true
|
|
||||||
rollData.malusSante = this.getStatusMalus() + this.system.sante.malusmanuel
|
|
||||||
rollData.malusAme = this.getAmeMalus()
|
|
||||||
rollData.modifiers = this.getModifiersForRoll()
|
|
||||||
rollData.desavantages = {}
|
|
||||||
rollData.isMonte = this.system.combat.monte
|
|
||||||
if (rollData.isMonte) {
|
|
||||||
rollData.config.attaques["chargecavalerie"] = "Charge de cavalerie"
|
|
||||||
}
|
|
||||||
|
|
||||||
if (attrKey) {
|
if (attrKey) {
|
||||||
rollData.attrKey = attrKey
|
rollData.attrKey = attrKey
|
||||||
if (attrKey != "tochoose") {
|
if (attrKey != "tochoose") {
|
||||||
rollData.actionImg = "systems/fvtt-mournblade/assets/icons/" + this.system.attributs[attrKey].labelnorm + ".webp"
|
rollData.actionImg = "systems/fvtt-mournblade/assets/icons/" + this.system.attributs[attrKey].labelnorm + ".webp"
|
||||||
rollData.attr = foundry.utils.duplicate(this.system.attributs[attrKey])
|
rollData.attr = duplicate(this.system.attributs[attrKey])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (compId) {
|
if (compId) {
|
||||||
rollData.competence = foundry.utils.duplicate(this.items.get(compId) || {})
|
rollData.competence = duplicate(this.items.get(compId) || {})
|
||||||
rollData.actionImg = rollData.competence?.img
|
rollData.actionImg = rollData.competence?.img
|
||||||
}
|
}
|
||||||
if (compName) {
|
if (compName) {
|
||||||
rollData.competence = foundry.utils.duplicate(this.items.find(item => item.name.toLowerCase() == compName.toLowerCase()) || {})
|
rollData.competence = duplicate(this.items.find( item => item.name.toLowerCase() == compName.toLowerCase()) || {})
|
||||||
rollData.actionImg = rollData.competence?.img
|
rollData.actionImg = rollData.competence?.img
|
||||||
}
|
}
|
||||||
return rollData
|
return rollData
|
||||||
@ -598,6 +386,7 @@ export class MournbladeActor extends Actor {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async rollAttribut(attrKey) {
|
async rollAttribut(attrKey) {
|
||||||
let rollData = this.getCommonRollData(attrKey)
|
let rollData = this.getCommonRollData(attrKey)
|
||||||
|
console.log("RollDatra", rollData)
|
||||||
let rollDialog = await MournbladeRollDialog.create(this, rollData)
|
let rollDialog = await MournbladeRollDialog.create(this, rollData)
|
||||||
rollDialog.render(true)
|
rollDialog.render(true)
|
||||||
}
|
}
|
||||||
@ -612,16 +401,11 @@ export class MournbladeActor extends Actor {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async rollRune(runeId) {
|
async rollRune(runeId) {
|
||||||
let comp = this.items.find(comp => comp.type == "competence" && comp.name.toLowerCase() == "savoir : runes")
|
|
||||||
if (!comp) {
|
|
||||||
ui.notifications.warn("La compétence Savoirs : Runes n'a pas été trouvée, abandon.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
let rollData = this.getCommonRollData("cla", undefined, "Savoir : Runes")
|
let rollData = this.getCommonRollData("cla", undefined, "Savoir : Runes")
|
||||||
rollData.rune = foundry.utils.duplicate(this.items.get(runeId) || {})
|
rollData.rune = duplicate(this.items.get(runeId) || {})
|
||||||
rollData.difficulte = rollData.rune?.system?.seuil || 0
|
rollData.difficulte = rollData.rune?.data?.seuil || 0
|
||||||
rollData.runemode = "prononcer"
|
rollData.runemode = "prononcer"
|
||||||
rollData.runeame = 1
|
rollData.runeame = 1
|
||||||
console.log("runeData", rollData)
|
console.log("runeData", rollData)
|
||||||
let rollDialog = await MournbladeRollDialog.create(this, rollData)
|
let rollDialog = await MournbladeRollDialog.create(this, rollData)
|
||||||
rollDialog.render(true)
|
rollDialog.render(true)
|
||||||
@ -630,95 +414,18 @@ export class MournbladeActor extends Actor {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async rollArmeOffensif(armeId) {
|
async rollArmeOffensif(armeId) {
|
||||||
let arme = this.items.get(armeId)
|
let arme = this.items.get(armeId)
|
||||||
if (arme.type == "arme") {
|
arme = this.prepareArme(arme)
|
||||||
arme = this.prepareArme(arme)
|
|
||||||
}
|
|
||||||
if (arme.type == "bouclier") {
|
|
||||||
arme = this.prepareBouclier(arme)
|
|
||||||
}
|
|
||||||
let rollData = this.getCommonRollData(arme.system.attrKey, arme.system.competence._id)
|
let rollData = this.getCommonRollData(arme.system.attrKey, arme.system.competence._id)
|
||||||
rollData.arme = arme
|
rollData.arme = arme
|
||||||
rollData.typeAttaque = "assaut"
|
|
||||||
rollData.typeCouvert = "aucun"
|
|
||||||
rollData.hasDesavantageBonus = true
|
|
||||||
rollData.visee = false
|
|
||||||
rollData.ciblecourt = false
|
|
||||||
rollData.cibleconsciente = false
|
|
||||||
// Do not display difficulte if defense weapon or distance
|
|
||||||
if (rollData.armeDefense || rollData.arme.system.isDistance) {
|
|
||||||
rollData.selectDifficulte = false
|
|
||||||
rollData.difficulte = (rollData.arme.system.isDistance) ? 0 : rollData.difficulte
|
|
||||||
}
|
|
||||||
console.log("ARME!", rollData)
|
console.log("ARME!", rollData)
|
||||||
this.depenseRessources(arme)
|
|
||||||
let rollDialog = await MournbladeRollDialog.create(this, rollData)
|
let rollDialog = await MournbladeRollDialog.create(this, rollData)
|
||||||
rollDialog.render(true)
|
rollDialog.render(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async rollAssomer() {
|
|
||||||
let rollData = this.getCommonRollData("adr", undefined, "Filouterie")
|
|
||||||
rollData.typeAttaque = "assomer"
|
|
||||||
rollData.typeCouvert = "aucun"
|
|
||||||
rollData.hasDesavantageBonus = true
|
|
||||||
if (rollData.defender) {
|
|
||||||
rollData.selectDifficulte = false
|
|
||||||
rollData.difficulte = rollData.defender.system.attributs.tre.value * 2
|
|
||||||
}
|
|
||||||
console.log("Assomer!", rollData)
|
|
||||||
let rollDialog = await MournbladeRollDialog.create(this, rollData)
|
|
||||||
rollDialog.render(true)
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async rollFuir() {
|
|
||||||
let rollData = this.getCommonRollData("adr", undefined, "Mouvements")
|
|
||||||
rollData.typeAttaque = "fuir"
|
|
||||||
rollData.typeCouvert = "aucun"
|
|
||||||
rollData.hasDesavantageBonus = true
|
|
||||||
if (rollData.defender) {
|
|
||||||
rollData.selectDifficulte = false
|
|
||||||
let comp = rollData.defender.items.find(it => it.type == "competence" && it.name.toLowerCase() == "mouvements")
|
|
||||||
rollData.difficulte = rollData.defender.system.attributs.adr.value + ((comp) ? comp.system.niveau : rollData.defender.system.attributs.adr.value)
|
|
||||||
}
|
|
||||||
console.log("Fuir!", rollData)
|
|
||||||
let rollDialog = await MournbladeRollDialog.create(this, rollData)
|
|
||||||
rollDialog.render(true)
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async rollImmobiliser() {
|
|
||||||
let rollData = this.getCommonRollData("pui", undefined, "Mêlée")
|
|
||||||
rollData.typeAttaque = "immobiliser"
|
|
||||||
rollData.typeCouvert = "aucun"
|
|
||||||
rollData.hasDesavantageBonus = true
|
|
||||||
if (rollData.defender) {
|
|
||||||
rollData.selectDifficulte = false
|
|
||||||
rollData.difficulte = rollData.defenderCombatValues.defenseTotal
|
|
||||||
}
|
|
||||||
console.log("Immobiliser!", rollData)
|
|
||||||
let rollDialog = await MournbladeRollDialog.create(this, rollData)
|
|
||||||
rollDialog.render(true)
|
|
||||||
}
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async rollArmeSpecial(armeId) {
|
|
||||||
let arme = this.items.get(armeId)
|
|
||||||
if (arme) {
|
|
||||||
MournbladeUtility.createChatWithRollMode("GM", {
|
|
||||||
content: await renderTemplate(`systems/fvtt-mournblade/templates/chat-display-description.html`, arme)
|
|
||||||
}, arme)
|
|
||||||
this.depenseRessources(arme)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async rollArmeDegats(armeId) {
|
async rollArmeDegats(armeId) {
|
||||||
let arme = this.items.get(armeId)
|
let arme = this.items.get(armeId)
|
||||||
if (arme.type == "arme") {
|
arme = this.prepareArme(arme)
|
||||||
arme = this.prepareArme(arme)
|
|
||||||
}
|
|
||||||
if (arme.type == "bouclier") {
|
|
||||||
arme = this.prepareBouclier(arme)
|
|
||||||
}
|
|
||||||
rollData.degatsFormula = arme.system.totalDegats
|
|
||||||
let roll = new Roll(arme.system.totalDegats).roll({ async: false })
|
let roll = new Roll(arme.system.totalDegats).roll({ async: false })
|
||||||
await MournbladeUtility.showDiceSoNice(roll, game.settings.get("core", "rollMode"));
|
await MournbladeUtility.showDiceSoNice(roll, game.settings.get("core", "rollMode"));
|
||||||
let rollData = {
|
let rollData = {
|
||||||
|
@ -9,11 +9,8 @@ export class MournbladeCombat extends Combat {
|
|||||||
for (let cId = 0; cId < ids.length; cId++) {
|
for (let cId = 0; cId < ids.length; cId++) {
|
||||||
const c = this.combatants.get(ids[cId]);
|
const c = this.combatants.get(ids[cId]);
|
||||||
let id = c._id || c.id;
|
let id = c._id || c.id;
|
||||||
let initBonus = c.actor ? c.actor.getInitiativeScore() : 0
|
let initBonus = c.actor ? c.actor.getInitiativeScore( this.id, id ) : -1;
|
||||||
let roll = new Roll("1d10 + "+initBonus).roll({ async: false})
|
await this.updateEmbeddedDocuments("Combatant", [ { _id: id, initiative: initBonus } ]);
|
||||||
await MournbladeUtility.showDiceSoNice(roll, game.settings.get("core", "rollMode"))
|
|
||||||
//console.log("Init bonus", initBonus, roll.total)
|
|
||||||
await this.updateEmbeddedDocuments("Combatant", [ { _id: id, initiative: roll.total } ]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
|
@ -1,81 +0,0 @@
|
|||||||
|
|
||||||
export class MournbladeConfig {
|
|
||||||
|
|
||||||
static getConfig() {
|
|
||||||
let MOURNBLADE_CONFIG = {
|
|
||||||
|
|
||||||
attaques: {
|
|
||||||
assaut: game.i18n.localize("MNBL.assaut"),
|
|
||||||
precise: game.i18n.localize("MNBL.preciseattack"),
|
|
||||||
feinte: game.i18n.localize("MNBL.feint"),
|
|
||||||
coupbas: game.i18n.localize("MNBL.dirtyattack"),
|
|
||||||
charger: game.i18n.localize("MNBL.charge"),
|
|
||||||
contenir: game.i18n.localize("MNBL.contain"),
|
|
||||||
desarmer: game.i18n.localize("MNBL.disarm")
|
|
||||||
},
|
|
||||||
couverts: {
|
|
||||||
aucun: { name: game.i18n.localize("MNBL.none"), value: 0 },
|
|
||||||
rondache: { name: game.i18n.localize("MNBL.lightcover"), value: -2 },
|
|
||||||
pavois: { name: game.i18n.localize("MNBL.mediumcover"), value: -5 },
|
|
||||||
complet: { name: game.i18n.localize("MNBL.heavycover"), value: -10 },
|
|
||||||
},
|
|
||||||
modifierTypes: {
|
|
||||||
aucun: { name: game.i18n.localize("MNBL.none"), value: 0 },
|
|
||||||
roll: { name: game.i18n.localize("MNBL.roll"), value: 0 },
|
|
||||||
degats: { name: game.i18n.localize("MNBL.damage"), value: 0 },
|
|
||||||
defense: { name: game.i18n.localize("MNBL.defensecapacity"), value: 0 },
|
|
||||||
attaque: { name: game.i18n.localize("MNBL.attackcapacity"), value: 0 },
|
|
||||||
},
|
|
||||||
listeNiveau: {
|
|
||||||
},
|
|
||||||
listeNiveauCreature: {
|
|
||||||
},
|
|
||||||
listePortees: {
|
|
||||||
"10": game.i18n.localize("MNBL.lessthanshort"),
|
|
||||||
"15": game.i18n.localize("MNBL.shortmore"),
|
|
||||||
"20": game.i18n.localize("MNBL.mediummore"),
|
|
||||||
"25": game.i18n.localize("MNBL.longmore")
|
|
||||||
},
|
|
||||||
modificateurOptions: {},
|
|
||||||
pointsAmeOptions: {},
|
|
||||||
difficulteOptions: {
|
|
||||||
"0": game.i18n.localize("MNBL.noneunknwon"),
|
|
||||||
"5": game.i18n.localize("MNBL.easy"),
|
|
||||||
"10": game.i18n.localize("MNBL.medium"),
|
|
||||||
"15": game.i18n.localize("MNBL.hard"),
|
|
||||||
"20": game.i18n.localize("MNBL.hazardous"),
|
|
||||||
"25": game.i18n.localize("MNBL.insane"),
|
|
||||||
"30": game.i18n.localize("MNBL.puremadness")
|
|
||||||
},
|
|
||||||
attributs: {
|
|
||||||
adr: game.i18n.localize("Adresse"), pui: game.i18n.localize("Puissance"),
|
|
||||||
cla: game.i18n.localize("Clairvoyance"), pre: game.i18n.localize("Présence"), tre: game.i18n.localize("Trempe")
|
|
||||||
},
|
|
||||||
lancementRuneOptions: {
|
|
||||||
prononcer: game.i18n.localize("MNBL.pronouncerune"),
|
|
||||||
inscrire: game.i18n.localize("MNBL.tracerune")
|
|
||||||
},
|
|
||||||
effetRuneOptions: {
|
|
||||||
prononcee: game.i18n.localize("MNBL.pronounced"),
|
|
||||||
inscrite: game.i18n.localize("MNBL.traced")
|
|
||||||
},
|
|
||||||
typeArmeOptions: {
|
|
||||||
contact: game.i18n.localize("MNBL.meleeweapon"),
|
|
||||||
contactjet: game.i18n.localize("MNBL.meleethrowweapon"),
|
|
||||||
jet: game.i18n.localize("MNBL.throwweapon"),
|
|
||||||
tir: game.i18n.localize("MNBL.shootweapon"),
|
|
||||||
special: game.i18n.localize("MNBL.specialweapon")
|
|
||||||
},
|
|
||||||
allegeanceOptions: {
|
|
||||||
tous: game.i18n.localize("MNBL.all"),
|
|
||||||
chaos: game.i18n.localize("MNBL.chaos"),
|
|
||||||
loi: game.i18n.localize("MNBL.law"),
|
|
||||||
betes: game.i18n.localize("MNBL.beastslords"),
|
|
||||||
elementaires: game.i18n.localize("MNBL.elementslords")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return MOURNBLADE_CONFIG;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
@ -1,25 +0,0 @@
|
|||||||
/**
|
|
||||||
* Extend the basic ActorSheet with some very simple modifications
|
|
||||||
* @extends {ActorSheet}
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { MournbladeActorSheet } from "./mournblade-actor-sheet.js";
|
|
||||||
import { MournbladeUtility } from "./mournblade-utility.js";
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
export class MournbladeCreatureSheet extends MournbladeActorSheet {
|
|
||||||
|
|
||||||
/** @override */
|
|
||||||
static get defaultOptions() {
|
|
||||||
|
|
||||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
|
||||||
classes: ["fvtt-mournblade", "sheet", "actor"],
|
|
||||||
template: "systems/fvtt-mournblade/templates/creature-sheet.html",
|
|
||||||
width: 640,
|
|
||||||
height: 720,
|
|
||||||
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }],
|
|
||||||
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
|
|
||||||
editScore: false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
@ -9,7 +9,7 @@ export class MournbladeItemSheet extends ItemSheet {
|
|||||||
/** @override */
|
/** @override */
|
||||||
static get defaultOptions() {
|
static get defaultOptions() {
|
||||||
|
|
||||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
return mergeObject(super.defaultOptions, {
|
||||||
classes: ["fvtt-mournblade", "sheet", "item"],
|
classes: ["fvtt-mournblade", "sheet", "item"],
|
||||||
template: "systems/fvtt-mournblade/templates/item-sheet.html",
|
template: "systems/fvtt-mournblade/templates/item-sheet.html",
|
||||||
dragDrop: [{ dragSelector: null, dropSelector: null }],
|
dragDrop: [{ dragSelector: null, dropSelector: null }],
|
||||||
@ -48,7 +48,7 @@ export class MournbladeItemSheet extends ItemSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
async getData() {
|
async getData() {
|
||||||
const objectData = foundry.utils.duplicate(this.object)
|
const objectData = duplicate(this.object)
|
||||||
let itemData = objectData
|
let itemData = objectData
|
||||||
let formData = {
|
let formData = {
|
||||||
title: this.title,
|
title: this.title,
|
||||||
@ -63,15 +63,10 @@ export class MournbladeItemSheet extends ItemSheet {
|
|||||||
limited: this.object.limited,
|
limited: this.object.limited,
|
||||||
options: this.options,
|
options: this.options,
|
||||||
owner: this.document.isOwner,
|
owner: this.document.isOwner,
|
||||||
description: await TextEditor.enrichHTML(this.object.system.description, {async: true}),
|
|
||||||
config: game.system.mournblade.config,
|
|
||||||
mr: (this.object.type == 'specialisation'),
|
mr: (this.object.type == 'specialisation'),
|
||||||
isGM: game.user.isGM
|
isGM: game.user.isGM
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( objectData.type == "don") {
|
|
||||||
formData.sacrifice = await TextEditor.enrichHTML(this.object.system.sacrifice, {async: true})
|
|
||||||
}
|
|
||||||
//this.options.editable = !(this.object.origin == "embeddedItem");
|
//this.options.editable = !(this.object.origin == "embeddedItem");
|
||||||
console.log("ITEM DATA", formData, this);
|
console.log("ITEM DATA", formData, this);
|
||||||
return formData;
|
return formData;
|
||||||
@ -91,7 +86,7 @@ export class MournbladeItemSheet extends ItemSheet {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
postItem() {
|
postItem() {
|
||||||
let chatData = foundry.utils.duplicate(MournbladeUtility.data(this.item));
|
let chatData = duplicate(MournbladeUtility.data(this.item));
|
||||||
if (this.actor) {
|
if (this.actor) {
|
||||||
chatData.actor = { id: this.actor.id };
|
chatData.actor = { id: this.actor.id };
|
||||||
}
|
}
|
||||||
@ -134,28 +129,28 @@ export class MournbladeItemSheet extends ItemSheet {
|
|||||||
html.find('.edit-prediction').change(ev => {
|
html.find('.edit-prediction').change(ev => {
|
||||||
const li = $(ev.currentTarget).parents(".prediction-item")
|
const li = $(ev.currentTarget).parents(".prediction-item")
|
||||||
let index = li.data("prediction-index")
|
let index = li.data("prediction-index")
|
||||||
let pred = foundry.utils.duplicate(this.object.system.predilections)
|
let pred = duplicate(this.object.system.predilections)
|
||||||
pred[index].name = ev.currentTarget.value
|
pred[index].name = ev.currentTarget.value
|
||||||
this.object.update( { 'system.predilections': pred })
|
this.object.update( { 'data.predilections': pred })
|
||||||
})
|
})
|
||||||
html.find('.delete-prediction').click(ev => {
|
html.find('.delete-prediction').click(ev => {
|
||||||
const li = $(ev.currentTarget).parents(".prediction-item")
|
const li = $(ev.currentTarget).parents(".prediction-item")
|
||||||
let index = li.data("prediction-index")
|
let index = li.data("prediction-index")
|
||||||
let pred = foundry.utils.duplicate(this.object.system.predilections)
|
let pred = duplicate(this.object.system.predilections)
|
||||||
pred.splice(index,1)
|
pred.splice(index,1)
|
||||||
this.object.update( { 'system.predilections': pred })
|
this.object.update( { 'data.predilections': pred })
|
||||||
})
|
})
|
||||||
html.find('.use-prediction').change(ev => {
|
html.find('.use-prediction').change(ev => {
|
||||||
const li = $(ev.currentTarget).parents(".prediction-item")
|
const li = $(ev.currentTarget).parents(".prediction-item")
|
||||||
let index = li.data("prediction-index")
|
let index = li.data("prediction-index")
|
||||||
let pred = foundry.utils.duplicate(this.object.system.predilections)
|
let pred = duplicate(this.object.system.predilections)
|
||||||
pred[index].used = ev.currentTarget.checked
|
pred[index].used = ev.currentTarget.checked
|
||||||
this.object.update( { 'system.predilections': pred })
|
this.object.update( { 'data.predilections': pred })
|
||||||
})
|
})
|
||||||
html.find('#add-predilection').click(ev => {
|
html.find('#add-predilection').click(ev => {
|
||||||
let pred = foundry.utils.duplicate(this.object.system.predilections)
|
let pred = duplicate(this.object.system.predilections)
|
||||||
pred.push( { name: "Nouvelle prédilection", id: randomID(), used: false })
|
pred.push( { name: "Nouvelle prédilection", used: false })
|
||||||
this.object.update( { 'system.predilections': pred })
|
this.object.update( { 'data.predilections': pred })
|
||||||
})
|
})
|
||||||
// Update Inventory Item
|
// Update Inventory Item
|
||||||
html.find('.item-delete').click(ev => {
|
html.find('.item-delete').click(ev => {
|
||||||
|
@ -11,10 +11,8 @@ export const defaultItemImg = {
|
|||||||
predilection: "systems/fvtt-mournblade/assets/icons/predilection.webp",
|
predilection: "systems/fvtt-mournblade/assets/icons/predilection.webp",
|
||||||
protection: "systems/fvtt-mournblade/assets/icons/protection.webp",
|
protection: "systems/fvtt-mournblade/assets/icons/protection.webp",
|
||||||
rune: "systems/fvtt-mournblade/assets/icons/rune.webp",
|
rune: "systems/fvtt-mournblade/assets/icons/rune.webp",
|
||||||
runeeffect: "systems/fvtt-mournblade/assets/icons/rune.webp",
|
|
||||||
tendance: "systems/fvtt-mournblade/assets/icons/tendance.webp",
|
tendance: "systems/fvtt-mournblade/assets/icons/tendance.webp",
|
||||||
traitchaotique: "systems/fvtt-mournblade/assets/icons/traitchaotique.webp",
|
traitchaotique: "systems/fvtt-mournblade/assets/icons/traitchaotique.webp",
|
||||||
traitespece: "systems/fvtt-mournblade/assets/icons/capacite.webp"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -11,11 +11,10 @@
|
|||||||
import { MournbladeActor } from "./mournblade-actor.js";
|
import { MournbladeActor } from "./mournblade-actor.js";
|
||||||
import { MournbladeItemSheet } from "./mournblade-item-sheet.js";
|
import { MournbladeItemSheet } from "./mournblade-item-sheet.js";
|
||||||
import { MournbladeActorSheet } from "./mournblade-actor-sheet.js";
|
import { MournbladeActorSheet } from "./mournblade-actor-sheet.js";
|
||||||
import { MournbladeCreatureSheet } from "./mournblade-creature-sheet.js";
|
//import { MournbladeNPCSheet } from "./mournblade-npc-sheet.js";
|
||||||
import { MournbladeUtility } from "./mournblade-utility.js";
|
import { MournbladeUtility } from "./mournblade-utility.js";
|
||||||
import { MournbladeCombat } from "./mournblade-combat.js";
|
import { MournbladeCombat } from "./mournblade-combat.js";
|
||||||
import { MournbladeItem } from "./mournblade-item.js";
|
import { MournbladeItem } from "./mournblade-item.js";
|
||||||
import { MournbladeConfig } from "./mournblade-config.js";
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Foundry VTT Initialization */
|
/* Foundry VTT Initialization */
|
||||||
@ -46,15 +45,13 @@ Hooks.once("init", async function () {
|
|||||||
CONFIG.Combat.documentClass = MournbladeCombat
|
CONFIG.Combat.documentClass = MournbladeCombat
|
||||||
CONFIG.Actor.documentClass = MournbladeActor
|
CONFIG.Actor.documentClass = MournbladeActor
|
||||||
CONFIG.Item.documentClass = MournbladeItem
|
CONFIG.Item.documentClass = MournbladeItem
|
||||||
game.system.mournblade = {
|
game.system.mournblade = { }
|
||||||
config : MournbladeConfig.getConfig(),
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
// Register sheet application classes
|
// Register sheet application classes
|
||||||
Actors.unregisterSheet("core", ActorSheet);
|
Actors.unregisterSheet("core", ActorSheet);
|
||||||
Actors.registerSheet("fvtt-mournblade", MournbladeActorSheet, { types: ["personnage"], makeDefault: true })
|
Actors.registerSheet("fvtt-mournblade", MournbladeActorSheet, { types: ["personnage"], makeDefault: true })
|
||||||
Actors.registerSheet("fvtt-mournblade", MournbladeCreatureSheet, { types: ["creature"], makeDefault: true })
|
//Actors.registerSheet("fvtt-mournblade", MournbladeNPCSheet, { types: ["npc"], makeDefault: false });
|
||||||
|
|
||||||
Items.unregisterSheet("core", ItemSheet);
|
Items.unregisterSheet("core", ItemSheet);
|
||||||
Items.registerSheet("fvtt-mournblade", MournbladeItemSheet, { makeDefault: true })
|
Items.registerSheet("fvtt-mournblade", MournbladeItemSheet, { makeDefault: true })
|
||||||
@ -70,32 +67,14 @@ function welcomeMessage() {
|
|||||||
whisper: [game.user.id],
|
whisper: [game.user.id],
|
||||||
content: `<div id="welcome-message-Mournblade"><span class="rdd-roll-part">
|
content: `<div id="welcome-message-Mournblade"><span class="rdd-roll-part">
|
||||||
<strong>Bienvenue dans les Jeunes Royaumes de Mournblade !</strong>
|
<strong>Bienvenue dans les Jeunes Royaumes de Mournblade !</strong>
|
||||||
<p>Les livres de Mournblade sont nécessaires pour jouer : https://www.titam-france.fr</p>
|
|
||||||
<p>Mournblade est jeu de rôle publié par Titam France/Sombres projets, tout les droits leur appartiennent.</p>
|
|
||||||
<p>Système développé par LeRatierBretonnien, support sur le <a href="https://discord.gg/pPSDNJk">Discord FR de Foundry</a>.</p>
|
|
||||||
` });
|
` });
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
async function importDefaultScene() {
|
|
||||||
let exists = game.scenes.find(j => j.name == "Accueil");
|
|
||||||
if (!exists) {
|
|
||||||
const scenes = await MournbladeUtility.loadCompendium("fvtt-mournblade.scenes")
|
|
||||||
let newDocuments = scenes.filter(i => i.name == "Accueil");
|
|
||||||
await game.scenes.documentClass.create(newDocuments);
|
|
||||||
game.scenes.find(i => i.name == "Accueil").activate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Foundry VTT Initialization */
|
/* Foundry VTT Initialization */
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
Hooks.once("ready", function () {
|
Hooks.once("ready", function () {
|
||||||
|
|
||||||
game.system.mournblade = {
|
|
||||||
config : MournbladeConfig.getConfig(),
|
|
||||||
}
|
|
||||||
|
|
||||||
MournbladeUtility.ready();
|
MournbladeUtility.ready();
|
||||||
// User warning
|
// User warning
|
||||||
if (!game.user.isGM && game.user.character == undefined) {
|
if (!game.user.isGM && game.user.character == undefined) {
|
||||||
@ -105,22 +84,13 @@ Hooks.once("ready", function () {
|
|||||||
user: game.user._id
|
user: game.user._id
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (!game.user.isGM && game.user.character && !game.user.character.prototypeToken.actorLink) {
|
|
||||||
ui.notifications.info("Le token de du joueur n'est pas connecté à l'acteur !");
|
// CSS patch for v9
|
||||||
ChatMessage.create({
|
if (game.version) {
|
||||||
content: "<b>ATTENTION</b> Le token du joueur " + game.user.name + " n'est pas connecté à l'acteur !",
|
let sidebar = document.getElementById("sidebar");
|
||||||
user: game.user._id
|
sidebar.style.width = "min-content";
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter=>{
|
|
||||||
console.log("ClassCounter loaded", moduleCounter)
|
|
||||||
moduleCounter.ClassCounter.registerUsageCount()
|
|
||||||
}).catch(err=>
|
|
||||||
console.log("No stats available, giving up.")
|
|
||||||
)
|
|
||||||
|
|
||||||
importDefaultScene();
|
|
||||||
welcomeMessage();
|
welcomeMessage();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ export class MournbladeRollDialog extends Dialog {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async create(actor, rollData ) {
|
static async create(actor, rollData ) {
|
||||||
|
|
||||||
let options = { classes: ["MournbladeDialog"], width: 340, height: 'fit-content', 'z-index': 99999 };
|
let options = { classes: ["MournbladeDialog"], width: 340, height: 420, 'z-index': 99999 };
|
||||||
let html = await renderTemplate('systems/fvtt-mournblade/templates/roll-dialog-generic.html', rollData);
|
let html = await renderTemplate('systems/fvtt-mournblade/templates/roll-dialog-generic.html', rollData);
|
||||||
|
|
||||||
return new MournbladeRollDialog(actor, rollData, html, options );
|
return new MournbladeRollDialog(actor, rollData, html, options );
|
||||||
@ -52,22 +52,14 @@ export class MournbladeRollDialog extends Dialog {
|
|||||||
activateListeners(html) {
|
activateListeners(html) {
|
||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
|
|
||||||
|
var dialog = this;
|
||||||
function onLoad() {
|
function onLoad() {
|
||||||
}
|
}
|
||||||
$(function () { onLoad(); });
|
$(function () { onLoad(); });
|
||||||
|
|
||||||
html.find('.apply-modifier').change(async (event) => {
|
|
||||||
let modifierIdx = $(event.currentTarget).data("modifier-idx")
|
|
||||||
let modifier = this.rollData.modifiers[modifierIdx]
|
|
||||||
modifier.system.apply = event.currentTarget.checked
|
|
||||||
})
|
|
||||||
|
|
||||||
html.find('#modificateur').change(async (event) => {
|
html.find('#modificateur').change(async (event) => {
|
||||||
this.rollData.modificateur = Number(event.currentTarget.value)
|
this.rollData.modificateur = Number(event.currentTarget.value)
|
||||||
})
|
})
|
||||||
html.find('#typeAttaque').change(async (event) => {
|
|
||||||
this.rollData.typeAttaque = String(event.currentTarget.value)
|
|
||||||
})
|
|
||||||
html.find('#difficulte').change(async (event) => {
|
html.find('#difficulte').change(async (event) => {
|
||||||
this.rollData.difficulte = Number(event.currentTarget.value)
|
this.rollData.difficulte = Number(event.currentTarget.value)
|
||||||
})
|
})
|
||||||
@ -80,41 +72,8 @@ export class MournbladeRollDialog extends Dialog {
|
|||||||
html.find('#runeame').change(async (event) => {
|
html.find('#runeame').change(async (event) => {
|
||||||
this.rollData.runeame = Number(event.currentTarget.value)
|
this.rollData.runeame = Number(event.currentTarget.value)
|
||||||
})
|
})
|
||||||
html.find('#isMonte').change(async (event) => {
|
|
||||||
this.rollData.desavantages.isMonte = event.currentTarget.checked
|
|
||||||
})
|
|
||||||
|
|
||||||
html.find('#cibleausol').change(async (event) => {
|
|
||||||
this.rollData.desavantages.cibleausol = event.currentTarget.checked
|
|
||||||
})
|
|
||||||
html.find('#cibledesarmee').change(async (event) => {
|
|
||||||
this.rollData.desavantages.cibledesarmee = event.currentTarget.checked
|
|
||||||
})
|
|
||||||
html.find('#ciblerestreint').change(async (event) => {
|
|
||||||
this.rollData.desavantages.ciblerestreint = event.currentTarget.checked
|
|
||||||
})
|
|
||||||
html.find('#cibleimmobilisée').change(async (event) => {
|
|
||||||
this.rollData.desavantages.cibleimmobilisée = event.currentTarget.checked
|
|
||||||
})
|
|
||||||
html.find('#ciblesurplomb').change(async (event) => {
|
|
||||||
this.rollData.desavantages.ciblesurplomb = event.currentTarget.checked
|
|
||||||
})
|
|
||||||
|
|
||||||
html.find('#doubleD20').change(async (event) => {
|
html.find('#doubleD20').change(async (event) => {
|
||||||
this.rollData.doubleD20 = event.currentTarget.checked
|
this.rollData.doubleD20 = event.currentTarget.checked
|
||||||
})
|
})
|
||||||
html.find('#visee').change(async (event) => {
|
|
||||||
this.rollData.visee = event.currentTarget.checked
|
|
||||||
})
|
|
||||||
html.find('#cibleconsciente').change(async (event) => {
|
|
||||||
this.rollData.cibleconsciente = event.currentTarget.checked
|
|
||||||
})
|
|
||||||
html.find('#ciblecourt').change(async (event) => {
|
|
||||||
this.rollData.ciblecourt = event.currentTarget.checked
|
|
||||||
})
|
|
||||||
html.find('#typeCouvert').change(async (event) => {
|
|
||||||
this.rollData.typeCouvert = String(event.currentTarget.value)
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -10,11 +10,13 @@ export class MournbladeUtility {
|
|||||||
static async init() {
|
static async init() {
|
||||||
Hooks.on('renderChatLog', (log, html, data) => MournbladeUtility.chatListeners(html))
|
Hooks.on('renderChatLog', (log, html, data) => MournbladeUtility.chatListeners(html))
|
||||||
Hooks.on("getChatLogEntryContext", (html, options) => MournbladeUtility.chatRollMenu(html, options))
|
Hooks.on("getChatLogEntryContext", (html, options) => MournbladeUtility.chatRollMenu(html, options))
|
||||||
Hooks.on('renderChatMessage', (message, html, data) => MournbladeUtility.chatMessageHandler(message, html, data))
|
|
||||||
|
|
||||||
Hooks.on("getCombatTrackerEntryContext", (html, options) => {
|
Hooks.on("getCombatTrackerEntryContext", (html, options) => {
|
||||||
MournbladeUtility.pushInitiativeOptions(html, options);
|
MournbladeUtility.pushInitiativeOptions(html, options);
|
||||||
})
|
})
|
||||||
|
Hooks.on("dropCanvasData", (canvas, data) => {
|
||||||
|
MournbladeUtility.dropItemOnToken(canvas, data)
|
||||||
|
});
|
||||||
|
|
||||||
this.rollDataStore = {}
|
this.rollDataStore = {}
|
||||||
this.defenderStore = {}
|
this.defenderStore = {}
|
||||||
@ -44,28 +46,28 @@ export class MournbladeUtility {
|
|||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getActorFromRollData(rollData) {
|
static getModificateurOptions() {
|
||||||
let actor = game.actors.get(rollData.actorId)
|
let opt = []
|
||||||
if (rollData.tokenId) {
|
for (let i = -15; i <= 15; i++) {
|
||||||
let token = canvas.tokens.placeables.find(t => t.id == rollData.tokenId)
|
opt.push(`<option value="${i}">${i}</option>`)
|
||||||
if (token) {
|
|
||||||
actor = token.actor
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return actor
|
return opt.concat("\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static sortArrayObjectsByName(myArray) {
|
static getPointAmeOptions() {
|
||||||
myArray.sort((a, b) => {
|
let opt = []
|
||||||
return a.name.localeCompare(b.name);
|
for (let i = 1; i <= 20; i++) {
|
||||||
})
|
opt.push(`<option value="${i}">${i}</option>`)
|
||||||
|
}
|
||||||
|
return opt.concat("\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getAttributs() {
|
static getAttributs() {
|
||||||
return game.system.mournblade.config.attributs
|
return { adr: "Adresse", pui: "Puissance", cla: "Clairvoyance", pre: "Présence", tre: "Trempe" }
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static pushInitiativeOptions(html, options) {
|
static pushInitiativeOptions(html, options) {
|
||||||
@ -80,11 +82,6 @@ export class MournbladeUtility {
|
|||||||
static async ready() {
|
static async ready() {
|
||||||
const skills = await MournbladeUtility.loadCompendium("fvtt-mournblade.skills")
|
const skills = await MournbladeUtility.loadCompendium("fvtt-mournblade.skills")
|
||||||
this.skills = skills.map(i => i.toObject())
|
this.skills = skills.map(i => i.toObject())
|
||||||
|
|
||||||
game.system.mournblade.config.listeNiveauSkill = MournbladeUtility.createDirectOptionList(0, 10)
|
|
||||||
game.system.mournblade.config.listeNiveauCreature = MournbladeUtility.createDirectOptionList(0, 35)
|
|
||||||
game.system.mournblade.config.modificateurOptions = MournbladeUtility.createArrayOptionList(-15, 15)
|
|
||||||
game.system.mournblade.config.pointsAmeOptions = MournbladeUtility.createDirectOptionList(0, 20)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
@ -103,59 +100,18 @@ export class MournbladeUtility {
|
|||||||
static getOptionsStatusList() {
|
static getOptionsStatusList() {
|
||||||
return this.optionsStatusList;
|
return this.optionsStatusList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static getPredilection(comp, predIdx) {
|
|
||||||
let pred = foundry.utils.duplicate(comp.system.predilections)
|
|
||||||
return foundry.utils.duplicate(pred[predIdx] || { name: "Error!" })
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static async chatMessageHandler(message, html, data) {
|
|
||||||
const chatCard = html.find('.action-section')
|
|
||||||
if (chatCard.length > 0) {
|
|
||||||
// If the user is the message author or the actor owner, proceed
|
|
||||||
const actor = game.actors.get(data.message.speaker.actor)
|
|
||||||
// DEBUG : console.log("FOUND 1!!! ", actor, data.message)
|
|
||||||
if (actor?.isOwner || game.user.isGM) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
chatCard.hide()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async chatListeners(html) {
|
static async chatListeners(html) {
|
||||||
|
|
||||||
html.on("click", '.predilection-reroll', async event => {
|
html.on("click", '.predilection-reroll', async event => {
|
||||||
let predIdx = $(event.currentTarget).data("predilection-index")
|
let predIdx = $(event.currentTarget).data("predilection-index")
|
||||||
let messageId = MournbladeUtility.findChatMessageId(event.currentTarget)
|
let messageId = MournbladeUtility.findChatMessageId(event.currentTarget)
|
||||||
let message = game.messages.get(messageId)
|
let message = game.messages.get(messageId)
|
||||||
let rollData = message.getFlag("world", "mournblade-roll")
|
let rollData = message.getFlag("world", "mournblade-roll")
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
await actor.setPredilectionUsed(rollData.competence._id, predIdx)
|
await actor.setPredilectionUsed( rollData.competence._id, predIdx)
|
||||||
rollData.competence = foundry.utils.duplicate(actor.getCompetence(rollData.competence._id))
|
rollData.competence = duplicate( actor.getCompetence(rollData.competence._id) )
|
||||||
rollData.predilectionUsed = MournbladeUtility.getPredilection(rollData.competence, predIdx)
|
MournbladeUtility.rollMournblade(rollData)
|
||||||
await MournbladeUtility.rollMournblade(rollData)
|
|
||||||
})
|
|
||||||
|
|
||||||
html.on("click", '.arme-roll-degats', async event => {
|
|
||||||
let messageId = MournbladeUtility.findChatMessageId(event.currentTarget)
|
|
||||||
let message = game.messages.get(messageId)
|
|
||||||
let rollData = message.getFlag("world", "mournblade-roll")
|
|
||||||
MournbladeUtility.rollDegatsFromAttaque(rollData)
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
html.on("click", '.arme-apply-degats', async event => {
|
|
||||||
let messageId = MournbladeUtility.findChatMessageId(event.currentTarget)
|
|
||||||
let message = game.messages.get(messageId)
|
|
||||||
let rollData = message.getFlag("world", "mournblade-roll")
|
|
||||||
if (game.user.isGM) {
|
|
||||||
MournbladeUtility.applyDegatsFromAttaque(rollData)
|
|
||||||
} else {
|
|
||||||
game.socket.emit("system.fvtt-mournblade", { name: "msg_apply_damage", data: { rolLData: rollData } })
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,7 +120,8 @@ export class MournbladeUtility {
|
|||||||
|
|
||||||
const templatePaths = [
|
const templatePaths = [
|
||||||
'systems/fvtt-mournblade/templates/editor-notes-gm.html',
|
'systems/fvtt-mournblade/templates/editor-notes-gm.html',
|
||||||
'systems/fvtt-mournblade/templates/partial-item-description.html'
|
'systems/fvtt-mournblade/templates/partial-item-description.html',
|
||||||
|
'systems/fvtt-mournblade/templates/partial-list-niveau.html'
|
||||||
]
|
]
|
||||||
return loadTemplates(templatePaths);
|
return loadTemplates(templatePaths);
|
||||||
}
|
}
|
||||||
@ -206,10 +163,12 @@ export class MournbladeUtility {
|
|||||||
}
|
}
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
static createArrayOptionList(min, max) {
|
|
||||||
let options = [];
|
/* -------------------------------------------- */
|
||||||
|
static buildListOptions(min, max) {
|
||||||
|
let options = ""
|
||||||
for (let i = min; i <= max; i++) {
|
for (let i = min; i <= max; i++) {
|
||||||
options.push({key:`${i}`, label:`${i}`});
|
options += `<option value="${i}">${i}</option>`
|
||||||
}
|
}
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
@ -224,6 +183,27 @@ export class MournbladeUtility {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static getDefenseState(actorId) {
|
||||||
|
return this.defenderStore[actorId];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static updateRollData(rollData) {
|
||||||
|
|
||||||
|
let id = rollData.rollId;
|
||||||
|
let oldRollData = this.rollDataStore[id] || {};
|
||||||
|
let newRollData = mergeObject(oldRollData, rollData);
|
||||||
|
this.rollDataStore[id] = newRollData;
|
||||||
|
}
|
||||||
|
/* -------------------------------------------- */
|
||||||
|
static saveRollData(rollData) {
|
||||||
|
game.socket.emit("system.fvtt-mournblade", {
|
||||||
|
name: "msg_update_roll", data: rollData
|
||||||
|
}); // Notify all other clients of the roll
|
||||||
|
this.updateRollData(rollData);
|
||||||
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getRollData(id) {
|
static getRollData(id) {
|
||||||
return this.rollDataStore[id];
|
return this.rollDataStore[id];
|
||||||
@ -231,10 +211,12 @@ export class MournbladeUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static onSocketMesssage(msg) {
|
static onSocketMesssage(msg) {
|
||||||
if (msg.name == "msg_apply_damage") {
|
//console.log("SOCKET MESSAGE", msg.name, game.user.character.id, msg.data.defenderId);
|
||||||
if (game.user.isGM) {
|
if (msg.name == "msg_update_defense_state") {
|
||||||
this.applyDegatsFromAttaque(msg.data.rollData);
|
this.updateDefenseState(msg.data.defenderId, msg.data.rollId);
|
||||||
}
|
}
|
||||||
|
if (msg.name == "msg_update_roll") {
|
||||||
|
this.updateRollData(msg.data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -299,274 +281,84 @@ export class MournbladeUtility {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//console.log("Result : ", rollData)
|
|
||||||
if (rollData.difficulte > 0 && !rollData.isDramatique) {
|
if (rollData.difficulte > 0 && !rollData.isDramatique) {
|
||||||
rollData.isSuccess = (rollData.finalResult >= rollData.difficulte)
|
rollData.isSuccess = (rollData.roll.finalResult >= rollData.difficulte)
|
||||||
rollData.isHeroique = ((rollData.finalResult - rollData.difficulte) >= 10)
|
rollData.isHeroique = ((rollData.roll.finalResult - rollData.difficulte) >= 10)
|
||||||
rollData.isDramatique = ((rollData.finalResult - rollData.difficulte) <= -10)
|
rollData.isDramatique = ((rollData.roll.finalResult - rollData.difficulte) <= -10)
|
||||||
rollData.isPureSuccess = (rollData.isSuccess && !rollData.isHeroique)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async rollMournblade(rollData) {
|
static async rollMournblade(rollData) {
|
||||||
|
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
if (rollData.attrKey == "tochoose") { // No attr selected, force address
|
if (rollData.attrKey == "tochoose") { // No attr selected, force address
|
||||||
rollData.attrKey = "adr"
|
rollData.attrKey = "adr"
|
||||||
}
|
}
|
||||||
if (!rollData.attr) {
|
if ( !rollData.attr) {
|
||||||
rollData.actionImg = "systems/fvtt-mournblade/assets/icons/" + actor.system.attributs[rollData.attrKey].labelnorm + ".webp"
|
rollData.actionImg = "systems/fvtt-mournblade/assets/icons/" + actor.system.attributs[rollData.attrKey].labelnorm + ".webp"
|
||||||
rollData.attr = foundry.utils.duplicate(actor.system.attributs[rollData.attrKey])
|
rollData.attr = duplicate(actor.system.attributs[rollData.attrKey])
|
||||||
}
|
}
|
||||||
|
|
||||||
rollData.diceFormula = rollData.mainDice
|
rollData.diceFormula = rollData.mainDice
|
||||||
if (rollData.doubleD20) { // Multiply result !
|
if ( rollData.doubleD20) { // Multiply result !
|
||||||
rollData.diceFormula += "*2"
|
rollData.diceFormula += "*2"
|
||||||
if (!rollData.isReroll) {
|
if (!rollData.isReroll) {
|
||||||
actor.changeEclat(-1)
|
actor.changeEclat(-1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//console.log("BEFORE COMP", rollData)
|
|
||||||
if (rollData.competence) {
|
if (rollData.competence) {
|
||||||
rollData.predilections = foundry.utils.duplicate(rollData.competence.system.predilections)
|
rollData.predilections = duplicate( rollData.competence.system.predilections.filter( pred => !pred.used) || [] )
|
||||||
let compmod = (rollData.competence.system.niveau == 0) ? -3 : 0
|
let compmod = (rollData.competence.system.niveau == 0) ? -3 : 0
|
||||||
rollData.diceFormula += `+${rollData.attr.value}+${rollData.competence.system.niveau}+${rollData.modificateur}+${compmod}`
|
rollData.diceFormula += `+${rollData.attr.value}+${rollData.competence.system.niveau}+${rollData.modificateur}+${compmod}`
|
||||||
} else {
|
} else {
|
||||||
rollData.diceFormula += `+${rollData.attr.value}*2+${rollData.modificateur}`
|
rollData.diceFormula += `+${rollData.attr.value}*2+${rollData.modificateur}`
|
||||||
}
|
}
|
||||||
rollData.diceFormula += `+${rollData.malusSante}+${rollData.malusAme}`
|
|
||||||
|
|
||||||
if (rollData.arme?.type == "arme") {
|
if (rollData.arme) {
|
||||||
rollData.diceFormula += `+${rollData.arme.system.bonusmaniementoff}`
|
rollData.diceFormula += `+${rollData.arme.system.bonusmaniementoff}`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply modifiers
|
if(rollData.rune) {
|
||||||
for (let modifier of rollData.modifiers) {
|
rollData.runeduree = Math.ceil((rollData.runeame+3) / 3)
|
||||||
if (modifier.system.modifiertype == "roll" && modifier.system.apply) {
|
if ( rollData.runemode == "inscrire") {
|
||||||
rollData.diceFormula += `+${modifier.system.value}`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Apply desavantages
|
|
||||||
let desavantagesBonus = 0
|
|
||||||
for (let desavantage in rollData.desavantages) {
|
|
||||||
if (rollData.desavantages[desavantage]) {
|
|
||||||
desavantagesBonus += 5
|
|
||||||
}
|
|
||||||
}
|
|
||||||
desavantagesBonus = Math.min(15, desavantagesBonus)
|
|
||||||
rollData.diceFormula += `+${desavantagesBonus}`
|
|
||||||
|
|
||||||
// Monté ?
|
|
||||||
if (rollData.isMonte) {
|
|
||||||
rollData.diceFormula += "+5"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Specific modifier for distance
|
|
||||||
if (rollData.arme?.system?.isDistance) {
|
|
||||||
if (rollData.visee) {
|
|
||||||
rollData.diceFormula += "+5"
|
|
||||||
}
|
|
||||||
if (rollData.cibleconsciente) {
|
|
||||||
rollData.diceFormula += `-${rollData.defender.system.attributs.adr.value}`
|
|
||||||
}
|
|
||||||
if (rollData.ciblecourt) {
|
|
||||||
if (rollData.difficulte <= 15) { // Portée courte ou moins
|
|
||||||
rollData.diceFormula += `-5`
|
|
||||||
} else {
|
|
||||||
rollData.diceFormula += `-10`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (rollData.typeCouvert != "aucun") {
|
|
||||||
rollData.diceFormula += `+${rollData.config.couverts[rollData.typeCouvert].value}`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rollData.rune) {
|
|
||||||
rollData.runeduree = Math.ceil((rollData.runeame + 3) / 3)
|
|
||||||
if (rollData.runemode == "inscrire") {
|
|
||||||
rollData.runeduree *= 2
|
rollData.runeduree *= 2
|
||||||
}
|
}
|
||||||
if (rollData.runemode == "prononcer") {
|
|
||||||
rollData.runeduree = 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let myRoll = await new Roll(rollData.diceFormula).evaluate();
|
let myRoll = new Roll(rollData.diceFormula).roll({ async: false })
|
||||||
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
|
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"));
|
||||||
rollData.roll = foundry.utils.duplicate(myRoll)
|
rollData.roll = myRoll
|
||||||
rollData.diceResult = myRoll.terms[0].results[0].result
|
|
||||||
console.log(">>>> ", myRoll)
|
console.log(">>>> ", myRoll)
|
||||||
|
|
||||||
rollData.finalResult = myRoll.total
|
rollData.finalResult = myRoll.total
|
||||||
this.computeResult(rollData)
|
this.computeResult( rollData)
|
||||||
|
|
||||||
// Application immédiate selon type de jet
|
if (rollData.rune ) {
|
||||||
if (rollData.rune) {
|
|
||||||
let subAme = rollData.runeame
|
let subAme = rollData.runeame
|
||||||
if (rollData.isEchec && !rollData.isDramatique) {
|
if ( rollData.isEchec && !rollData.isDramatique) {
|
||||||
subAme = Math.ceil((subAme + 1) / 2)
|
subAme = Math.ceil((subAme+1) / 2)
|
||||||
}
|
}
|
||||||
actor.subPointsAme(rollData.runemode, subAme)
|
actor.subPointsAme(rollData.runemode, subAme)
|
||||||
}
|
}
|
||||||
if (rollData.typeAttaque == "assomer" && rollData.defenderTokenId && rollData.isPureSuccess) {
|
|
||||||
let defender = game.canvas.tokens.get(rollData?.defenderTokenId)?.actor
|
|
||||||
defender.setModifier("Assomer : Prochaine action", "roll", -5)
|
|
||||||
}
|
|
||||||
if (rollData.typeAttaque == "fuir" && rollData.difficulte > 0 && !rollData.isSuccess) {
|
|
||||||
actor.setModifier("Fuite échouée : -5 en défense ce round et suivant", "defense", -5)
|
|
||||||
}
|
|
||||||
if (rollData.typeAttaque == "immobiliser" && rollData.difficulte > 0 && rollData.isPureSuccess) {
|
|
||||||
actor.setModifier("Immobilisation en cours : -5 pour prochaine action", "roll", -5)
|
|
||||||
}
|
|
||||||
if (rollData.typeAttaque == "chargecavalerie") {
|
|
||||||
actor.setModifier("Charge de Cavalerie : -5 défense pour le tour", "defense", -5)
|
|
||||||
}
|
|
||||||
this.createChatWithRollMode(rollData.alias, {
|
this.createChatWithRollMode(rollData.alias, {
|
||||||
content: await renderTemplate(`systems/fvtt-mournblade/templates/chat-generic-result.html`, rollData)
|
content: await renderTemplate(`systems/fvtt-mournblade/templates/chat-generic-result.html`, rollData)
|
||||||
}, rollData)
|
}, rollData)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static async rollDegatsFromAttaque(rollData) {
|
|
||||||
let maximize = false
|
|
||||||
let degatsMessage = "Degats normaux"
|
|
||||||
|
|
||||||
if (rollData.arme?.system?.isMelee) {
|
|
||||||
rollData.degatsFormula = rollData.arme.system.totalDegats
|
|
||||||
if (rollData.isHeroique) { // Deux fois les dés de dégats
|
|
||||||
degatsMessage = "Dégats doublés"
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rollData.typeAttaque == "assomer") {
|
|
||||||
rollData.degatsFormula = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rollData.typeAttaque == "charger") {
|
|
||||||
rollData.degatsFormula += "+2"
|
|
||||||
}
|
|
||||||
if (rollData.typeAttaque == "chargecavalerie") {
|
|
||||||
rollData.degatsFormula += "+5"
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rollData.typeAttaque == "precise") {
|
|
||||||
degatsMessage = "Degats normaux"
|
|
||||||
if (rollData.isHeroique) { // Degats max
|
|
||||||
maximize = true
|
|
||||||
degatsMessage = "Dégats maximaux, ignore l'armure du défenseur";
|
|
||||||
rollData.ignoreDefenseArmor = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (rollData.typeAttaque == "feinte") {
|
|
||||||
degatsMessage = "Pas de dégats, mais bonus pour prochaine attaque"
|
|
||||||
rollData.degatsFormula = false
|
|
||||||
rollData.nextBonus = 5
|
|
||||||
if (rollData.isHeroique) { // Bonus pour prochaine action
|
|
||||||
rollData.nextBonus = 10
|
|
||||||
rollData.nextBonusDegats = 10
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (rollData.typeAttaque == "coupbas") {
|
|
||||||
degatsMessage = "Pas de dégats, mais malus pour prochaine action complexe du défenseur"
|
|
||||||
rollData.degatsFormula = false
|
|
||||||
rollData.nextMalus = 5
|
|
||||||
if (rollData.isHeroique) { // Malus pour prochaine action
|
|
||||||
rollData.nextMalus = 15
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (rollData.typeAttaque == "contenir") {
|
|
||||||
degatsMessage = "Pas de dégats, mais l'adversaire ne peut pas vous attaquer pour le reste du tour"
|
|
||||||
rollData.degatsFormula = false
|
|
||||||
if (rollData.isHeroique) { // Malus pour prochaine action
|
|
||||||
degatsMessage = "Pas de dégats, mais tout les adversaires avec une défense inférieure ou égale à " + rollData.finalResult - 10 +
|
|
||||||
" ne peuvent pas vous attaquer pour le reste du tour"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (rollData.typeAttaque == "desarmer") {
|
|
||||||
degatsMessage = "Pas de dégats, mais l'adversaire reçoit un malus de -5 pour sa prochaine action"
|
|
||||||
rollData.degatsFormula = false
|
|
||||||
if (rollData.isHeroique) { // Malus pour prochaine action
|
|
||||||
rollData.defenderDesarme = true
|
|
||||||
degatsMessage = "Pas de dégats, mais l'arme de votre adversaire est arrachée de ses mains"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { // Armes à distance
|
|
||||||
rollData.degatsFormula = rollData.arme.system.totalDegats
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform the roll, show the dice
|
|
||||||
rollData.finalResult = 0
|
|
||||||
rollData.degatsMessage = degatsMessage
|
|
||||||
if (rollData.degatsFormula) {
|
|
||||||
console.log("Degats formula", rollData.degatsFormula)
|
|
||||||
// Twice!maximize
|
|
||||||
if (rollData.isHeroique && !maximize) {
|
|
||||||
rollData.degatsFormula += "+" + rollData.degatsFormula
|
|
||||||
}
|
|
||||||
// Latest modifiers
|
|
||||||
for (let mod of rollData.modifiers) {
|
|
||||||
if (mod.system.modifiertype == "degats") {
|
|
||||||
rollData.degatsFormula += `+${mod.system.value}`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let degatsRoll = await new Roll(rollData.degatsFormula).evaluate({ maximize: maximize })
|
|
||||||
await this.showDiceSoNice(degatsRoll, game.settings.get("core", "rollMode"))
|
|
||||||
rollData.degatsRoll = foundry.utils.duplicate(degatsRoll)
|
|
||||||
rollData.finalResult = degatsRoll.total
|
|
||||||
}
|
|
||||||
|
|
||||||
this.createChatWithRollMode(rollData.alias, {
|
|
||||||
content: await renderTemplate(`systems/fvtt-mournblade/templates/chat-degats-result.html`, rollData)
|
|
||||||
}, rollData)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
|
||||||
static applyDegatsFromAttaque(rollData) {
|
|
||||||
let defender = game.canvas.tokens.get(rollData?.defenderTokenId)?.actor
|
|
||||||
if (defender && rollData.arme) {
|
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
|
||||||
if (rollData.typeAttaque == "desarmer" && !rollData.isHeroique) {
|
|
||||||
defender.setModifier("Malus suite à désarmement", "roll", -5)
|
|
||||||
}
|
|
||||||
if (rollData.typeAttaque == "charger") {
|
|
||||||
actor.setModifier("Défense suite à charge", "roll", -5)
|
|
||||||
}
|
|
||||||
if (rollData.nextBonus) {
|
|
||||||
actor.setModifier("Prochaine attaque", "roll", rollData.nextBonus)
|
|
||||||
if (rollData.nextDegatsBonus) {
|
|
||||||
actor.setModifier("Prochaine attaque", "degats", rollData.nextDegatsBonus)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (rollData.nextMalus) {
|
|
||||||
defender.setModifier("Prochaine action complexe", "roll", -rollData.nextMalus)
|
|
||||||
}
|
|
||||||
if (rollData.defenderDesarme) {
|
|
||||||
ui.notifications.info("L'arme de " + defender.name + " est arrachée de ses mains (à gérer manuellement)")
|
|
||||||
}
|
|
||||||
let degats = rollData.finalResult
|
|
||||||
|
|
||||||
let type = (rollData.arme.system.nonletaux) ? "nonletaux" : "letaux"
|
|
||||||
if (rollData.arme.system.ignorearmure) {
|
|
||||||
rollData.ignoreDefenseArmor = true
|
|
||||||
}
|
|
||||||
defender.incDecSante(type, +degats, rollData.ignoreDefenseArmor)
|
|
||||||
ui.notifications.info(defender.name + "a subi " + degats + " points de santé " + type + ".")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async bonusRollMournblade(rollData) {
|
static async bonusRollMournblade(rollData) {
|
||||||
rollData.bonusFormula = rollData.addedBonus
|
rollData.bonusFormula = rollData.addedBonus
|
||||||
|
|
||||||
let bonusRoll = await new Roll(rollData.bonusFormula).evaluate()
|
let bonusRoll = new Roll(rollData.bonusFormula).roll({async: false})
|
||||||
await this.showDiceSoNice(bonusRoll, game.settings.get("core", "rollMode"));
|
await this.showDiceSoNice(bonusRoll, game.settings.get("core", "rollMode"));
|
||||||
rollData.bonusRoll = foundry.utils.duplicate(bonusRoll)
|
rollData.bonusRoll = bonusRoll
|
||||||
|
|
||||||
rollData.finalResult += rollData.bonusRoll.total
|
rollData.finalResult += rollData.bonusRoll.total
|
||||||
|
|
||||||
this.computeResult(rollData)
|
this.computeResult( rollData)
|
||||||
|
|
||||||
this.createChatWithRollMode(rollData.alias, {
|
this.createChatWithRollMode(rollData.alias, {
|
||||||
content: await renderTemplate(`systems/fvtt-mournblade/templates/chat-generic-result.html`, rollData)
|
content: await renderTemplate(`systems/fvtt-mournblade/templates/chat-generic-result.html`, rollData)
|
||||||
@ -578,7 +370,6 @@ export class MournbladeUtility {
|
|||||||
static getUsers(filter) {
|
static getUsers(filter) {
|
||||||
return game.users.filter(filter).map(user => user.data._id);
|
return game.users.filter(filter).map(user => user.data._id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getWhisperRecipients(rollMode, name) {
|
static getWhisperRecipients(rollMode, name) {
|
||||||
switch (rollMode) {
|
switch (rollMode) {
|
||||||
@ -596,7 +387,7 @@ export class MournbladeUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static blindMessageToGM(chatOptions) {
|
static blindMessageToGM(chatOptions) {
|
||||||
let chatGM = foundry.utils.duplicate(chatOptions);
|
let chatGM = duplicate(chatOptions);
|
||||||
chatGM.whisper = this.getUsers(user => user.isGM);
|
chatGM.whisper = this.getUsers(user => user.isGM);
|
||||||
chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content;
|
chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content;
|
||||||
console.log("blindMessageToGM", chatGM);
|
console.log("blindMessageToGM", chatGM);
|
||||||
@ -649,8 +440,7 @@ export class MournbladeUtility {
|
|||||||
chatOptions.whisper = this.getWhisperRecipients(rollMode, name);
|
chatOptions.whisper = this.getWhisperRecipients(rollMode, name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
chatOptions.alias = chatOptions.alias || name;
|
chatOptions.alias = chatOptions.alias || name
|
||||||
chatOptions.speaker = ChatMessage.getSpeaker();
|
|
||||||
let msg = await ChatMessage.create(chatOptions)
|
let msg = await ChatMessage.create(chatOptions)
|
||||||
console.log("=======>", rollData)
|
console.log("=======>", rollData)
|
||||||
msg.setFlag("world", "mournblade-roll", rollData)
|
msg.setFlag("world", "mournblade-roll", rollData)
|
||||||
@ -659,11 +449,12 @@ export class MournbladeUtility {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static getBasicRollData() {
|
static getBasicRollData() {
|
||||||
let rollData = {
|
let rollData = {
|
||||||
rollId: foundry.utils.randomID(16),
|
rollId: randomID(16),
|
||||||
rollMode: game.settings.get("core", "rollMode"),
|
rollMode: game.settings.get("core", "rollMode"),
|
||||||
|
modificateursOptions: this.getModificateurOptions(),
|
||||||
|
pointAmeOptions: this.getPointAmeOptions(),
|
||||||
difficulte: 0,
|
difficulte: 0,
|
||||||
modificateur: 0,
|
modificateur: 0,
|
||||||
config: foundry.utils.duplicate(game.system.mournblade.config),
|
|
||||||
}
|
}
|
||||||
MournbladeUtility.updateWithTarget(rollData)
|
MournbladeUtility.updateWithTarget(rollData)
|
||||||
return rollData
|
return rollData
|
||||||
@ -671,19 +462,15 @@ export class MournbladeUtility {
|
|||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static updateWithTarget(rollData) {
|
static updateWithTarget(rollData) {
|
||||||
let target = MournbladeUtility.getTarget()
|
let objectDefender
|
||||||
|
let target = MournbladeUtility.getTarget();
|
||||||
if (target) {
|
if (target) {
|
||||||
rollData.defenderTokenId = target.id
|
let defenderActor = game.actors.get(target.data.actorId)
|
||||||
let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor
|
objectDefender = MournbladeUtility.data(defenderActor)
|
||||||
rollData.defenderCombatValues = defender.getCombatValues()
|
objectDefender = mergeObject(objectDefender, target.data.actorData)
|
||||||
rollData.defender = defender.toObject() // Simpler
|
rollData.defender = objectDefender
|
||||||
rollData.defenderDefense = defender.getBestDefenseValue()
|
rollData.attackerId = this.id
|
||||||
rollData.armeDefense = defender.getBestDefenseValue()
|
rollData.defenderId = objectDefender._id
|
||||||
if (rollData.armeDefense) {
|
|
||||||
rollData.difficulte = rollData.armeDefense.system.totalDefensif
|
|
||||||
} else {
|
|
||||||
ui.notifications.warn("Aucune arme de défense équipée, difficulté manuelle à positionner.")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -698,9 +485,9 @@ export class MournbladeUtility {
|
|||||||
let msg = game.messages.get(msgId)
|
let msg = game.messages.get(msgId)
|
||||||
if (msg) {
|
if (msg) {
|
||||||
let rollData = msg.getFlag("world", "mournblade-roll")
|
let rollData = msg.getFlag("world", "mournblade-roll")
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
actor.changeBonneAventure(changed)
|
actor.changeBonneAventure( changed )
|
||||||
rollData.isReroll = true
|
rollData.isReroll = true
|
||||||
rollData.textBonus = "Bonus de Points d'Aventure"
|
rollData.textBonus = "Bonus de Points d'Aventure"
|
||||||
if (addedBonus == "reroll") {
|
if (addedBonus == "reroll") {
|
||||||
MournbladeUtility.rollMournblade(rollData)
|
MournbladeUtility.rollMournblade(rollData)
|
||||||
@ -711,20 +498,20 @@ export class MournbladeUtility {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static applyEclatRoll(li, changed, addedBonus) {
|
static applyEclatRoll(li, changed, addedBonus) {
|
||||||
let msgId = li.data("message-id")
|
let msgId = li.data("message-id")
|
||||||
let msg = game.messages.get(msgId)
|
let msg = game.messages.get(msgId)
|
||||||
if (msg) {
|
if (msg) {
|
||||||
let rollData = msg.getFlag("world", "mournblade-roll")
|
let rollData = msg.getFlag("world", "mournblade-roll")
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
actor.changeEclat(changed)
|
actor.changeEclat( changed )
|
||||||
rollData.isReroll = true
|
rollData.isReroll = true
|
||||||
rollData.textBonus = "Bonus d'Eclat"
|
rollData.textBonus = "Bonus d'Eclat"
|
||||||
rollData.addedBonus = addedBonus
|
rollData.addedBonus = addedBonus
|
||||||
MournbladeUtility.bonusRollMournblade(rollData)
|
MournbladeUtility.bonusRollMournblade(rollData)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static chatRollMenu(html, options) {
|
static chatRollMenu(html, options) {
|
||||||
@ -732,48 +519,48 @@ export class MournbladeUtility {
|
|||||||
let canApplyBALoyal = function (li) {
|
let canApplyBALoyal = function (li) {
|
||||||
let message = game.messages.get(li.attr("data-message-id"))
|
let message = game.messages.get(li.attr("data-message-id"))
|
||||||
let rollData = message.getFlag("world", "mournblade-roll")
|
let rollData = message.getFlag("world", "mournblade-roll")
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
return (!rollData.isReroll && actor.getBonneAventure() > 0 && actor.getAlignement() == "loyal")
|
return ( !rollData.isReroll && actor.getBonneAventure() > 0 && actor.getAlignement() == "loyal")
|
||||||
}
|
}
|
||||||
let canApplyPELoyal = function (li) {
|
let canApplyPELoyal = function (li) {
|
||||||
let message = game.messages.get(li.attr("data-message-id"))
|
let message = game.messages.get(li.attr("data-message-id"))
|
||||||
let rollData = message.getFlag("world", "mournblade-roll")
|
let rollData = message.getFlag("world", "mournblade-roll")
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
return (!rollData.isReroll && actor.getEclat() > 0 && actor.getAlignement() == "loyal")
|
return ( !rollData.isReroll && actor.getEclat() > 0 && actor.getAlignement() == "loyal")
|
||||||
}
|
}
|
||||||
let canApplyBAChaotique = function (li) {
|
let canApplyBAChaotique = function (li) {
|
||||||
let message = game.messages.get(li.attr("data-message-id"))
|
let message = game.messages.get(li.attr("data-message-id"))
|
||||||
let rollData = message.getFlag("world", "mournblade-roll")
|
let rollData = message.getFlag("world", "mournblade-roll")
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
return (!rollData.isReroll && actor.getBonneAventure() > 0 && actor.getAlignement() == "chaotique")
|
return ( !rollData.isReroll && actor.getBonneAventure() > 0 && actor.getAlignement() == "chaotique")
|
||||||
}
|
}
|
||||||
let canApplyBAChaotique3 = function (li) {
|
let canApplyBAChaotique3 = function (li) {
|
||||||
let message = game.messages.get(li.attr("data-message-id"))
|
let message = game.messages.get(li.attr("data-message-id"))
|
||||||
let rollData = message.getFlag("world", "mournblade-roll")
|
let rollData = message.getFlag("world", "mournblade-roll")
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
return (!rollData.isReroll && actor.getBonneAventure() > 2 && actor.getAlignement() == "chaotique")
|
return ( !rollData.isReroll && actor.getBonneAventure() > 2 && actor.getAlignement() == "chaotique")
|
||||||
}
|
}
|
||||||
let canApplyPEChaotique = function (li) {
|
let canApplyPEChaotique = function (li) {
|
||||||
let message = game.messages.get(li.attr("data-message-id"))
|
let message = game.messages.get(li.attr("data-message-id"))
|
||||||
let rollData = message.getFlag("world", "mournblade-roll")
|
let rollData = message.getFlag("world", "mournblade-roll")
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
return (!rollData.isReroll && actor.getEclat() > 0 && actor.getAlignement() == "chaotique")
|
return ( !rollData.isReroll && actor.getEclat() > 0 && actor.getAlignement() == "chaotique")
|
||||||
}
|
}
|
||||||
let hasPredilection = function (li) {
|
let hasPredilection = function (li) {
|
||||||
let message = game.messages.get(li.attr("data-message-id"))
|
let message = game.messages.get(li.attr("data-message-id"))
|
||||||
let rollData = message.getFlag("world", "mournblade-roll")
|
let rollData = message.getFlag("world", "mournblade-roll")
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
if (rollData.competence) {
|
if ( rollData.competence) {
|
||||||
let nbPred = rollData.competence.data.predilections.filter(pred => !pred.used).length
|
let nbPred = rollData.competence.data.predilections.filter( pred => !pred.used).length
|
||||||
return (!rollData.isReroll && rollData.competence && nbPred > 0)
|
return ( !rollData.isReroll && rollData.competence && nbPred > 0 )
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
let canCompetenceDouble = function (li) {
|
let canCompetenceDouble = function (li) {
|
||||||
let message = game.messages.get(li.attr("data-message-id"))
|
let message = game.messages.get(li.attr("data-message-id"))
|
||||||
let rollData = message.getFlag("world", "mournblade-roll")
|
let rollData = message.getFlag("world", "mournblade-roll")
|
||||||
let actor = MournbladeUtility.getActorFromRollData(rollData)
|
let actor = game.actors.get(rollData.actorId)
|
||||||
if (rollData.competence) {
|
if ( rollData.competence) {
|
||||||
return rollData.competence.data.doublebonus
|
return rollData.competence.data.doublebonus
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
@ -840,11 +627,11 @@ export class MournbladeUtility {
|
|||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
static async confirmDelete(actorSheet, li) {
|
static async confirmDelete(actorSheet, li) {
|
||||||
let itemId = li.data("item-id");
|
let itemId = li.data("item-id");
|
||||||
let msgTxt = "<p>Voulez vous supprimer cet item ?";
|
let msgTxt = "<p>Are you sure to remove this Item ?";
|
||||||
let buttons = {
|
let buttons = {
|
||||||
delete: {
|
delete: {
|
||||||
icon: '<i class="fas fa-check"></i>',
|
icon: '<i class="fas fa-check"></i>',
|
||||||
label: "Oui !",
|
label: "Yes, remove it",
|
||||||
callback: () => {
|
callback: () => {
|
||||||
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
|
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
|
||||||
li.slideUp(200, () => actorSheet.render(false));
|
li.slideUp(200, () => actorSheet.render(false));
|
||||||
@ -852,12 +639,12 @@ export class MournbladeUtility {
|
|||||||
},
|
},
|
||||||
cancel: {
|
cancel: {
|
||||||
icon: '<i class="fas fa-times"></i>',
|
icon: '<i class="fas fa-times"></i>',
|
||||||
label: "Non !"
|
label: "Cancel"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
msgTxt += "</p>";
|
msgTxt += "</p>";
|
||||||
let d = new Dialog({
|
let d = new Dialog({
|
||||||
title: "Confirmer la suppression",
|
title: "Confirm removal",
|
||||||
content: msgTxt,
|
content: msgTxt,
|
||||||
buttons: buttons,
|
buttons: buttons,
|
||||||
default: "cancel"
|
default: "cancel"
|
||||||
|
@ -1,46 +1,42 @@
|
|||||||
{"name":"Fouet","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.Qb1h25U88mTM4h72"}},"_id":"0swiE8k5zfUIqmXu","system":{"description":"","typearme":"contactjet","isdefense":false,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1d4 + 1","nonletaux":true,"deuxmains":false,"courte":3,"moyenne":0,"longue":0,"tr":0,"rarete":4,"prix":40,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964292,"modifiedTime":1664573659387,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"name":"Fouet","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contactjet","bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1d4 + 1","deuxmains":false,"courte":3,"moyenne":0,"longue":0,"tr":0,"rarete":4,"prix":40},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.Qb1h25U88mTM4h72"}},"_id":"0swiE8k5zfUIqmXu"}
|
||||||
{"_id":"2BSVJXr0FGZZJ9fh","name":"Hache des mers","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.mGYFgteaWBDo10Xb"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"2d6","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":150,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964293,"modifiedTime":1664573659388,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"2BSVJXr0FGZZJ9fh","name":"Hache des mers","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"2d6","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":150},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.mGYFgteaWBDo10Xb"}}}
|
||||||
{"name":"Ecu d'acier","type":"bouclier","img":"systems/fvtt-mournblade/assets/icons/protection.webp","system":{"description":"","bonusdefense":3,"degats":"1d8","nonletaux":"false","rarete":9,"prix":10,"equipped":false,"isdefense":null},"effects":[],"ownership":{"default":0,"1Hr6ON03ooIXzvIm":3},"flags":{"core":{"sourceId":"Item.Gn52Vfp6Vg4cnpd0"}},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572521380,"modifiedTime":1664573706183,"lastModifiedBy":"1Hr6ON03ooIXzvIm"},"folder":null,"sort":0,"_id":"2PmIgKP4wZLHGp0s"}
|
{"_id":"2qezkR1BdC0DcRIl","name":"Fléau d’armes","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1D10+1","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":70},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.PHQabMgfk1GNOjKo"}}}
|
||||||
{"_id":"2qezkR1BdC0DcRIl","name":"Fléau d’armes","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.PHQabMgfk1GNOjKo"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1D10+1","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":70,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964293,"modifiedTime":1664573659387,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"name":"Arbalète","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"tir","bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"2d6","deuxmains":false,"courte":25,"moyenne":50,"longue":75,"tr":3,"rarete":10,"prix":500},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.WYp8ojQN8HYJwUJc"}},"_id":"2zIdrBK88iuMbOF0"}
|
||||||
{"name":"Arbalète","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.WYp8ojQN8HYJwUJc"}},"_id":"2zIdrBK88iuMbOF0","system":{"description":"","typearme":"tir","isdefense":null,"bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"2d6","nonletaux":null,"deuxmains":"","courte":25,"moyenne":50,"longue":75,"tr":3,"rarete":10,"prix":500,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964293,"modifiedTime":1664573659385,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"3Iv1oLpZcPEJVaI4","name":"Cimeterre","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":1,"degats":"1d10","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":100},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.RYxEg0gJfAlIZ4mw"}}}
|
||||||
{"_id":"3Iv1oLpZcPEJVaI4","name":"Cimeterre","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.RYxEg0gJfAlIZ4mw"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":1,"degats":"1d10","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":100,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964294,"modifiedTime":1664573659386,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"name":"Fronde","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"tir","bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1D4","deuxmains":false,"courte":10,"moyenne":25,"longue":50,"tr":1,"rarete":2,"prix":1},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.TgVuNnytO9k2K0Xe"}},"_id":"4To8rLxv4efsoZK0"}
|
||||||
{"name":"Fronde","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.TgVuNnytO9k2K0Xe"}},"_id":"4To8rLxv4efsoZK0","system":{"description":"","typearme":"tir","isdefense":false,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1D4","nonletaux":false,"deuxmains":false,"courte":10,"moyenne":25,"longue":50,"tr":1,"rarete":2,"prix":1,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964294,"modifiedTime":1664573659388,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"name":"Pierre","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contactjet","bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1D4","deuxmains":false,"courte":3,"moyenne":6,"longue":15,"tr":1,"rarete":0,"prix":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.3YS9IfQddECnoagK"}},"_id":"4yKlK8MeSj5Zk8lM"}
|
||||||
{"name":"Pierre","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.3YS9IfQddECnoagK"}},"_id":"4yKlK8MeSj5Zk8lM","system":{"description":"","typearme":"contactjet","isdefense":false,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1D4","nonletaux":true,"deuxmains":false,"courte":3,"moyenne":6,"longue":15,"tr":1,"rarete":0,"prix":0,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964294,"modifiedTime":1664573659390,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"6e1JHoD1Jrz020R7","name":"Grand marteau","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"2D6+2","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":120},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.vjic4cPkJ0iMCIt5"}}}
|
||||||
{"_id":"6e1JHoD1Jrz020R7","name":"Grand marteau","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.vjic4cPkJ0iMCIt5"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"2D6+2","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":120,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964294,"modifiedTime":1664573659388,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"name":"Arc de cavalerie","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"tir","bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"1d6","deuxmains":false,"courte":25,"moyenne":50,"longue":75,"tr":1,"rarete":7,"prix":100},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.5EWrgNQjJMx1t2v1"}},"_id":"88UuW1bdpFuCmkqb"}
|
||||||
{"name":"Arc de cavalerie","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.5EWrgNQjJMx1t2v1"}},"_id":"88UuW1bdpFuCmkqb","system":{"description":"","typearme":"tir","isdefense":null,"bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"1d6","nonletaux":null,"deuxmains":null,"courte":25,"moyenne":50,"longue":75,"tr":1,"rarete":7,"prix":100,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964294,"modifiedTime":1664573659385,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"9Eo9mRbPPZHN98Cr","name":"Épée de maître","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":1,"degats":"1d8+ 2","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":120},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.kX3MbDFu9uYZVNf2"}}}
|
||||||
{"_id":"9Eo9mRbPPZHN98Cr","name":"Épée de maître","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.kX3MbDFu9uYZVNf2"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":1,"degats":"1d8+ 2","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":120,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964294,"modifiedTime":1664573659386,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"9xPd4ITtyk3nmMoN","name":"Lance ilmioréenne","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"<p>La lance ilmioréenne est un solide bâton de combat surmonté d’une pointe sur lequel est fi xé quasi perpendiculairement un fer de hache plat et étroit. Un contrepoids fi xé à l’autre extrémité sert à équilibrer l’arme qui peut être maniée à la fois comme une lance et comme une hache à deux mains, ce qui permet de maintenir ses ennemis à distance ou de leur porter des coups dévastateurs. Ces lances furent inventées à l’époque de la tribu d’Ilm, quand les lances et épées étaient déclarées illégales par les gouverneurs melnibonéens de la région. Certaines écoles militaires ilmioréennes enseignent toujours le Style Imar, qui mêle en une seule et même technique le combat à deux mains à la lance et le combat au bâton.</p>","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":2,"degats":"1d8 + 2","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":100},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.8ApbiVgkx79OHVp2"}}}
|
||||||
{"_id":"9xPd4ITtyk3nmMoN","name":"Lance ilmioréenne","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.8ApbiVgkx79OHVp2"}},"system":{"description":"<p>La lance ilmioréenne est un solide bâton de combat surmonté d’une pointe sur lequel est fi xé quasi perpendiculairement un fer de hache plat et étroit. Un contrepoids fi xé à l’autre extrémité sert à équilibrer l’arme qui peut être maniée à la fois comme une lance et comme une hache à deux mains, ce qui permet de maintenir ses ennemis à distance ou de leur porter des coups dévastateurs. Ces lances furent inventées à l’époque de la tribu d’Ilm, quand les lances et épées étaient déclarées illégales par les gouverneurs melnibonéens de la région. Certaines écoles militaires ilmioréennes enseignent toujours le Style Imar, qui mêle en une seule et même technique le combat à deux mains à la lance et le combat au bâton.</p>","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":2,"degats":"1d8 + 2","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":100,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964294,"modifiedTime":1664573659389,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"CeC5lAKs7NdPF05l","name":"Masse lourde","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d10 + 1","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":5,"prix":80},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.DPfXgFj3gpjJ3nbR"}}}
|
||||||
{"_id":"CeC5lAKs7NdPF05l","name":"Masse lourde","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.DPfXgFj3gpjJ3nbR"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d10 + 1","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":5,"prix":80,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964294,"modifiedTime":1664573659389,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"CqP80SQFQOefpGgd","name":"Gourdin","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1D6","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":0,"prix":5},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.CBIfq9eRd2RmoI4H"}}}
|
||||||
{"_id":"CqP80SQFQOefpGgd","name":"Gourdin","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.CBIfq9eRd2RmoI4H"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1D6","nonletaux":true,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":0,"prix":5,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964294,"modifiedTime":1664573659388,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"CupT9m8L909l4Fo5","name":"Rapière","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":3,"bonusmaniementdef":1,"degats":"1d8+ 1","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":150},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.XIStcClTnmLoSwyR"}}}
|
||||||
{"_id":"CupT9m8L909l4Fo5","name":"Rapière","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.XIStcClTnmLoSwyR"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":3,"bonusmaniementdef":1,"degats":"1d8+ 1","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":150,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964295,"modifiedTime":1664573659390,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"name":"Hachette / Hache de lancer","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contactjet","bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d4 + 1","deuxmains":false,"courte":5,"moyenne":10,"longue":15,"tr":1,"rarete":5,"prix":50},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.5NHbRanxXA5vUE3B"}},"_id":"DzkeP7jbruqW4nQH"}
|
||||||
{"name":"Hachette / Hache de lancer","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.5NHbRanxXA5vUE3B"}},"_id":"DzkeP7jbruqW4nQH","system":{"description":"","typearme":"contactjet","isdefense":false,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d4 + 1","nonletaux":false,"deuxmains":false,"courte":5,"moyenne":10,"longue":15,"tr":1,"rarete":5,"prix":50,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964295,"modifiedTime":1664573659388,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"FDeRBkxXwoZIuL9B","name":"Lance légère","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d8","deuxmains":false,"courte":10,"moyenne":25,"longue":50,"tr":1,"rarete":5,"prix":5},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.LIVeq22E9EanRS9L"}}}
|
||||||
{"_id":"FDeRBkxXwoZIuL9B","name":"Lance légère","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.LIVeq22E9EanRS9L"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d8","nonletaux":false,"deuxmains":false,"courte":10,"moyenne":25,"longue":50,"tr":1,"rarete":5,"prix":5,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964295,"modifiedTime":1664573659389,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"name":"Arc de chasse","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"tir","bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d6 - 1","deuxmains":false,"courte":25,"moyenne":50,"longue":75,"tr":1,"rarete":8,"prix":250},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.TrYZ9BxYukS1mbBX"}},"_id":"Hrm08cpgAMMV6Jpq"}
|
||||||
{"name":"Arc de chasse","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.TrYZ9BxYukS1mbBX"}},"_id":"Hrm08cpgAMMV6Jpq","system":{"description":"","typearme":"tir","isdefense":false,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d6 - 1","nonletaux":false,"deuxmains":false,"courte":25,"moyenne":50,"longue":75,"tr":1,"rarete":8,"prix":250,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964295,"modifiedTime":1664573659385,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"Iw3j4oC6H8HJ9MFQ","name":"Coup de pied / poing / tête","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":3,"bonusmaniementdef":0,"degats":"1d4","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":0,"prix":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.nBPKHsYIM0HgMcBy"}}}
|
||||||
{"_id":"Iw3j4oC6H8HJ9MFQ","name":"Coup de pied / poing / tête","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.nBPKHsYIM0HgMcBy"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":3,"bonusmaniementdef":0,"degats":"1d4","nonletaux":true,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":0,"prix":0,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964295,"modifiedTime":1664573659386,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"KY22L6Lx5WxgvyGD","name":"Lance lourde","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":2,"degats":"1d10","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":5,"prix":50},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.Kcl07bs7TOcne37W"}}}
|
||||||
{"_id":"KY22L6Lx5WxgvyGD","name":"Lance lourde","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.Kcl07bs7TOcne37W"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":2,"degats":"1d10","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":5,"prix":50,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964295,"modifiedTime":1664573659389,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"name":"Arc du Désert des Larmes","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"<p>Cet arc composite fait de bois, d’andouillers de cerf et/ou d’os est un arc court et très recourbé utilisé par les barbares du Désert des Larmes pour la chasse. On peut également trouver ce type d’arcs à Pikarayd et au Dorel.</p>","typearme":"tir","bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d6 + 1","deuxmains":false,"courte":25,"moyenne":50,"longue":75,"tr":1,"rarete":8,"prix":250},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.QmYjdRCAk3MnxKJg"}},"_id":"MDpFpqmXpIX5VV80"}
|
||||||
{"name":"Arc du Désert des Larmes","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.QmYjdRCAk3MnxKJg"}},"_id":"MDpFpqmXpIX5VV80","system":{"description":"<p>Cet arc composite fait de bois, d’andouillers de cerf et/ou d’os est un arc court et très recourbé utilisé par les barbares du Désert des Larmes pour la chasse. On peut également trouver ce type d’arcs à Pikarayd et au Dorel.</p>","typearme":"tir","isdefense":null,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d6 + 1","nonletaux":null,"deuxmains":null,"courte":25,"moyenne":50,"longue":75,"tr":1,"rarete":8,"prix":250,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964296,"modifiedTime":1664573659385,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"MP49mYF7FVuW9ALB","name":"Hache de bataille dite lormyrienne","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"<p>Cette double hache parfaitement équilibrée et proportionnée est l’arme favorite des chevaliers lormyriens. Il s’agit de l’arme idéale pour trancher, découper les lances ennemies et fendre les crânes.</p>","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"2d6 + 2","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":250},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.Lpa6kesbzgKVtogn"}}}
|
||||||
{"_id":"MP49mYF7FVuW9ALB","name":"Hache de bataille dite lormyrienne","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.Lpa6kesbzgKVtogn"}},"system":{"description":"<p>Cette double hache parfaitement équilibrée et proportionnée est l’arme favorite des chevaliers lormyriens. Il s’agit de l’arme idéale pour trancher, découper les lances ennemies et fendre les crânes.</p>","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"2d6 + 2","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":250,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964296,"modifiedTime":1664573659388,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"N5BbO2lGwzQnpvH0","name":"Couteau / Dague","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contactjet","isdefense":true,"bonusmaniementoff":3,"bonusmaniementdef":0,"degats":"1d4","deuxmains":false,"courte":3,"moyenne":6,"longue":15,"tr":1,"rarete":1,"prix":10},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.5a9GKIvNgbbXBq3s"}}}
|
||||||
{"_id":"N5BbO2lGwzQnpvH0","name":"Couteau / Dague","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.5a9GKIvNgbbXBq3s"}},"system":{"description":"","typearme":"contactjet","isdefense":true,"bonusmaniementoff":3,"bonusmaniementdef":0,"degats":"1d4","nonletaux":false,"deuxmains":false,"courte":3,"moyenne":6,"longue":15,"tr":1,"rarete":1,"prix":10,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964297,"modifiedTime":1664573659386,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"QwrZbFeJUQv2OBqI","name":"Pique filkharienne","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"<p>Cette longue pique à grande lame de près de trois mètres de long est l’arme de prédilection des piquiers de l’armée de Filkhar. Très effi cace pour lutter contre des cavaliers ou des ennemis en train de charger, elle l’est beaucoup moins en combat rapproché.</p>","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d8 + 2","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":150},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.dF9LxfA1crZBmT92"}}}
|
||||||
{"_id":"QwrZbFeJUQv2OBqI","name":"Pique filkharienne","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.dF9LxfA1crZBmT92"}},"system":{"description":"<p>Cette longue pique à grande lame de près de trois mètres de long est l’arme de prédilection des piquiers de l’armée de Filkhar. Très effi cace pour lutter contre des cavaliers ou des ennemis en train de charger, elle l’est beaucoup moins en combat rapproché.</p>","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d8 + 2","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":150,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964297,"modifiedTime":1664573659390,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"SzgkzHvzma8NiMd5","name":"Masse légère","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d6 + 2","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":5,"prix":5},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.xrWRNZBrEzkUQzRG"}}}
|
||||||
{"_id":"SzgkzHvzma8NiMd5","name":"Masse légère","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.xrWRNZBrEzkUQzRG"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d6 + 2","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":5,"prix":5,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964297,"modifiedTime":1664573659389,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"U8CoqFhGuT3ZHeq1","name":"Sabre d’abordage","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"1d8","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":5,"prix":50},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.aNUqO9OZT0GBszvv"}}}
|
||||||
{"_id":"U8CoqFhGuT3ZHeq1","name":"Sabre d’abordage","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.aNUqO9OZT0GBszvv"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"1d8","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":5,"prix":50,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964297,"modifiedTime":1664573659390,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"name":"Javelot","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"jet","bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"1d6","deuxmains":false,"courte":25,"moyenne":50,"longue":75,"tr":1,"rarete":5,"prix":30},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.Zwiz9E3TbeUP8qHH"}},"_id":"aELvOR7A9DIJKgBk"}
|
||||||
{"name":"Javelot","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.Zwiz9E3TbeUP8qHH"}},"_id":"aELvOR7A9DIJKgBk","system":{"description":"","typearme":"jet","isdefense":false,"bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"1d6","nonletaux":false,"deuxmains":false,"courte":25,"moyenne":50,"longue":75,"tr":1,"rarete":5,"prix":30,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964297,"modifiedTime":1664573659389,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"aJBVfqQ3JQNyVL7c","name":"Fourche / Faux de paysan","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1D6","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":1,"prix":10},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.K5Ayim6mPKZoCSCc"}}}
|
||||||
{"_id":"aJBVfqQ3JQNyVL7c","name":"Fourche / Faux de paysan","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.K5Ayim6mPKZoCSCc"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1D6","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":1,"prix":10,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964298,"modifiedTime":1664573659387,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"c6l49ZmEBjUxfI3W","name":"Arme improvisée","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1d6","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":0,"prix":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.E7gcmnNQK2t5OQjv"}}}
|
||||||
{"name":"Pavois","type":"bouclier","img":"systems/fvtt-mournblade/assets/icons/protection.webp","system":{"description":"<p>Le Pavois se plante dans le sol au début du combat et ne peut plus être déplacé jusqu'à son issue.</p>","bonusdefense":3,"degats":"0","nonletaux":"false","rarete":7,"prix":5,"equipped":false,"isdefense":"false"},"effects":[],"ownership":{"default":0,"1Hr6ON03ooIXzvIm":3},"flags":{"core":{"sourceId":"Item.E3A8EnGzQctvYndd"}},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572521380,"modifiedTime":1664573708981,"lastModifiedBy":"1Hr6ON03ooIXzvIm"},"folder":null,"sort":0,"_id":"b2VNhFBgbvlzaMw8"}
|
{"name":"Arc de guerre","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"tir","bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1d10 + 1","deuxmains":false,"courte":30,"moyenne":50,"longue":100,"tr":1,"rarete":6,"prix":70},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.Tq6lUFPTkBN5cBwn"}},"_id":"cKf5z3fajUnxJh0r"}
|
||||||
{"name":"Bouclier d'Infanterie","type":"bouclier","img":"systems/fvtt-mournblade/assets/icons/protection.webp","system":{"description":"","bonusdefense":2,"degats":"1d6","nonletaux":"false","rarete":5,"prix":2,"equipped":false},"effects":[],"ownership":{"default":0,"1Hr6ON03ooIXzvIm":3},"flags":{"core":{"sourceId":"Item.jeMLhLTJhTU6TJ58"}},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572521380,"modifiedTime":1664573703190,"lastModifiedBy":"1Hr6ON03ooIXzvIm"},"folder":null,"sort":0,"_id":"bqDEyPj9OlGnEJsr"}
|
{"_id":"fLHX6ut131CQI630","name":"Main gauche","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":3,"degats":"1d4 + 1","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":10},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.BBii0qi1unvSRNO4"}}}
|
||||||
{"_id":"c6l49ZmEBjUxfI3W","name":"Arme improvisée","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.E7gcmnNQK2t5OQjv"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1d6","nonletaux":true,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":0,"prix":0,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964298,"modifiedTime":1664573659386,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"freCCeiYGfWmUAQU","name":"Marteau de guerre","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1d8 + 2","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":6,"prix":70},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.6n2uSdYfRAsSqQnA"}}}
|
||||||
{"name":"Arc de guerre","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.Tq6lUFPTkBN5cBwn"}},"_id":"cKf5z3fajUnxJh0r","system":{"description":"","typearme":"tir","isdefense":false,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1d10 + 1","nonletaux":false,"deuxmains":false,"courte":30,"moyenne":50,"longue":100,"tr":1,"rarete":6,"prix":70,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964298,"modifiedTime":1664573659385,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"j5659PJlrHz56V1k","name":"Sabre de Pan Tang","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"<p>Ce long sabre effi lé sert aux Cavaliers démoniaques de Pan Tang pour couper les têtes depuis le dos de leurs monstrueuses montures reptiliennes à six pattes.</p>","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d10 + 2","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":120},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.l3ffzso7GyHMKguD"}}}
|
||||||
{"name":"Targe","type":"bouclier","img":"systems/fvtt-mournblade/assets/icons/protection.webp","system":{"description":"","bonusdefense":1,"degats":"1d4","nonletaux":"false","rarete":4,"prix":2,"equipped":false},"effects":[],"ownership":{"default":0,"1Hr6ON03ooIXzvIm":3},"flags":{"core":{"sourceId":"Item.9rJkBsRltxH08QT8"}},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572521380,"modifiedTime":1664573712553,"lastModifiedBy":"1Hr6ON03ooIXzvIm"},"folder":null,"sort":0,"_id":"cZorS8WAKNS0dN0T"}
|
{"_id":"lYtm5MwP96numskx","name":"Hallebarde","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":2,"degats":"2d6","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":150},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.ZTdyIoMzE9kqm4e6"}}}
|
||||||
{"_id":"fLHX6ut131CQI630","name":"Main gauche","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.BBii0qi1unvSRNO4"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":3,"degats":"1d4 + 1","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":10,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964298,"modifiedTime":1664573659389,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"mQGT0vmDjoTZCW5u","name":"Lance melnibonéenne","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"<p>La lance melnibonéenne, faite pour le combat à cheval ou à dos de dragon, ressemble à une lance ordinaire. Son fer est cependant plus fi n et plus étroit. Avant la chute d’Imrryr, il est quasi impossible de se procurer de telles armes sur les marchés des Jeunes Royaumes. Elles peuvent être maniées à une main comme lors des joutes à cheval ou à deux mains au cœur des mêlées.</p>","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":2,"degats":"2d6+ 4","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":10,"prix":70},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.KAl5qXHeYDoYRU6G"}}}
|
||||||
{"_id":"freCCeiYGfWmUAQU","name":"Marteau de guerre","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.6n2uSdYfRAsSqQnA"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":0,"degats":"1d8 + 2","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":6,"prix":70,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964298,"modifiedTime":1664573659389,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"name":"Arc en os","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"<p>Arc composite recourbé fait de bois, d’os et d’acier, l’arc en os melnibonéen est une arme extraordinairement puissante entre les mains d’un guerrier melnibonéen ou d’un archer esclave du Glorieux Empire. On peut se le procurer dans les Jeunes Royaumes après la chute d’Imrryr.</p>","typearme":"tir","bonusmaniementoff":3,"bonusmaniementdef":0,"degats":"1d8 + 1","deuxmains":false,"courte":30,"moyenne":60,"longue":125,"tr":2,"rarete":10,"prix":500},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.Dy9dzVhXbNAVm3zn"}},"_id":"nzve5qucVN6FC5wn"}
|
||||||
{"_id":"j5659PJlrHz56V1k","name":"Sabre de Pan Tang","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.l3ffzso7GyHMKguD"}},"system":{"description":"<p>Ce long sabre effi lé sert aux Cavaliers démoniaques de Pan Tang pour couper les têtes depuis le dos de leurs monstrueuses montures reptiliennes à six pattes.</p>","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d10 + 2","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":120,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964299,"modifiedTime":1664573659390,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"sHj90bPcMaDlOw51","name":"Bâton ferré ou lesté","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":2,"degats":"1D8","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":0,"prix":1},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.zoBHSbvJPnjbtPh6"}}}
|
||||||
{"_id":"lYtm5MwP96numskx","name":"Hallebarde","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.ZTdyIoMzE9kqm4e6"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":0,"bonusmaniementdef":2,"degats":"2d6","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":150,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964299,"modifiedTime":1664573659389,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"sju2r73hUHyGbHYg","name":"Épée courte / Glaive","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":1,"degats":"1D6+1","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":4,"prix":40},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.Mxv5gMHRvRrsuhPA"}}}
|
||||||
{"_id":"mQGT0vmDjoTZCW5u","name":"Lance melnibonéenne","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.KAl5qXHeYDoYRU6G"}},"system":{"description":"<p>La lance melnibonéenne, faite pour le combat à cheval ou à dos de dragon, ressemble à une lance ordinaire. Son fer est cependant plus fi n et plus étroit. Avant la chute d’Imrryr, il est quasi impossible de se procurer de telles armes sur les marchés des Jeunes Royaumes. Elles peuvent être maniées à une main comme lors des joutes à cheval ou à deux mains au cœur des mêlées.</p>","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":2,"degats":"2d6+ 4","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":10,"prix":70,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964299,"modifiedTime":1664573659389,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"t2uQcWe7kirUOp3D","name":"Faucheur","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":1,"degats":"1d4 + 1","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":100},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.OlmzE29fh9DFd8TF"}}}
|
||||||
{"name":"Arc en os","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.Dy9dzVhXbNAVm3zn"}},"_id":"nzve5qucVN6FC5wn","system":{"description":"<p>Arc composite recourbé fait de bois, d’os et d’acier, l’arc en os melnibonéen est une arme extraordinairement puissante entre les mains d’un guerrier melnibonéen ou d’un archer esclave du Glorieux Empire. On peut se le procurer dans les Jeunes Royaumes après la chute d’Imrryr.</p>","typearme":"tir","isdefense":false,"bonusmaniementoff":3,"bonusmaniementdef":0,"degats":"1d8 + 1","nonletaux":false,"deuxmains":false,"courte":30,"moyenne":60,"longue":125,"tr":2,"rarete":10,"prix":500,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964299,"modifiedTime":1664573659385,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"uatjBTFCE5ZCqhAd","name":"Fléau lourd","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"1d10+ 3","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":150},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.vDDw0qqM1Kg7Pu6T"}}}
|
||||||
{"_id":"sHj90bPcMaDlOw51","name":"Bâton ferré ou lesté","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.zoBHSbvJPnjbtPh6"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":2,"degats":"1D8","nonletaux":true,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":0,"prix":1,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964299,"modifiedTime":1664573659386,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"v7ymzlEALvsk0poA","name":"Hache","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d6 + 2","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":2,"prix":30},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.2MwgptY2kE4tgYBe"}}}
|
||||||
{"_id":"sju2r73hUHyGbHYg","name":"Épée courte / Glaive","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.Mxv5gMHRvRrsuhPA"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":1,"degats":"1D6+1","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":4,"prix":40,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964300,"modifiedTime":1664573659386,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"wWk0Wfer06Ttmouv","name":"Épée large","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":1,"degats":"1d6+ 2","deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":5,"prix":70},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.iuAizxCvnUxmsjrn"}}}
|
||||||
{"_id":"t2uQcWe7kirUOp3D","name":"Faucheur","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.OlmzE29fh9DFd8TF"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":1,"degats":"1d4 + 1","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":100,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964300,"modifiedTime":1664573659386,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
{"_id":"wv5EiePmPTpqFutt","name":"Épée longue","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","data":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"2d6 + 1","deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":250},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.yiYtZ0sCUpMihvzz"}}}
|
||||||
{"_id":"uatjBTFCE5ZCqhAd","name":"Fléau lourd","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.vDDw0qqM1Kg7Pu6T"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":1,"bonusmaniementdef":0,"degats":"1d10+ 3","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":7,"prix":150,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964300,"modifiedTime":1664573659387,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
|
||||||
{"_id":"v7ymzlEALvsk0poA","name":"Hache","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.2MwgptY2kE4tgYBe"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"1d6 + 2","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":2,"prix":30,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964300,"modifiedTime":1664573659388,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
|
||||||
{"_id":"wWk0Wfer06Ttmouv","name":"Épée large","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.iuAizxCvnUxmsjrn"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":1,"degats":"1d6+ 2","nonletaux":false,"deuxmains":false,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":5,"prix":70,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964300,"modifiedTime":1664573659386,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
|
||||||
{"_id":"wv5EiePmPTpqFutt","name":"Épée longue","type":"arme","img":"systems/fvtt-mournblade/assets/icons/arme.webp","effects":[],"folder":null,"sort":0,"flags":{"core":{"sourceId":"Item.yiYtZ0sCUpMihvzz"}},"system":{"description":"","typearme":"contact","isdefense":true,"bonusmaniementoff":2,"bonusmaniementdef":0,"degats":"2d6 + 1","nonletaux":false,"deuxmains":true,"courte":0,"moyenne":0,"longue":0,"tr":0,"rarete":8,"prix":250,"equipped":false},"ownership":{"default":0,"RiMAsQHaUMojde7N":3},"_stats":{"systemId":"fvtt-mournblade","systemVersion":"10.0.9","coreVersion":"10.286","createdTime":1664572964301,"modifiedTime":1664573659386,"lastModifiedBy":"1Hr6ON03ooIXzvIm"}}
|
|
||||||
|
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000217
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:44.885743 7f7ed4e006c0 Recovering log #215
|
|
||||||
2024/09/10-07:14:44.956966 7f7ed4e006c0 Delete type=3 #213
|
|
||||||
2024/09/10-07:14:44.957144 7f7ed4e006c0 Delete type=0 #215
|
|
||||||
2024/09/10-07:20:33.463210 7f7ecd6006c0 Level-0 table #220: started
|
|
||||||
2024/09/10-07:20:33.463253 7f7ecd6006c0 Level-0 table #220: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.501220 7f7ecd6006c0 Delete type=0 #218
|
|
||||||
2024/09/10-07:20:33.538862 7f7ecd6006c0 Manual compaction at level-0 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.538937 7f7ecd6006c0 Manual compaction at level-1 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.138004 7f7ecf4006c0 Recovering log #210
|
|
||||||
2024/09/09-21:51:17.149501 7f7ecf4006c0 Delete type=3 #208
|
|
||||||
2024/09/09-21:51:17.149609 7f7ecf4006c0 Delete type=0 #210
|
|
||||||
2024/09/09-21:52:48.597265 7f7ecd6006c0 Level-0 table #216: started
|
|
||||||
2024/09/09-21:52:48.597313 7f7ecd6006c0 Level-0 table #216: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.604438 7f7ecd6006c0 Delete type=0 #214
|
|
||||||
2024/09/09-21:52:48.611351 7f7ecd6006c0 Manual compaction at level-0 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.611418 7f7ecd6006c0 Manual compaction at level-1 from '!items!0swiE8k5zfUIqmXu' @ 72057594037927935 : 1 .. '!items!wv5EiePmPTpqFutt' @ 0 : 0; will stop at (end)
|
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000216
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:45.086238 7f7ecf4006c0 Recovering log #214
|
|
||||||
2024/09/10-07:14:45.144857 7f7ecf4006c0 Delete type=3 #212
|
|
||||||
2024/09/10-07:14:45.145056 7f7ecf4006c0 Delete type=0 #214
|
|
||||||
2024/09/10-07:20:33.607105 7f7ecd6006c0 Level-0 table #219: started
|
|
||||||
2024/09/10-07:20:33.607143 7f7ecd6006c0 Level-0 table #219: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.638955 7f7ecd6006c0 Delete type=0 #217
|
|
||||||
2024/09/10-07:20:33.678483 7f7ecd6006c0 Manual compaction at level-0 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.678561 7f7ecd6006c0 Manual compaction at level-1 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.180244 7f7ecea006c0 Recovering log #209
|
|
||||||
2024/09/09-21:51:17.191008 7f7ecea006c0 Delete type=3 #207
|
|
||||||
2024/09/09-21:51:17.191115 7f7ecea006c0 Delete type=0 #209
|
|
||||||
2024/09/09-21:52:48.625325 7f7ecd6006c0 Level-0 table #215: started
|
|
||||||
2024/09/09-21:52:48.625386 7f7ecd6006c0 Level-0 table #215: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.631864 7f7ecd6006c0 Delete type=0 #213
|
|
||||||
2024/09/09-21:52:48.638978 7f7ecd6006c0 Manual compaction at level-0 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.639033 7f7ecd6006c0 Manual compaction at level-1 from '!items!5dGXNiL3WN4cAk7X' @ 72057594037927935 : 1 .. '!items!zzz9JrtWjELdoAfK' @ 0 : 0; will stop at (end)
|
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000216
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:45.020069 7f7ecfe006c0 Recovering log #214
|
|
||||||
2024/09/10-07:14:45.082360 7f7ecfe006c0 Delete type=3 #212
|
|
||||||
2024/09/10-07:14:45.082521 7f7ecfe006c0 Delete type=0 #214
|
|
||||||
2024/09/10-07:20:33.576805 7f7ecd6006c0 Level-0 table #219: started
|
|
||||||
2024/09/10-07:20:33.576855 7f7ecd6006c0 Level-0 table #219: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.606927 7f7ecd6006c0 Delete type=0 #217
|
|
||||||
2024/09/10-07:20:33.678460 7f7ecd6006c0 Manual compaction at level-0 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.678542 7f7ecd6006c0 Manual compaction at level-1 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.166142 7f7ecfe006c0 Recovering log #209
|
|
||||||
2024/09/09-21:51:17.176865 7f7ecfe006c0 Delete type=3 #207
|
|
||||||
2024/09/09-21:51:17.176960 7f7ecfe006c0 Delete type=0 #209
|
|
||||||
2024/09/09-21:52:48.618041 7f7ecd6006c0 Level-0 table #215: started
|
|
||||||
2024/09/09-21:52:48.618105 7f7ecd6006c0 Level-0 table #215: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.625105 7f7ecd6006c0 Delete type=0 #213
|
|
||||||
2024/09/09-21:52:48.638957 7f7ecd6006c0 Manual compaction at level-0 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.639048 7f7ecd6006c0 Manual compaction at level-1 from '!items!1cZd2hlTV9tykDED' @ 72057594037927935 : 1 .. '!items!y47dBO3Mf5Pn7tOd' @ 0 : 0; will stop at (end)
|
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000216
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:45.210943 7f7ecea006c0 Recovering log #214
|
|
||||||
2024/09/10-07:14:45.265940 7f7ecea006c0 Delete type=3 #212
|
|
||||||
2024/09/10-07:14:45.266060 7f7ecea006c0 Delete type=0 #214
|
|
||||||
2024/09/10-07:20:33.678752 7f7ecd6006c0 Level-0 table #219: started
|
|
||||||
2024/09/10-07:20:33.678827 7f7ecd6006c0 Level-0 table #219: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.713480 7f7ecd6006c0 Delete type=0 #217
|
|
||||||
2024/09/10-07:20:33.816847 7f7ecd6006c0 Manual compaction at level-0 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.816952 7f7ecd6006c0 Manual compaction at level-1 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.208104 7f7ed4e006c0 Recovering log #209
|
|
||||||
2024/09/09-21:51:17.219088 7f7ed4e006c0 Delete type=3 #207
|
|
||||||
2024/09/09-21:51:17.219197 7f7ed4e006c0 Delete type=0 #209
|
|
||||||
2024/09/09-21:52:48.639145 7f7ecd6006c0 Level-0 table #215: started
|
|
||||||
2024/09/09-21:52:48.639185 7f7ecd6006c0 Level-0 table #215: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.646533 7f7ecd6006c0 Delete type=0 #213
|
|
||||||
2024/09/09-21:52:48.668071 7f7ecd6006c0 Manual compaction at level-0 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.668151 7f7ecd6006c0 Manual compaction at level-1 from '!items!2GaJZsqr2c2mcDRv' @ 72057594037927935 : 1 .. '!items!ui4JGsGwHNlSXVK3' @ 0 : 0; will stop at (end)
|
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000216
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:45.269926 7f7ecfe006c0 Recovering log #214
|
|
||||||
2024/09/10-07:14:45.328808 7f7ecfe006c0 Delete type=3 #212
|
|
||||||
2024/09/10-07:14:45.328977 7f7ecfe006c0 Delete type=0 #214
|
|
||||||
2024/09/10-07:20:33.783195 7f7ecd6006c0 Level-0 table #219: started
|
|
||||||
2024/09/10-07:20:33.783241 7f7ecd6006c0 Level-0 table #219: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.816523 7f7ecd6006c0 Delete type=0 #217
|
|
||||||
2024/09/10-07:20:33.816931 7f7ecd6006c0 Manual compaction at level-0 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.817030 7f7ecd6006c0 Manual compaction at level-1 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.222186 7f7ecfe006c0 Recovering log #209
|
|
||||||
2024/09/09-21:51:17.233209 7f7ecfe006c0 Delete type=3 #207
|
|
||||||
2024/09/09-21:51:17.233359 7f7ecfe006c0 Delete type=0 #209
|
|
||||||
2024/09/09-21:52:48.646768 7f7ecd6006c0 Level-0 table #215: started
|
|
||||||
2024/09/09-21:52:48.646827 7f7ecd6006c0 Level-0 table #215: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.653236 7f7ecd6006c0 Delete type=0 #213
|
|
||||||
2024/09/09-21:52:48.668098 7f7ecd6006c0 Manual compaction at level-0 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.668166 7f7ecd6006c0 Manual compaction at level-1 from '!items!09s33sFuju8zjPqI' @ 72057594037927935 : 1 .. '!items!xlyFCQClBZ1N3O1B' @ 0 : 0; will stop at (end)
|
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000216
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:45.148885 7f7ed4e006c0 Recovering log #214
|
|
||||||
2024/09/10-07:14:45.204991 7f7ed4e006c0 Delete type=3 #212
|
|
||||||
2024/09/10-07:14:45.205146 7f7ed4e006c0 Delete type=0 #214
|
|
||||||
2024/09/10-07:20:33.639140 7f7ecd6006c0 Level-0 table #219: started
|
|
||||||
2024/09/10-07:20:33.639178 7f7ecd6006c0 Level-0 table #219: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.677964 7f7ecd6006c0 Delete type=0 #217
|
|
||||||
2024/09/10-07:20:33.678505 7f7ecd6006c0 Manual compaction at level-0 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.678580 7f7ecd6006c0 Manual compaction at level-1 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.194403 7f7ecf4006c0 Recovering log #209
|
|
||||||
2024/09/09-21:51:17.204990 7f7ecf4006c0 Delete type=3 #207
|
|
||||||
2024/09/09-21:51:17.205104 7f7ecf4006c0 Delete type=0 #209
|
|
||||||
2024/09/09-21:52:48.632133 7f7ecd6006c0 Level-0 table #215: started
|
|
||||||
2024/09/09-21:52:48.632191 7f7ecd6006c0 Level-0 table #215: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.638748 7f7ecd6006c0 Delete type=0 #213
|
|
||||||
2024/09/09-21:52:48.638992 7f7ecd6006c0 Manual compaction at level-0 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.639018 7f7ecd6006c0 Manual compaction at level-1 from '!items!2t1KmBeQNuKK5qlN' @ 72057594037927935 : 1 .. '!items!yBvkQb9S64s908sR' @ 0 : 0; will stop at (end)
|
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000112
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:44.657561 7f7ecf4006c0 Recovering log #110
|
|
||||||
2024/09/10-07:14:44.756808 7f7ecf4006c0 Delete type=3 #108
|
|
||||||
2024/09/10-07:14:44.756963 7f7ecf4006c0 Delete type=0 #110
|
|
||||||
2024/09/10-07:20:33.399722 7f7ecd6006c0 Level-0 table #115: started
|
|
||||||
2024/09/10-07:20:33.399823 7f7ecd6006c0 Level-0 table #115: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.426020 7f7ecd6006c0 Delete type=0 #113
|
|
||||||
2024/09/10-07:20:33.538803 7f7ecd6006c0 Manual compaction at level-0 from '!actors!00CKDCqVh5fLZbYo' @ 72057594037927935 : 1 .. '!folders!dwT9WnH0ZnpuZh92' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.538898 7f7ecd6006c0 Manual compaction at level-1 from '!actors!00CKDCqVh5fLZbYo' @ 72057594037927935 : 1 .. '!folders!dwT9WnH0ZnpuZh92' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.088284 7f7ecea006c0 Recovering log #105
|
|
||||||
2024/09/09-21:51:17.099095 7f7ecea006c0 Delete type=3 #103
|
|
||||||
2024/09/09-21:51:17.099204 7f7ecea006c0 Delete type=0 #105
|
|
||||||
2024/09/09-21:52:48.582588 7f7ecd6006c0 Level-0 table #111: started
|
|
||||||
2024/09/09-21:52:48.582673 7f7ecd6006c0 Level-0 table #111: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.589717 7f7ecd6006c0 Delete type=0 #109
|
|
||||||
2024/09/09-21:52:48.611309 7f7ecd6006c0 Manual compaction at level-0 from '!actors!00CKDCqVh5fLZbYo' @ 72057594037927935 : 1 .. '!folders!dwT9WnH0ZnpuZh92' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.611384 7f7ecd6006c0 Manual compaction at level-1 from '!actors!00CKDCqVh5fLZbYo' @ 72057594037927935 : 1 .. '!folders!dwT9WnH0ZnpuZh92' @ 0 : 0; will stop at (end)
|
|
Binary file not shown.
@ -1,7 +1,11 @@
|
|||||||
{"name":"Cuirasse, armure de demi-plaques","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":4,"degats":"","rarete":8,"prix":200},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.FvufSkzJOSftZhYt"}},"_id":"2hD1DQVeCIQIXFU7"}
|
{"name":"Cuirasse, armure de demi-plaques","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":4,"degats":"","rarete":8,"prix":200},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.FvufSkzJOSftZhYt"}},"_id":"2hD1DQVeCIQIXFU7"}
|
||||||
|
{"name":"Pavois","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"<p>Le pavois se plante dans le sol au début du combat et ne peut normalement plus être déplacé jusqu’à son issue.</p>","typeprotection":"armure","protection":3,"degats":"","rarete":7,"prix":50},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.y1kNQJYRCEol83IA"}},"_id":"2uqB1doLYK4S2EN2"}
|
||||||
{"name":"Armure de plaques melnibonéenne","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"<p>Cette armure ornée et fi nement gravée est ajustée aux mensurations de celui qui la porte. On ne peut en trouver en dehors d’Imrryr avant sa chute. L’armure couvre tout le corps des pieds à la tête. Le casque est toujours surmonté d’une sculpture en forme de dragon ou de serpent de mer. Des motifs complexes et imbriqués recouvrent la surface de tous les éléments de l’armure. Après la chute d’Imrryr, quelques pièces d’armure melnibonéennes apparaissent de temps en temps sur les marchés mais les armures entières restent rarissimes. Si elle a été spécialement conçue pour son porteur, une armure de plaques melnibonéenne n’impose pas de pénalité d’encombrement à ce dernier.</p>","typeprotection":"armure","protection":6,"degats":"","rarete":10,"prix":1000},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.09OukepQ8Oep0642"}},"_id":"FFX0dFDZoVXFzyXk"}
|
{"name":"Armure de plaques melnibonéenne","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"<p>Cette armure ornée et fi nement gravée est ajustée aux mensurations de celui qui la porte. On ne peut en trouver en dehors d’Imrryr avant sa chute. L’armure couvre tout le corps des pieds à la tête. Le casque est toujours surmonté d’une sculpture en forme de dragon ou de serpent de mer. Des motifs complexes et imbriqués recouvrent la surface de tous les éléments de l’armure. Après la chute d’Imrryr, quelques pièces d’armure melnibonéennes apparaissent de temps en temps sur les marchés mais les armures entières restent rarissimes. Si elle a été spécialement conçue pour son porteur, une armure de plaques melnibonéenne n’impose pas de pénalité d’encombrement à ce dernier.</p>","typeprotection":"armure","protection":6,"degats":"","rarete":10,"prix":1000},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.09OukepQ8Oep0642"}},"_id":"FFX0dFDZoVXFzyXk"}
|
||||||
|
{"name":"Bouclier d’infanterie","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":2,"degats":"1D6","rarete":5,"prix":50},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.Xn1tVJgKinG0hc10"}},"_id":"I2X36O7hkpigZmJo"}
|
||||||
{"name":"Tenues rembourrées, cuir souple, fourrures","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":1,"degats":"","rarete":2,"prix":10},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.5dV4DORRrNdAd2Z5"}},"_id":"SqyKvR1GJMJvgHCJ"}
|
{"name":"Tenues rembourrées, cuir souple, fourrures","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":1,"degats":"","rarete":2,"prix":10},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.5dV4DORRrNdAd2Z5"}},"_id":"SqyKvR1GJMJvgHCJ"}
|
||||||
|
{"name":"Targe","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":1,"degats":"1D4","rarete":4,"prix":20},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.dyTeMFfvg5mAKT2n"}},"_id":"WH1m35jgm7ilTTuG"}
|
||||||
{"name":"Armure du Désert des Larmes","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"<p>Les barbares et les nomades du Désert des Larmes ont créé des armures de bois protégeant l’abdomen, la poitrine et les bras. Ces armures sont faites à partir du bois de l’arbre Fal, originaire de plateaux pluvieux situés au-delà du désert. Les barbares décorent souvent leurs armures de symboles tribaux et en protègent la surface avec de la laque. Conçue en bois, cette armure a la particularité de pouvoir flotter quoiqu’un séjour prolongé dans l’eau risque de la détériorer très rapidement. Elle n’en reste pas moins une protection très recherchée par ceux qui ont à s’aventurer sur les flots.</p>","typeprotection":"armure","protection":2,"degats":"","rarete":8,"prix":200},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.b1JGc5OlrIzlQbTO"}},"_id":"ZzzXZUn5PU1lnP0X"}
|
{"name":"Armure du Désert des Larmes","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"<p>Les barbares et les nomades du Désert des Larmes ont créé des armures de bois protégeant l’abdomen, la poitrine et les bras. Ces armures sont faites à partir du bois de l’arbre Fal, originaire de plateaux pluvieux situés au-delà du désert. Les barbares décorent souvent leurs armures de symboles tribaux et en protègent la surface avec de la laque. Conçue en bois, cette armure a la particularité de pouvoir flotter quoiqu’un séjour prolongé dans l’eau risque de la détériorer très rapidement. Elle n’en reste pas moins une protection très recherchée par ceux qui ont à s’aventurer sur les flots.</p>","typeprotection":"armure","protection":2,"degats":"","rarete":8,"prix":200},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.b1JGc5OlrIzlQbTO"}},"_id":"ZzzXZUn5PU1lnP0X"}
|
||||||
{"name":"Cuir bouilli, cuir clouté","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":2,"degats":"","rarete":5,"prix":50},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.T9RAyLXDPSHlvoDR"}},"_id":"kis2lI7oEtdWzJbQ"}
|
{"name":"Cuir bouilli, cuir clouté","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":2,"degats":"","rarete":5,"prix":50},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.T9RAyLXDPSHlvoDR"}},"_id":"kis2lI7oEtdWzJbQ"}
|
||||||
{"name":"Armure de plates, harnois","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":5,"degats":"","rarete":10,"prix":500},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.7JErvrlTYaFbCvoR"}},"_id":"so7x8hK8qEc5QqnQ"}
|
{"name":"Armure de plates, harnois","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":5,"degats":"","rarete":10,"prix":500},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.7JErvrlTYaFbCvoR"}},"_id":"so7x8hK8qEc5QqnQ"}
|
||||||
{"name":"Broigne, cotte de maille","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":3,"degats":"","rarete":7,"prix":150},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.th6blCtgBmsWSYdY"}},"_id":"veoS6Gtzj6Dq087V"}
|
{"name":"Broigne, cotte de maille","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":3,"degats":"","rarete":7,"prix":150},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.th6blCtgBmsWSYdY"}},"_id":"veoS6Gtzj6Dq087V"}
|
||||||
|
{"name":"Écu d’acier","type":"protection","img":"systems/fvtt-mournblade/assets/icons/protection.webp","data":{"description":"","typeprotection":"armure","protection":3,"degats":"1D8","rarete":9,"prix":100},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"RiMAsQHaUMojde7N":3},"flags":{"core":{"sourceId":"Item.TAA8qb6POO0HyhU5"}},"_id":"zqKOtmrDNrDYBu2z"}
|
||||||
|
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000216
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:44.961549 7f7ecea006c0 Recovering log #214
|
|
||||||
2024/09/10-07:14:45.016222 7f7ecea006c0 Delete type=3 #212
|
|
||||||
2024/09/10-07:14:45.016606 7f7ecea006c0 Delete type=0 #214
|
|
||||||
2024/09/10-07:20:33.539100 7f7ecd6006c0 Level-0 table #219: started
|
|
||||||
2024/09/10-07:20:33.539159 7f7ecd6006c0 Level-0 table #219: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.576585 7f7ecd6006c0 Delete type=0 #217
|
|
||||||
2024/09/10-07:20:33.678420 7f7ecd6006c0 Manual compaction at level-0 from '!items!2hD1DQVeCIQIXFU7' @ 72057594037927935 : 1 .. '!items!veoS6Gtzj6Dq087V' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.678524 7f7ecd6006c0 Manual compaction at level-1 from '!items!2hD1DQVeCIQIXFU7' @ 72057594037927935 : 1 .. '!items!veoS6Gtzj6Dq087V' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.152829 7f7ed4e006c0 Recovering log #209
|
|
||||||
2024/09/09-21:51:17.163037 7f7ed4e006c0 Delete type=3 #207
|
|
||||||
2024/09/09-21:51:17.163143 7f7ed4e006c0 Delete type=0 #209
|
|
||||||
2024/09/09-21:52:48.611545 7f7ecd6006c0 Level-0 table #215: started
|
|
||||||
2024/09/09-21:52:48.611586 7f7ecd6006c0 Level-0 table #215: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.617883 7f7ecd6006c0 Delete type=0 #213
|
|
||||||
2024/09/09-21:52:48.638938 7f7ecd6006c0 Manual compaction at level-0 from '!items!2hD1DQVeCIQIXFU7' @ 72057594037927935 : 1 .. '!items!veoS6Gtzj6Dq087V' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.639004 7f7ecd6006c0 Manual compaction at level-1 from '!items!2hD1DQVeCIQIXFU7' @ 72057594037927935 : 1 .. '!items!veoS6Gtzj6Dq087V' @ 0 : 0; will stop at (end)
|
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000216
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:45.464393 7f7ecea006c0 Recovering log #214
|
|
||||||
2024/09/10-07:14:45.568041 7f7ecea006c0 Delete type=3 #212
|
|
||||||
2024/09/10-07:14:45.568192 7f7ecea006c0 Delete type=0 #214
|
|
||||||
2024/09/10-07:20:33.817119 7f7ecd6006c0 Level-0 table #219: started
|
|
||||||
2024/09/10-07:20:33.817259 7f7ecd6006c0 Level-0 table #219: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.853842 7f7ecd6006c0 Delete type=0 #217
|
|
||||||
2024/09/10-07:20:33.990487 7f7ecd6006c0 Manual compaction at level-0 from '!items!1JqWbEkHUoKXbsgn' @ 72057594037927935 : 1 .. '!items!xnCf2xIPzdsUoBTy' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.990597 7f7ecd6006c0 Manual compaction at level-1 from '!items!1JqWbEkHUoKXbsgn' @ 72057594037927935 : 1 .. '!items!xnCf2xIPzdsUoBTy' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.266111 7f7ed4e006c0 Recovering log #209
|
|
||||||
2024/09/09-21:51:17.276764 7f7ed4e006c0 Delete type=3 #207
|
|
||||||
2024/09/09-21:51:17.276860 7f7ed4e006c0 Delete type=0 #209
|
|
||||||
2024/09/09-21:52:48.668305 7f7ecd6006c0 Level-0 table #215: started
|
|
||||||
2024/09/09-21:52:48.668347 7f7ecd6006c0 Level-0 table #215: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.674748 7f7ecd6006c0 Delete type=0 #213
|
|
||||||
2024/09/09-21:52:48.696639 7f7ecd6006c0 Manual compaction at level-0 from '!items!1JqWbEkHUoKXbsgn' @ 72057594037927935 : 1 .. '!items!xnCf2xIPzdsUoBTy' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.696713 7f7ecd6006c0 Manual compaction at level-1 from '!items!1JqWbEkHUoKXbsgn' @ 72057594037927935 : 1 .. '!items!xnCf2xIPzdsUoBTy' @ 0 : 0; will stop at (end)
|
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000132
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:45.696006 7f7ecf4006c0 Recovering log #130
|
|
||||||
2024/09/10-07:14:45.752701 7f7ecf4006c0 Delete type=3 #128
|
|
||||||
2024/09/10-07:14:45.752833 7f7ecf4006c0 Delete type=0 #130
|
|
||||||
2024/09/10-07:20:33.897005 7f7ecd6006c0 Level-0 table #135: started
|
|
||||||
2024/09/10-07:20:33.897068 7f7ecd6006c0 Level-0 table #135: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.928636 7f7ecd6006c0 Delete type=0 #133
|
|
||||||
2024/09/10-07:20:33.990553 7f7ecd6006c0 Manual compaction at level-0 from '!scenes!ZDV2IwduhOXTxy72' @ 72057594037927935 : 1 .. '!scenes!ZDV2IwduhOXTxy72' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.990640 7f7ecd6006c0 Manual compaction at level-1 from '!scenes!ZDV2IwduhOXTxy72' @ 72057594037927935 : 1 .. '!scenes!ZDV2IwduhOXTxy72' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.296296 7f7ecea006c0 Recovering log #125
|
|
||||||
2024/09/09-21:51:17.307966 7f7ecea006c0 Delete type=3 #123
|
|
||||||
2024/09/09-21:51:17.308176 7f7ecea006c0 Delete type=0 #125
|
|
||||||
2024/09/09-21:52:48.682640 7f7ecd6006c0 Level-0 table #131: started
|
|
||||||
2024/09/09-21:52:48.682688 7f7ecd6006c0 Level-0 table #131: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.689372 7f7ecd6006c0 Delete type=0 #129
|
|
||||||
2024/09/09-21:52:48.696686 7f7ecd6006c0 Manual compaction at level-0 from '!scenes!ZDV2IwduhOXTxy72' @ 72057594037927935 : 1 .. '!scenes!ZDV2IwduhOXTxy72' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.696741 7f7ecd6006c0 Manual compaction at level-1 from '!scenes!ZDV2IwduhOXTxy72' @ 72057594037927935 : 1 .. '!scenes!ZDV2IwduhOXTxy72' @ 0 : 0; will stop at (end)
|
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000124
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:44.824622 7f7ecf4006c0 Recovering log #122
|
|
||||||
2024/09/10-07:14:44.881625 7f7ecf4006c0 Delete type=3 #120
|
|
||||||
2024/09/10-07:14:44.881742 7f7ecf4006c0 Delete type=0 #122
|
|
||||||
2024/09/10-07:20:33.426241 7f7ecd6006c0 Level-0 table #127: started
|
|
||||||
2024/09/10-07:20:33.426287 7f7ecd6006c0 Level-0 table #127: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.462927 7f7ecd6006c0 Delete type=0 #125
|
|
||||||
2024/09/10-07:20:33.538838 7f7ecd6006c0 Manual compaction at level-0 from '!items!6bmjc4MUduGs9s6n' @ 72057594037927935 : 1 .. '!items!t692JcsGHG4YJIlM' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.538919 7f7ecd6006c0 Manual compaction at level-1 from '!items!6bmjc4MUduGs9s6n' @ 72057594037927935 : 1 .. '!items!t692JcsGHG4YJIlM' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.124273 7f7ecea006c0 Recovering log #117
|
|
||||||
2024/09/09-21:51:17.134938 7f7ecea006c0 Delete type=3 #115
|
|
||||||
2024/09/09-21:51:17.135076 7f7ecea006c0 Delete type=0 #117
|
|
||||||
2024/09/09-21:52:48.604710 7f7ecd6006c0 Level-0 table #123: started
|
|
||||||
2024/09/09-21:52:48.604782 7f7ecd6006c0 Level-0 table #123: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.611122 7f7ecd6006c0 Delete type=0 #121
|
|
||||||
2024/09/09-21:52:48.611368 7f7ecd6006c0 Manual compaction at level-0 from '!items!6bmjc4MUduGs9s6n' @ 72057594037927935 : 1 .. '!items!t692JcsGHG4YJIlM' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.611434 7f7ecd6006c0 Manual compaction at level-1 from '!items!6bmjc4MUduGs9s6n' @ 72057594037927935 : 1 .. '!items!t692JcsGHG4YJIlM' @ 0 : 0; will stop at (end)
|
|
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
|||||||
MANIFEST-000216
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/10-07:14:44.767296 7f7ecfe006c0 Recovering log #214
|
|
||||||
2024/09/10-07:14:44.820594 7f7ecfe006c0 Delete type=3 #212
|
|
||||||
2024/09/10-07:14:44.820691 7f7ecfe006c0 Delete type=0 #214
|
|
||||||
2024/09/10-07:20:33.501559 7f7ecd6006c0 Level-0 table #219: started
|
|
||||||
2024/09/10-07:20:33.501629 7f7ecd6006c0 Level-0 table #219: 0 bytes OK
|
|
||||||
2024/09/10-07:20:33.538595 7f7ecd6006c0 Delete type=0 #217
|
|
||||||
2024/09/10-07:20:33.538881 7f7ecd6006c0 Manual compaction at level-0 from '!items!0LlzDyCurJedqeyG' @ 72057594037927935 : 1 .. '!items!tq6mEgXog7h4VyWk' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/10-07:20:33.538953 7f7ecd6006c0 Manual compaction at level-1 from '!items!0LlzDyCurJedqeyG' @ 72057594037927935 : 1 .. '!items!tq6mEgXog7h4VyWk' @ 0 : 0; will stop at (end)
|
|
@ -1,8 +0,0 @@
|
|||||||
2024/09/09-21:51:17.108857 7f7ecfe006c0 Recovering log #209
|
|
||||||
2024/09/09-21:51:17.120456 7f7ecfe006c0 Delete type=3 #207
|
|
||||||
2024/09/09-21:51:17.120652 7f7ecfe006c0 Delete type=0 #209
|
|
||||||
2024/09/09-21:52:48.589940 7f7ecd6006c0 Level-0 table #215: started
|
|
||||||
2024/09/09-21:52:48.589993 7f7ecd6006c0 Level-0 table #215: 0 bytes OK
|
|
||||||
2024/09/09-21:52:48.597050 7f7ecd6006c0 Delete type=0 #213
|
|
||||||
2024/09/09-21:52:48.611333 7f7ecd6006c0 Manual compaction at level-0 from '!items!0LlzDyCurJedqeyG' @ 72057594037927935 : 1 .. '!items!tq6mEgXog7h4VyWk' @ 0 : 0; will stop at (end)
|
|
||||||
2024/09/09-21:52:48.611399 7f7ecd6006c0 Manual compaction at level-1 from '!items!0LlzDyCurJedqeyG' @ 72057594037927935 : 1 .. '!items!tq6mEgXog7h4VyWk' @ 0 : 0; will stop at (end)
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user