Compare commits

..

59 Commits

Author SHA1 Message Date
895aa01419 Enable links in editor 2022-09-27 20:47:30 +02:00
9631e5e72a Merge conteneur 2022-09-26 08:28:47 +02:00
716cc53b29 Merge conteneur 2022-09-26 08:24:39 +02:00
44952d4410 Fix hotbar + tooltip 2022-09-25 21:14:39 +02:00
a7991bce92 Fix hotbar + tooltip 2022-09-25 21:13:15 +02:00
a1c20019e8 v10 init fix 2022-09-19 23:23:54 +02:00
af8576a4a1 Fix initfor combat 2022-09-09 23:49:01 +02:00
6c35ddfb0b rework ID 2022-09-02 17:31:12 +02:00
0cbcaee45e rework ID 2022-09-02 16:21:18 +02:00
904ff821e1 rework ID 2022-09-02 16:19:16 +02:00
5c13cde07a rework ID 2022-09-02 16:08:56 +02:00
51c1e205e9 rework ID 2022-09-01 22:40:29 +02:00
90a83f4571 rework ID 2022-09-01 22:23:58 +02:00
3311bc091a rework ID 2022-09-01 21:26:10 +02:00
fa8f9869a6 v10 sync 2022-08-31 23:00:41 +02:00
36b905134e v10 sync 2022-08-31 22:46:19 +02:00
eeb0a906e7 v10 sync 2022-08-31 22:24:56 +02:00
c552411d61 Allow configurable logo 2022-07-17 18:24:29 +02:00
d3ae59f70d Allow configurable logo 2022-07-17 18:20:05 +02:00
cf7d76fdba Fix d6BB combat roll 2022-07-16 11:06:34 +02:00
89ec404ca8 v10 branch - Update manifest 2022-07-16 11:05:15 +02:00
8f60aa95ee Fix d6BB combat roll 2022-07-16 11:03:33 +02:00
d888c6a2eb v10 branch - Update manifest 2022-07-13 08:07:16 +02:00
165e41fef6 v10 branch - Update manifest 2022-07-13 08:07:04 +02:00
19bb0798c8 Sync 2022-07-07 13:33:31 +02:00
05f044bc7c Foundry v10 version 2022-07-01 16:30:21 +02:00
996ac1c88d Foundry v10 version 2022-07-01 16:00:49 +02:00
cc1964093d Foundry v10 version 2022-07-01 15:48:54 +02:00
d27b78d1d2 Review fight automation + alchimie 2022-06-11 20:56:35 +02:00
7259d3dc21 Review fight automation 2022-06-11 10:21:18 +02:00
ef5cf6f393 BoL Migration 2022-05-24 23:27:33 +02:00
3e50a9135f Various fixes 2022-05-23 18:38:51 +02:00
82c902099f Fix sur points de creation 2022-05-23 16:12:53 +02:00
c26e43bac7 Fix files 2022-05-21 17:57:04 +02:00
4159b6b181 Fix files 2022-05-21 17:56:52 +02:00
45cb082d8e Start adv generator 2022-05-20 21:54:17 +02:00
2637f698ad Start adv generator 2022-05-20 21:50:18 +02:00
9b8762300e Start adv generator 2022-05-20 00:00:49 +02:00
dfac102925 Start adv generator 2022-05-19 23:30:29 +02:00
fad281a7b3 Sync german translations + some fixes in compendium 2022-05-13 16:20:45 +02:00
1191442f04 Merge pull request #17 from gsterling/master
German welcome message
2022-05-13 16:15:36 +02:00
fe93888c1b add mentions for truant spiele for the the german version 2022-05-13 15:38:16 +02:00
127f200c27 add german welcome message 2022-05-13 15:34:04 +02:00
b078ffa992 Translate welcome message 2022-05-12 23:21:00 +02:00
d713066b5c update De translation 2022-05-12 19:38:41 +02:00
7adfbfe148 Merge pull request #15 from gsterling/master
Add newest german translations.
2022-05-12 19:37:59 +02:00
2186d986ca Merge branch 'master' of https://github.com/ZigmundKreud/bol 2022-05-12 19:31:11 +02:00
590fba0cbd add german char bio translations 2022-05-12 19:26:16 +02:00
0c9e598958 add additional german translations 2022-05-12 19:18:55 +02:00
049604ce98 Add new translation keys 2022-05-12 10:15:21 +02:00
471a18cd14 Enhance localization stuff 2022-05-12 08:25:55 +02:00
58c781f2f2 Enhance localization stuff 2022-05-11 22:07:03 +02:00
c9722b9b04 Enhance localization stuff 2022-05-11 22:05:35 +02:00
44ce88dd17 Enhance localization stuff 2022-05-11 19:29:32 +02:00
a31fe251e0 Add german translation 2022-05-11 15:20:02 +02:00
76a050b023 Merge pull request #13 from gsterling/master
add german translation
2022-05-11 15:19:37 +02:00
b68a6dbd23 add german translation 2022-05-11 13:14:58 +02:00
34c7024191 Advantage! 2022-05-10 23:04:04 +02:00
33da01707d Advantage! 2022-05-10 22:27:21 +02:00
69 changed files with 2878 additions and 1162 deletions

View File

@ -40,4 +40,4 @@ Maps : Emmanuel Roudier.
# Developmement # Developmement
Zigmund, LeRatierBretonnien LeRatierBretonnien, Zigmund (historical)

View File

@ -389,16 +389,16 @@ ul.no-bullets {
background-color: lightgray; background-color: lightgray;
} }
.bol h1.form-header { .bol h1.form-header {
font-size: 2.5em; font-size: 2.2em;
font-weight: 700; font-weight: 700;
} }
.bol h2.form-header { .bol h2.form-header {
font-size: 2em; font-size: 1.8em;
font-weight: 500; font-weight: 500;
border-bottom: 1px groove #eeede0; border-bottom: 1px groove #eeede0;
} }
.bol h3.form-header { .bol h3.form-header {
font-size: 1.5em; font-size: 1.2em;
font-weight: 500; font-weight: 500;
border-bottom: 1px groove #eeede0; border-bottom: 1px groove #eeede0;
} }
@ -769,7 +769,7 @@ body.system-bol img#logo {
min-height: 700px; min-height: 700px;
height: 700px; height: 700px;
} }
.bol.sheet.actor .window-content form { .bol.sheet.actor .window-content .bol-actor-form {
background-image: url("/systems/bol/ui/logo.webp"); background-image: url("/systems/bol/ui/logo.webp");
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: 190px 115px; background-size: 190px 115px;
@ -855,11 +855,30 @@ body.system-bol img#logo {
font-weight: bold; font-weight: bold;
color: #4b4a44; color: #4b4a44;
} }
.bol.sheet.actor .bonus-text {
margin-top: 7px;
}
.bol.sheet.actor .stat-value { .bol.sheet.actor .stat-value {
font-size: 1.5rem; font-size: 1.5rem;
font-weight: bold; font-weight: bold;
color: darkred; color: darkred;
} }
.bol.sheet.actor .resource-bonus {
font-weight: bold;
color: darkred;
}
.bol.sheet.actor .resources-value {
background-color:#2a2a2a30;
border-color: #003c1e;
margin-top: 4px;
border-radius: 0.5rem;
}
.bol.sheet.actor .resources-novalue {
background-color:#2a2a2a00;
border-color: #003c1e;
margin-top: 4px;
border-radius: 0.5rem;
}
.bol.sheet.actor .stat-roll { .bol.sheet.actor .stat-roll {
font-size: 1.5rem; font-size: 1.5rem;
color: #4b4a44; color: #4b4a44;
@ -1032,3 +1051,7 @@ body.system-bol img#logo {
.bol-hud-menu label { .bol-hud-menu label {
font-size: 0.75rem; font-size: 0.75rem;
} }
.bol-margin-tb-2 {
margin-top: 2px;
margin-bottom: 2px;
}

4
images/.directory Normal file
View File

@ -0,0 +1,4 @@
[Dolphin]
Timestamp=2022,7,17,14,58,4.757
Version=4
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails

458
lang/de.json Normal file
View File

@ -0,0 +1,458 @@
{
"ACTOR.TypeCharacter": "Charakter",
"ACTOR.TypeEncounter": "NSC",
"ITEM.TypeItem": "Objekt",
"ITEM.TypeFeature": "Eigenschaft",
"ITEM.TypeWeapon": "Waffe",
"ITEM.TypeArmor": "Rüstung",
"BOL.attributes.vigor": "Stärke",
"BOL.attributes.halfvigor" : "Demi-vigueur",
"BOL.attributes.agility": "Geschicklichkeit",
"BOL.attributes.mind": "Verstand",
"BOL.attributes.appeal": "Auftreten",
"BOL.aptitudes.init": "Initiative",
"BOL.aptitudes.melee": "Nahkampf",
"BOL.aptitudes.ranged": "Fernkampf",
"BOL.aptitudes.def": "Verteidigung",
"BOL.aptitudes.prot": "Schutz",
"BOL.resources.hp": "Lebensblut",
"BOL.resources.hero": "Heldenpunkte",
"BOL.resources.faith": "Glaube",
"BOL.resources.creation": "Erschaffung",
"BOL.resources.power": "Arkane Macht",
"BOL.resources.villainy": "Boshaftigkeit",
"BOL.resources.alchemypoints": "Alchemiepunkte",
"BOL.traits.xp": "Erfahrung",
"BOL.ui.tab.stats": "Attribute",
"BOL.ui.tab.combat": "Kampf",
"BOL.ui.tab.actions": "Aktionen",
"BOL.ui.tab.features": "Eigenschaften",
"BOL.ui.tab.equipment": "Ausrüstung",
"BOL.ui.tab.description": "Beschreibung",
"BOL.ui.tab.details": "Details",
"BOL.ui.tab.spellalchemy": "Zaubersprüche & Alchemie",
"BOL.ui.properties": "Eigenschaften",
"BOL.ui.description": "Beschreibung",
"BOL.ui.actions": "Aktionen",
"BOL.ui.capacities": "Fähigkeiten",
"BOL.ui.capacityProperties": "Fähigkeitenseigenschaften",
"BOL.ui.damages": "Schaden",
"BOL.ui.details": "Details",
"BOL.ui.category": "Kategorie",
"BOL.ui.subcategory": "Unterkategorie",
"BOL.ui.type": "Typ",
"BOL.ui.subtype": "Untertyp",
"BOL.ui.attribute" : "Attribut",
"BOL.ui.aptitude" : "Einstellungen",
"BOL.ui.advantages" : "Vorteile/Nachteile",
"BOL.ui.modifiers": "Modifikatoren",
"BOL.ui.item": "Objekt",
"BOL.ui.edit": "Ändern",
"BOL.ui.unequip": "Ablegen",
"BOL.ui.equip": "Anlegen",
"BOL.ui.delete": "Löschen",
"BOL.ui.roll" : "Würfeln",
"BOL.ui.equipment" : "Ausrüstung",
"BOL.ui.equipmentProperties" : "Ausrüstungseigenschaften",
"BOL.ui.weaponAttack" : "Waffenangriff",
"BOL.ui.weaponProperties" : "Waffeneigenschaften",
"BOL.ui.protectionProperties" : "Schutzeigenschaften",
"BOL.ui.magicalProperties" : "Magieeigenschaften",
"BOL.ui.capacatyProperties" : "Fähigkeiteneigenschaften",
"BOL.ui.alchemyProperties": "Alchemieeigenschaften",
"BOL.ui.armor" : "Rüstung",
"BOL.ui.reach" : "Reichweite",
"BOL.ui.weapon" : "Waffe",
"BOL.ui.melee" : "Nahkampf",
"BOL.ui.ranged" : "Fernkampf",
"BOL.ui.protection" : "Schutz",
"BOL.ui.shield" : "Schild",
"BOL.ui.blocking" : "Blocken",
"BOL.ui.range" : "Reichweite",
"BOL.ui.quantity" : "Menge",
"BOL.ui.qty" : "Anz.",
"BOL.ui.slot" : "Slot",
"BOL.ui.weight" : "Gewicht",
"BOL.ui.price": "Preis",
"BOL.ui.cancel": "Abbrechen",
"BOL.ui.submit": "OK",
"BOL.ui.attributeCheck" : "Attributsprobe",
"BOL.ui.aptitudeCheck" : "Fähigkeitsprobe",
"BOL.ui.weaponCheck" : "Waffenprobe",
"BOL.ui.spellCheck" : "Zauberprobe",
"BOL.ui.careers" : "Laufbahnen",
"BOL.ui.boons" : "Gaben",
"BOL.ui.flaws" : "Schwächen",
"BOL.ui.rank" : "Rang",
"BOL.ui.success" : "Erfolg",
"BOL.ui.failure" : "Fehlschlag",
"BOL.ui.fumble" : "Kritischer Fehlschlag",
"BOL.ui.critical" : "Mächtiger Erfolg",
"BOL.ui.criticallegend" : "Legendärer Erfolg",
"BOL.ui.maneuvers" : "Kampfmanöver",
"BOL.ui.stacksize" : "Stapelgröße (max)",
"BOL.ui.weapons" : "Waffen",
"BOL.ui.protections" : "Schutz",
"BOL.ui.ammos" : "Munition",
"BOL.ui.containers" : "Behälter",
"BOL.ui.treasure" : "Schätze",
"BOL.ui.vehicles" : "Fahrzeuge/Reittiere",
"BOL.ui.misc" : "Verschiedenes",
"BOL.ui.vehicleProperties" : "Fahrzeugeigenschaften",
"BOL.ui.speed" : "Geschwindigkeit",
"BOL.ui.noWeaponName" : "Unbekannte Waffe",
"BOL.ui.targetDefence": "Verteidigung",
"BOL.ui.applyShieldMalus": "Schildmalus anwenden",
"BOL.ui.shieldMalus": "Schildmalus",
"BOL.ui.defenseScore": "Verteidigungswert",
"BOL.ui.defender": "Verteidiger",
"BOL.ui.difficulty": "Schwierigkeit",
"BOL.ui.spellProperties": "Zaubereigenschaften",
"BOL.ui.duration": "Dauer",
"BOL.ui.spellkeep": "Aufrechterhalten",
"BOL.ui.concentrate": "Konzentrieren",
"BOL.ui.registerInit": "Register Init.",
"BOL.ui.isSorcerer": "Ist Zauberer?",
"BOL.ui.isAlchemist": "Ist Alchemist?",
"BOL.ui.isPriest": "Ist Priester/Druide?",
"BOL.ui.circle": "Kreis",
"BOL.ui.spells": "Zaubersprüche",
"BOL.ui.focusSpell": "Zauberspruch wirken",
"BOL.ui.sorcererRank" : "Zaubererrang",
"BOL.ui.alchemistRank": "Alchemistenrang",
"BOL.ui.mandatoryconditions": "Benötigte Vorraussetzungen",
"BOL.ui.optionnalconditions": "Optionale Vorraussetzungen",
"BOL.ui.ppcost": "Arkane Macht-Kosten",
"BOL.ui.ppAvailable": "Verfügbare Arkane Macht",
"BOL.ui.pccost": "Creation Points cost",
"BOL.ui.pcnow": "Actual Creation Points",
"BOL.ui.alchemyType": "Typ",
"BOL.ui.alchemy": "Alchemie",
"BOL.ui.makeAlchemy": "Alchemika herstellen",
"BOL.ui.alchemyCostTotal": "Alchemiepunkte ingesamt",
"BOL.ui.alchemyInvest": "Alchemiepunkte investieren",
"BOL.ui.alchemyCurrent": "Aktuelle Alchemiepunkte in Objekten",
"BOL.ui.advance": "Status",
"BOL.ui.isadvantage": "Gibt zusätzlichen Würfel?",
"BOL.ui.isbonusdice": "Gibt zusätzlichen Würfel?",
"BOL.ui.ismalusdice": "Gibt zusätzlichen Würfel?",
"BOL.ui.bonusmalus": "Zusätzliche Boni/Mali?",
"BOL.ui.nbdices": "Anzahl der Würfel",
"BOL.ui.totalmod": "Kompletter Mod.",
"BOL.ui.rangeModifiers": "Reichweitenmodifikator",
"BOL.ui.money": "Gold",
"BOL.ui.moneyTitle": "Gold & Schätze",
"BOL.ui.fightOption": "Kampfoptionen",
"BOL.ui.none": "Nichts",
"BOL.ui.fightOptionType": "Kampfoptionstypen",
"BOL.ui.activated": "Aktiviert",
"BOL.ui.deactivated": "Deaktiviert",
"BOL.ui.status": "Status",
"BOL.ui.toactivated": "Aktiv (>Deaktivieren)",
"BOL.ui.todeactivated": "Inaktiv (>Aktivieren)",
"BOL.ui.armorAgiMalus": "Rüschtung+Schild-Malus (Geschick)",
"BOL.ui.armorInitMalus": "Rüstungsmalus (Init)",
"BOL.ui.attackValue": "Angriffswert",
"BOL.featureCategory.origins": "Herkünfte",
"BOL.featureCategory.races": "Rassen",
"BOL.featureCategory.careers": "Laufbahnen",
"BOL.featureCategory.boons": "Gaben",
"BOL.featureCategory.flaws": "Schwächen",
"BOL.featureCategory.languages": "Sprachen",
"BOL.featureCategory.fightoptions": "Kampfoptionen",
"BOL.featureSubtypes.origin": "Herkunft",
"BOL.featureSubtypes.race": "Rasse",
"BOL.featureSubtypes.career": "Laufbahn",
"BOL.featureSubtypes.boon": "Gabe",
"BOL.featureSubtypes.flaw": "Schwäche",
"BOL.featureSubtypes.language": "Sprache",
"BOL.featureSubtypes.gods": "Glauben & Götter",
"BOL.featureSubtypes.fightOption": "Kampfoption",
"BOL.bougette.nomoney": "Mittellos",
"BOL.bougette.tolive": "Zum Überleben",
"BOL.bougette.easylife": "Einfaches Leben",
"BOL.bougette.luxury" : "Luxuriöses Leben",
"BOL.bougette.rich": "Reich!",
"BOL.fightOptionTypes.armor": "Angriff um die Rüstung zu umgehen",
"BOL.fightOptionTypes.intrepid": "Rücksichtsloser Angriff",
"BOL.fightOptionTypes.twoweaponsdef": "Kampf mit zwei Waffen (Verteidigung)",
"BOL.fightOptionTypes.twoweaponsatt": "Kampf mit zwei Waffen (Angriff)",
"BOL.fightOptionTypes.fulldefense": "Volle Verteidigung",
"BOL.fightOptionTypes.defense": "Verteidigungshaltung",
"BOL.fightOptionTypes.attack": "Angriffshaltung",
"BOL.itemCategory.object": "Objekt",
"BOL.itemCategory.equipment": "Ausrüstung",
"BOL.itemCategory.consumable": "Verbrauchsgut",
"BOL.itemCategory.spell": "Zauber",
"BOL.itemCategory.vehicle": "Fahrzeug/Reittier",
"BOL.itemCategory.other": "Verschiedenes",
"BOL.itemCategory.capacity" : "Fähigkeiten",
"BOL.itemCategory.alchemy": "Alchemie",
"BOL.combatCategory.protections": "Schutz",
"BOL.combatCategory.shields": "Schilde",
"BOL.combatCategory.melee": "Nahkampfwaffen",
"BOL.combatCategory.ranged": "Fernkampfwaffen",
"BOL.combatCategory.fightOptions": "Kampfoptionen",
"BOL.combatCategory.natural": "Natürliche Waffen",
"BOL.equipmentCategory.weapon": "Waffe",
"BOL.equipmentCategory.armor": "Rüstung",
"BOL.equipmentCategory.protection": "Schutz",
"BOL.equipmentCategory.shield": "Schild",
"BOL.equipmentCategory.helm": "Helm",
"BOL.equipmentCategory.jewel": "Schmuck",
"BOL.equipmentCategory.scroll": "Schriftrolle",
"BOL.equipmentCategory.ammunition": "Munition",
"BOL.equipmentCategory.container": "Behälter",
"BOL.equipmentCategory.currency": "Gold",
"BOL.equipmentCategory.other": "Verschiedenes",
"BOL.protectionCategory.armor": "Rüstung",
"BOL.protectionCategory.shield": "Schild",
"BOL.protectionCategory.helm": "Helm",
"BOL.protectionCategory.other": "Verschiedenes",
"BOL.spellItem.charm": "Zauber",
"BOL.spellItem.circle1": "Erster Kreis",
"BOL.spellItem.circle2": "Zweiter Kreis",
"BOL.spellItem.circle3": "Dritter Kreis",
"BOL.alchemyItem.common": "Häufig",
"BOL.alchemyItem.scarce": "Selten",
"BOL.alchemyItem.legend": "Legendär",
"BOL.alchemyItem.mythic": "Mystisch",
"BOL.weaponCategory.melee": "Nahkampf",
"BOL.weaponCategory.ranged": "Fernkampf",
"BOL.weaponCategory.other": "Verschiedenes",
"BOL.itemProperty.damageMultiplier": "Schadensmultiplikator",
"BOL.itemProperty.attackBonusDice": "Angriffsbonuswürfel",
"BOL.itemProperty.equipable": "Ausrüstbar",
"BOL.itemProperty.protection": "Schutz",
"BOL.itemProperty.blocking": "Blocken",
"BOL.itemProperty.magical": "Magisch",
"BOL.itemProperty.magicalProperties": "Magische Eigenschaften",
"BOL.itemProperty.concealable": "Versteckbar",
"BOL.itemProperty.2H": "Zweihändig",
"BOL.itemProperty.helm": "Helm",
"BOL.itemProperty.improvised": "Improvisiert",
"BOL.itemProperty.shield": "Schild",
"BOL.itemProperty.melee": "Nahkampf",
"BOL.itemProperty.throwable": "Werfbar",
"BOL.itemProperty.ignoreshield": "Ignoriert Schilde",
"BOL.itemProperty.bashing": "Nicht-tödlicher Schaden",
"BOL.itemProperty.stackable": "Stapelbar",
"BOL.itemProperty.ranged": "Fernkampf",
"BOL.itemProperty.weapon": "Waffe",
"BOL.itemProperty.reloadable": "Nachladbar",
"BOL.itemProperty.worn": "Angelegt",
"BOL.itemProperty.spell" : "Zauber",
"BOL.itemProperty.armor" : "Rüstung",
"BOL.itemProperty.consumable" : "Verbrauchsgut",
"BOL.itemProperty.bow" : "Bogen",
"BOL.itemProperty.crossbow" : "Armbrust",
"BOL.itemProperty.throwing" : "Wurfwaffe",
"BOL.itemProperty.activable" : "Aktivierbar",
"BOL.itemProperty.powder" : "Schießpulverwaffe",
"BOL.itemProperty.attackAttribute" : "Angriff (Attribut)",
"BOL.itemProperty.attackAptitude" : "Angriff (Fähigkeit)",
"BOL.itemProperty.attackModifiers" : "Angriff (Modifikatoren)",
"BOL.itemProperty.attackReroll1" : "Angriff (bei 1 erneut würfeln)",
"BOL.itemProperty.damage" : "Schaden (Sch)",
"BOL.itemProperty.damageModifiers" : "Schaden (Modifikatoren)",
"BOL.itemProperty.damageAttribute" : "Schaden (Attribut)",
"BOL.itemProperty.damageSpecial" : "Schaden (Spezial)",
"BOL.itemProperty.damageReroll1" : "bei 1 erneut würfeln",
"BOL.itemProperty.range" : "Reichweite (in m)",
"BOL.itemProperty.soakFormula": "Auslösen (Formel)",
"BOL.itemProperty.soakModifiers": "Auslösen (Modifikatoren)",
"BOL.itemProperty.soakValue": "Auslösen (Wert)",
"BOL.itemProperty.armorQuality": "Rüstungsqualität",
"BOL.itemProperty.blockingMalus" : "Blockmalus",
"BOL.itemProperty.blockingAttacksBlocked" : "Angriff geblockt",
"BOL.itemProperty.blocking1Attack" : "Ein Angriff blocken",
"BOL.itemProperty.blockingAllAttacks" : "Alle Angriffe blocken",
"BOL.itemProperty.slot" : "Slotplatz",
"BOL.itemProperty.reload": "Nachladen (Aktion)",
"BOL.itemProperty.weaponSize" : "Waffengröße",
"BOL.itemProperty.difficulty": "Schwierigkeit",
"BOL.itemProperty.natural": "Natürliche Waffe",
"BOL.itemProperty.onlymodifier": "Nur Modifikator (d.h. Angriffe von Kreaturen)",
"BOL.itemStat.quantity": "Anzahl",
"BOL.itemStat.weight": "Gewicht",
"BOL.itemStat.price": "Preis",
"BOL.itemStat.range": "Reichweite",
"BOL.itemStat.damage": "Schaden",
"BOL.itemStat.reload": "Nachladen (Aktion)",
"BOL.itemStat.soak": "Auslösen",
"BOL.itemStat.blocking": "Blocken",
"BOL.itemStat.modifiers": "Modifikatoren",
"BOL.weaponSize.unarmed" : "Unbewaffnet",
"BOL.weaponSize.improvised" : "Improvisiert",
"BOL.weaponSize.light" : "Leicht",
"BOL.weaponSize.medium" : "Mittel",
"BOL.weaponSize.heavy" : "Schwer",
"BOL.itemModifiers.init": "Malus (Initiative)",
"BOL.itemModifiers.social": "Malus (Sozial)",
"BOL.itemModifiers.agility": "Malus (Geschick)",
"BOL.itemModifiers.powercost": "Malus (Zusatzkosten Arkane Macht)",
"BOL.itemBlocking.malus": "Sozial",
"BOL.itemBlocking.nbAttacksPerRound": "Beweglichkeit",
"BOL.soakFormula.none" : "-",
"BOL.soakFormula.light" : "Leicht (Verhindert d6-3 erlittenen Schaden)",
"BOL.soakFormula.medium" : "Mittel (Verhindert d6-2 erlittenen Schaden)",
"BOL.soakFormula.heavy" : "Schwer (Verhindert d6-1 erlittenen Schaden)",
"BOL.armorQuality.none" : "-",
"BOL.armorQuality.light" : "Leicht",
"BOL.armorQuality.lightQ" : "Leicht Qualität",
"BOL.armorQuality.lightSup" : "Leicht Überlegen",
"BOL.armorQuality.lightLeg" : "Leicht Legendär",
"BOL.armorQuality.medium" : "Mittel",
"BOL.armorQuality.mediumQ" : "Mittel Qualität",
"BOL.armorQuality.mediumSup" : "Mittel Überlegen",
"BOL.armorQuality.mediumLeg" : "Mittel Legendär",
"BOL.armorQuality.heavy" : "Schwer",
"BOL.armorQuality.heavyQ" : "Schwer Qualität",
"BOL.armorQuality.heavySup" : "Schwer Überlegen",
"BOL.armorQuality.heavyLeg" : "Schwer Legendär",
"BOL.equipmentSlots.none" : "-",
"BOL.equipmentSlots.head" : "Kopf",
"BOL.equipmentSlots.neck" : "Hals",
"BOL.equipmentSlots.shoulders" : "Schultern",
"BOL.equipmentSlots.body" : "Körper",
"BOL.equipmentSlots.rhand" : "Rechte Hand",
"BOL.equipmentSlots.lhand" : "Linke Hand",
"BOL.equipmentSlots.2hands" : "Zweihändig",
"BOL.equipmentSlots.rarm" : "Rechter Arm",
"BOL.equipmentSlots.larm" : "Linker Arm",
"BOL.equipmentSlots.chest" : "Torso",
"BOL.equipmentSlots.belt" : "Gürtel",
"BOL.equipmentSlots.legs" : "Beine",
"BOL.equipmentSlots.feet" : "Füße",
"BOL.equipmentSlots.finder" : "Finger",
"BOL.equipmentSlots.ear" : "Ohr",
"BOL.vehicleCategory.mount" : "Reittier",
"BOL.vehicleCategory.flying" : "Fluggerät",
"BOL.vehicleCategory.boat" : "Schiff",
"BOL.vehicleCategory.other" : "Anderes",
"BOL.range.PointBlank": "Direkt",
"BOL.range.Short": "Kurz",
"BOL.range.Medium": "Mittel",
"BOL.range.Long": "Weit",
"BOL.range.VeryLong": "Sehr weit",
"BOL.range.Extreme": "Extrem weit",
"BOL.range.Maximum": "Maximale Reichweite",
"BOL.notification.MacroMultipleTokensSelected": "Du hast mehrere Token ausgewählt",
"BOL.notification.MacroNoActorAvailable": "Es konnte kein Akteur gefunden werden",
"BOL.notification.MacroNoTokenSelected": "Du musst einen Token auswählen",
"BOL.size.tiny": "Winzig",
"BOL.size.verysmall": "Sehr klein",
"BOL.size.small" : "Klein",
"BOL.size.medium" : "Mittel",
"BOL.size.large" : "Groß",
"BOL.size.verylarge": "Sehr groß",
"BOL.size.huge" :"Riesig",
"BOL.size.massive" : "Massiv",
"BOL.size.enormous": "Enorm",
"BOL.size.gigantic": "Gigantisch",
"BOL.size.immense": "Immens",
"BOL.size.colossal": "Kolossal",
"BOL.chat.fightactive": "{name} aktiviert die Kampfoption {foName} für diese Runde!",
"BOL.chat.fightunactive": "{name} deaktiviert die Kampfoption {foName} für diese Runde!",
"BOL.chat.isdead": "{name} ist tot!",
"BOL.chat.epitaph": "Möge sein Name auf den Schlachtfeldern Lemurias in Ehren gehalten werden.!",
"BOL.chat.vitalityzero": "Das Lebensblut von {name} ist {hp}: {name} geht zu Boden und wird bewusstlos!",
"BOL.chat.vitalityheroism": "Gib einen Heldenpunkt aus um für eine Runde wieder auf die Beine zu kommen.",
"BOL.chat.vitalityheroismhint": "Dadurch steigt dein Lebensblut auf das Maximum geteilt durch 2 (aufgerundet).",
"BOL.chat.vitalitydying": "Das Lebensblut von {name} ist {hp}! {name} stirbt...",
"BOL.chat.vitalitydyingheroism": "Gib einen Heldenpunkt aus um den Tod herauszufordern.",
"BOL.chat.alchemytitle": "Alchemiepräparat: {name}",
"BOL.chat.alchemypoints": "Investierte Charaktererschaffungspunkte: {pcCostCurrent}",
"BOL.chat.alchemysuccess": "Das alchemistische Präparat wurde erfolgreich abgeschlossen!<br>Erstelle den entsprechenden Gegenstand oder Effekt in deinem Inventar.<br>Der Vorbereitungsfortschritt wurde auf 0 zurückgesetzt.",
"BOL.chat.alchemyfailure": "Das Alchemistische Präparat ist fehlgeschlagen!<br>Der Fortschritt wurde auf 0 zurückgesetzt.",
"BOL.chat.rolldamage": "Schaden auswürfeln",
"BOL.chat.rolldamage6": "Schaden auswürfeln +6",
"BOL.chat.rolldamage12": "Schaden auswürfeln +12 (1 Heldenpunkt)",
"BOL.chat.damageresult": "Schaden von {name}: {total}",
"BOL.chat.damagetarget": "Ziel: {target}",
"BOL.chat.applydamagetotarget": "Schaden auf Ziel anwenden",
"BOL.chat.fightoption": "Kampfoption",
"BOL.chat.reroll": "Erneut Würfeln (1 Heldenpunkt)",
"BOL.chat.toheroic": "In mächtigen Erfolg umwandeln (1 Heldenpunkt)",
"BOL.chat.tolegend": "In legendären Erfolg umwandeln (1 Heldenpunkt)",
"BOL.chat.hurttitle": "{name} wird {damageTotal} Schaden erleiden!",
"BOL.chat.armordefault": "Dieser Angriff richtet sich gegen Fehler in deiner Rüstung. Du musst den Schaden ohne den Schutz deiner Rüstung einstecken!",
"BOL.chat.witharmor": "Schaden MIT Rüstungsschutz anwenden",
"BOL.chat.withoutarmor": "Schaden OHNE Rüstungsschutz anwenden",
"BOL.chat.shakeoff": "Nur ein Kratzer (1 Heldenpunkt)",
"BOL.chat.splinteredshield": "Opfere dein Schild/Schwert {name} (1 Heldenpunkt)",
"BOL.chat.damagesummary": "Schaden durch {name} erlitten",
"BOL.chat.protectvalue": "Rüstungsschutz",
"BOL.chat.noprotectvalue": "Kein Rüstungsschutz!",
"BOL.chat.heroreducedamage": "Gib einen Heldenpunkt aus um eine zusätzliche Schadensreduktion von {total} zu bekommen.",
"BOL.chat.herosplintered": "Du hast keinen Schaden eingesteckt dank {weaponHero.name}. Leider wurde es während der Parade zerstört. Du hast einen Heldenpunkt verloren.",
"BOL.chat.finaldamage": "Endergebnis: {finalDamage} Schaden!",
"BOL.chat.spell": "Zauber",
"BOL.chat.spellcost": "Arkane Macht-Kosten",
"BOL.chat.spellremaining": "Verbleibende Arkane Macht",
"BOL.dialog.soeasy": "Trivial (+4)",
"BOL.dialog.veryeasy": "Sehr leicht (+2)",
"BOL.dialog.easy": "Leicht (+1)",
"BOL.dialog.moderate": "Normal (0)",
"BOL.dialog.hard": "Knifflig (-1)",
"BOL.dialog.tough": "Schwierig (-2)",
"BOL.dialog.demanding": "Sehr Schwierig (-4)",
"BOL.dialog.formidable": "Herausfordernd (-6)",
"BOL.dialog.heroic": "Heldenhaft (-8)",
"BOL.dialog.mythic": "Mystisch (-10)",
"BOL.dialog.divine": "Göttlich (-12)",
"BOL.dialog.pointblank": "Direkt (+1)",
"BOL.dialog.close": "Kurz (0)",
"BOL.dialog.medium": "Mittel (-1)",
"BOL.dialog.long": "Weit (-2)",
"BOL.dialog.distant": "Sehr Weit (-4)",
"BOL.dialog.extreme": "Extrem Weit (-6)",
"BOL.dialog.utmost": "Maximale Reichweite (-8)",
"BOL.ui.name": "Name",
"BOL.ui.xp": "Erfahrung",
"BOL.ui.xpspent": "Ausgegeben",
"BOL.ui.xptotal": "Insgesamt",
"BOL.ui.biosize": "Größe",
"BOL.ui.bioweight": "Gewicht",
"BOL.ui.bioage": "Alter",
"BOL.ui.biohair": "Haare",
"BOL.ui.bioeyes": "Augen",
"BOL.ui.biosigns": "Erkennungszeichen",
"BOL.ui.biodescription": "Beschreibung",
"BOL.ui.bionotes": "Notizen",
"BOL.chat.welcome1": "Willkommen zu Barbarians of Lemuria (französische Ludospherik-Version, deutsche Übersetzung von Truant Spiele)",
"BOL.chat.welcome2": "Zum Spielen werden zwingend die passenden BoL Bücher benötigt. Die französischen Originalbücher für dieses System gibt es hier: http://www.ludospherik.fr/content/14-barbarians-of-lemuria<br>Die deutsche Übersetzung gibt es bei Truant Spiele: https://truant.com/produkt/barbarians-of-lemuria-2",
"BOL.chat.welcome3": "Die enthaltenen Karten wurden von Guillaume Tavernier und Ludospherik zur Verfügung gestellt. Vielen Dank dafür!",
"BOL.chat.welcome4": "Im Discord findet ihr Support für die FoundryVTT-Implementierung dieses Systems: https://discord.gg/pPSDNJk",
"BOL.chat.welcome5": "Auf ein gutes Spiel in Lemuria!"
}

View File

@ -1,111 +1,111 @@
{ {
"ACTOR.TypeCharacter": "Personnage", "ACTOR.TypeCharacter": "Character",
"ACTOR.TypeEncounter": "Rencontre", "ACTOR.TypeEncounter": "Encounter",
"ITEM.TypeItem": "Objet", "ITEM.TypeItem": "Item",
"ITEM.TypeFeature": "Trait", "ITEM.TypeFeature": "Feature",
"ITEM.TypeWeapon": "Arme", "ITEM.TypeWeapon": "Weapon",
"ITEM.TypeArmor": "Armure", "ITEM.TypeArmor": "Armor",
"BOL.attributes.vigor": "Vigueur", "BOL.attributes.vigor": "Vigor",
"BOL.attributes.halfvigor" : "Demi-vigueur", "BOL.attributes.halfvigor" : "Half-Vigor",
"BOL.attributes.agility": "Agilité", "BOL.attributes.agility": "Agility",
"BOL.attributes.mind": "Esprit", "BOL.attributes.mind": "Mind",
"BOL.attributes.appeal": "Aura", "BOL.attributes.appeal": "Appeal",
"BOL.aptitudes.init": "Initiative", "BOL.aptitudes.init": "Initiative",
"BOL.aptitudes.melee": "Mêlée", "BOL.aptitudes.melee": "Melee",
"BOL.aptitudes.ranged": "Tir", "BOL.aptitudes.ranged": "Ranged",
"BOL.aptitudes.def": "Défense", "BOL.aptitudes.def": "Defense",
"BOL.aptitudes.prot": "Protection", "BOL.aptitudes.prot": "Protection",
"BOL.resources.hp": "Vitalité", "BOL.resources.hp": "Vitality",
"BOL.resources.hero": "Héroïsme", "BOL.resources.hero": "Hero",
"BOL.resources.faith": "Foi", "BOL.resources.faith": "Faith",
"BOL.resources.creation": "Création", "BOL.resources.creation": "Creation",
"BOL.resources.power": "Pouvoir", "BOL.resources.power": "Power",
"BOL.resources.villainy": "Vilénie", "BOL.resources.villainy": "Villany",
"BOL.resources.alchemypoints": "Alchemy Points", "BOL.resources.alchemypoints": "Alchemy Points",
"BOL.traits.xp": "Expérience", "BOL.traits.xp": "Experience",
"BOL.ui.tab.stats": "Attributs", "BOL.ui.tab.stats": "Attributes",
"BOL.ui.tab.combat": "Combat", "BOL.ui.tab.combat": "Combat",
"BOL.ui.tab.actions": "Actions", "BOL.ui.tab.actions": "Actions",
"BOL.ui.tab.features": "Traits", "BOL.ui.tab.features": "Traits",
"BOL.ui.tab.equipment": "Equipement", "BOL.ui.tab.equipment": "Equipment",
"BOL.ui.tab.description": "Description", "BOL.ui.tab.description": "Description",
"BOL.ui.tab.details": "Details", "BOL.ui.tab.details": "Details",
"BOL.ui.tab.spellalchemy": "Spells&Alchemy", "BOL.ui.tab.spellalchemy": "Spells & Alchemy",
"BOL.ui.properties": "Propriétés", "BOL.ui.properties": "Properties",
"BOL.ui.description": "Description", "BOL.ui.description": "Description",
"BOL.ui.actions": "Actions", "BOL.ui.actions": "Actions",
"BOL.ui.capacities": "Capacités", "BOL.ui.capacities": "Capacity",
"BOL.ui.damages": "Dommages", "BOL.ui.damages": "Damage",
"BOL.ui.details": "Détails", "BOL.ui.details": "Details",
"BOL.ui.category": "Catégorie", "BOL.ui.category": "Category",
"BOL.ui.subcategory": "Sous-catégorie", "BOL.ui.subcategory": "Sub-Category",
"BOL.ui.type": "Type", "BOL.ui.type": "Type",
"BOL.ui.subtype": "Sous-type", "BOL.ui.subtype": "Subtype",
"BOL.ui.attribute" : "Attribut", "BOL.ui.attribute" : "Attribute",
"BOL.ui.aptitude" : "Aptitude", "BOL.ui.aptitude" : "Aptitude",
"BOL.ui.advantages" : "Avantages/Désavantages", "BOL.ui.advantages" : "Boons/Flaws",
"BOL.ui.modifiers": "Modificateurs", "BOL.ui.modifiers": "Modifiers",
"BOL.ui.item": "Objet", "BOL.ui.item": "Item",
"BOL.ui.edit": "Editer", "BOL.ui.edit": "Edit",
"BOL.ui.unequip": "Déséquiper", "BOL.ui.unequip": "Unequip",
"BOL.ui.equip": "Équiper", "BOL.ui.equip": "Equip",
"BOL.ui.delete": "Supprimer", "BOL.ui.delete": "Delete",
"BOL.ui.roll" : "Utiliser", "BOL.ui.roll" : "Roll",
"BOL.ui.equipment" : "Équipement", "BOL.ui.equipment" : "Equipment",
"BOL.ui.equipmentProperties" : "Propiétés d'équipement", "BOL.ui.equipmentProperties" : "Equipment properties",
"BOL.ui.weaponAttack" : "Weapon attack", "BOL.ui.weaponAttack" : "Weapon attack",
"BOL.ui.weaponProperties" : "Propiétés offensives", "BOL.ui.weaponProperties" : "Weapon properties",
"BOL.ui.protectionProperties" : "Protection", "BOL.ui.protectionProperties" : "Protection properties",
"BOL.ui.magicalProperties" : "Propriétés magiques", "BOL.ui.magicalProperties" : "Magical properties",
"BOL.ui.alchemyProperties": "Alchemy properties", "BOL.ui.alchemyProperties": "Alchemy properties",
"BOL.ui.armor" : "Armure", "BOL.ui.armor" : "Armor",
"BOL.ui.reach" : "Allonge", "BOL.ui.reach" : "Reach",
"BOL.ui.weapon" : "Arme", "BOL.ui.weapon" : "Weapon",
"BOL.ui.melee" : "Arme de contact", "BOL.ui.melee" : "Melee",
"BOL.ui.ranged" : "Arme à distance", "BOL.ui.ranged" : "Ranged",
"BOL.ui.protection" : "Protection", "BOL.ui.protection" : "Protection",
"BOL.ui.shield" : "Bouclier", "BOL.ui.shield" : "Shield",
"BOL.ui.blocking" : "Blocage", "BOL.ui.blocking" : "Blocking",
"BOL.ui.range" : "Portée", "BOL.ui.range" : "Range",
"BOL.ui.quantity" : "Quantité", "BOL.ui.quantity" : "Quantity",
"BOL.ui.qty" : "Qté", "BOL.ui.qty" : "Qty",
"BOL.ui.slot" : "Empl.", "BOL.ui.slot" : "Slot",
"BOL.ui.weight" : "Poids", "BOL.ui.weight" : "Weight",
"BOL.ui.price": "Prix", "BOL.ui.price": "Price",
"BOL.ui.cancel": "Annuler", "BOL.ui.cancel": "Cancel",
"BOL.ui.submit": "OK", "BOL.ui.submit": "OK",
"BOL.ui.attributeCheck" : "Test d'attribut", "BOL.ui.attributeCheck" : "Attribute Check",
"BOL.ui.aptitudeCheck" : "Test d'aptitude", "BOL.ui.aptitudeCheck" : "Aptitude Check",
"BOL.ui.weaponCheck" : "Jet d'attaque", "BOL.ui.weaponCheck" : "Weapon Check",
"BOL.ui.spellCheck" : "Jet de sort", "BOL.ui.spellCheck" : "Spell Check",
"BOL.ui.careers" : "Carrières", "BOL.ui.careers" : "Careers",
"BOL.ui.boons" : "Avantages", "BOL.ui.boons" : "Boons",
"BOL.ui.flaws" : "Désavantages", "BOL.ui.flaws" : "Flaws",
"BOL.ui.rank" : "Rang", "BOL.ui.rank" : "Rank",
"BOL.ui.success" : "Succès", "BOL.ui.success" : "Success",
"BOL.ui.failure" : "Échec", "BOL.ui.failure" : "Failure",
"BOL.ui.fumble" : "Échec critique", "BOL.ui.fumble" : "Fumble",
"BOL.ui.critical" : "Succès critique", "BOL.ui.critical" : "Critical Success",
"BOL.ui.maneuvers" : "Actions de combat", "BOL.ui.maneuvers" : "Maneuvers",
"BOL.ui.stacksize" : "Taille de pile (max)", "BOL.ui.stacksize" : "Stack Size (max)",
"BOL.ui.weapons" : "Armes", "BOL.ui.weapons" : "Weapons",
"BOL.ui.protections" : "Protections", "BOL.ui.protections" : "Protection",
"BOL.ui.ammos" : "Munitions", "BOL.ui.ammos" : "Ammo",
"BOL.ui.containers" : "Conteneurs", "BOL.ui.containers" : "Container",
"BOL.ui.treasure" : "Trésor", "BOL.ui.treasure" : "Treasure",
"BOL.ui.vehicles" : "Véhicules/Montures", "BOL.ui.vehicles" : "Vehicles/Mounts",
"BOL.ui.misc" : "Divers", "BOL.ui.misc" : "Misc",
"BOL.ui.vehicleProperties" : " Propriétés de véhicule", "BOL.ui.vehicleProperties" : "Vehicle properties",
"BOL.ui.speed" : "Vitesse", "BOL.ui.speed" : "Speed",
"BOL.ui.noWeaponName" : "Arme Inconnue", "BOL.ui.noWeaponName" : "Weapon Name",
"BOL.ui.targetDefence": "Défense", "BOL.ui.targetDefence": "Defense",
"BOL.ui.applyShieldMalus": "Appliquer le Malus de Petit Bouclier", "BOL.ui.applyShieldMalus": "Apply Shield Modifier",
"BOL.ui.shieldMalus": "Malus de Bouclier", "BOL.ui.shieldMalus": "Shield Modifier",
"BOL.ui.defenseScore": "Score de Defense", "BOL.ui.defenseScore": "Defense Score",
"BOL.ui.defender": "Défenseur", "BOL.ui.defender": "Defender",
"BOL.ui.difficulty": "Difficulty", "BOL.ui.difficulty": "Difficulty",
"BOL.ui.spellProperties": "Spell Properties", "BOL.ui.spellProperties": "Spell Properties",
"BOL.ui.duration": "Duration", "BOL.ui.duration": "Duration",
@ -121,7 +121,7 @@
"BOL.ui.sorcererRank" : "Sorcerer Rank", "BOL.ui.sorcererRank" : "Sorcerer Rank",
"BOL.ui.alchemistRank": "Alchemist Rank", "BOL.ui.alchemistRank": "Alchemist Rank",
"BOL.ui.mandatoryconditions": "Mandatory conditions", "BOL.ui.mandatoryconditions": "Mandatory conditions",
"BOL.ui.optionnalconditions": "Optionnal conditions", "BOL.ui.optionnalconditions": "Optional conditions",
"BOL.ui.ppcost": "Power Points cost", "BOL.ui.ppcost": "Power Points cost",
"BOL.ui.ppAvailable": "Available Power Points", "BOL.ui.ppAvailable": "Available Power Points",
"BOL.ui.pccost": "Creation Points cost", "BOL.ui.pccost": "Creation Points cost",
@ -134,38 +134,38 @@
"BOL.ui.alchemyCurrent": "Current Alchemy Points in Object", "BOL.ui.alchemyCurrent": "Current Alchemy Points in Object",
"BOL.ui.advance": "Status", "BOL.ui.advance": "Status",
"BOL.ui.isadvantage": "Provides a bonus dice?", "BOL.ui.isadvantage": "Provides a bonus dice?",
"BOL.ui.bonusmalus": "Additionnal bonus/malus", "BOL.ui.bonusmalus": "Additional bonus/penalty",
"BOL.ui.nbdices": "Number of Dices", "BOL.ui.nbdices": "Number of Dice",
"BOL.ui.totalmod": "Total Mod.", "BOL.ui.totalmod": "Total Mod.",
"BOL.ui.rangeModifiers": "Range modifier", "BOL.ui.rangeModifiers": "Range modifier",
"BOL.ui.money": "Bougette", "BOL.ui.money": "Money",
"BOL.ui.moneyTitle": "Gold & Treasure", "BOL.ui.moneyTitle": "Gold & Treasure",
"BOL.ui.fightOption": "Fight Options", "BOL.ui.fightOption": "Fight Options",
"BOL.ui.none": "None", "BOL.ui.none": "None",
"BOL.ui.fightOptionType": "Fight Options types", "BOL.ui.fightOptionType": "Fight Option types",
"BOL.ui.activated": "Activated", "BOL.ui.activated": "Activated",
"BOL.ui.deactivated": "Deactivated", "BOL.ui.deactivated": "Deactivated",
"BOL.ui.status": "Status", "BOL.ui.status": "Status",
"BOL.ui.toactivated": "Active (>Désactiver)", "BOL.ui.toactivated": "Active (>Deactivated)",
"BOL.ui.todeactivated": "Inactive (>Activer)", "BOL.ui.todeactivated": "Inactive (>Active)",
"BOL.ui.armorAgiMalus": "Armor+Shield Malus (Agi)", "BOL.ui.armorAgiMalus": "Armor+Shield Modifier (Agi)",
"BOL.ui.armorInitMalus": "Armor Malus (Init)", "BOL.ui.armorInitMalus": "Armor Modifier (Init)",
"BOL.ui.attackValue": "Attack value", "BOL.ui.attackValue": "Attack Value",
"BOL.featureCategory.origins": "Origines", "BOL.featureCategory.origins": "Origins",
"BOL.featureCategory.races": "Races", "BOL.featureCategory.races": "Races",
"BOL.featureCategory.careers": "Carrières", "BOL.featureCategory.careers": "Careers",
"BOL.featureCategory.boons": "Avantages", "BOL.featureCategory.boons": "Boons",
"BOL.featureCategory.flaws": "Désavantages", "BOL.featureCategory.flaws": "Flaws",
"BOL.featureCategory.languages": "Langages", "BOL.featureCategory.languages": "Languages",
"BOL.featureCategory.fightoptions": "Fight Options", "BOL.featureCategory.fightoptions": "Fight Options",
"BOL.featureSubtypes.origin": "Origine", "BOL.featureSubtypes.origin": "Origin",
"BOL.featureSubtypes.race": "Race", "BOL.featureSubtypes.race": "Race",
"BOL.featureSubtypes.career": "Carrière", "BOL.featureSubtypes.career": "Career",
"BOL.featureSubtypes.boon": "Avantage", "BOL.featureSubtypes.boon": "Boon",
"BOL.featureSubtypes.flaw": "Désavantage", "BOL.featureSubtypes.flaw": "Flaw",
"BOL.featureSubtypes.language": "Langage", "BOL.featureSubtypes.language": "Language",
"BOL.featureSubtypes.gods": "Faith & Gods", "BOL.featureSubtypes.gods": "Faith & Gods",
"BOL.featureSubtypes.fightOption": "Combat Option", "BOL.featureSubtypes.fightOption": "Combat Option",
@ -175,46 +175,46 @@
"BOL.bougette.luxury" : "Luxury life", "BOL.bougette.luxury" : "Luxury life",
"BOL.bougette.rich": "Rich!", "BOL.bougette.rich": "Rich!",
"BOL.fightOptionTypes.armor": "Attaque au défaut d'armure", "BOL.fightOptionTypes.armor": "Armor Attack Option",
"BOL.fightOptionTypes.intrepid": "Attaque intrépide", "BOL.fightOptionTypes.intrepid": "Fearless Attack",
"BOL.fightOptionTypes.twoweaponsdef": "Combat à 2 armes (Défense)", "BOL.fightOptionTypes.twoweaponsdef": "Two Weapon (Defense)",
"BOL.fightOptionTypes.twoweaponsatt": "Combat à 2 armes (Attaque)", "BOL.fightOptionTypes.twoweaponsatt": "Two Weapon (Attack)",
"BOL.fightOptionTypes.fulldefense": "Défense totale", "BOL.fightOptionTypes.fulldefense": "Full Defense",
"BOL.fightOptionTypes.defense": "Posture défensive", "BOL.fightOptionTypes.defense": "Defensive Posture",
"BOL.fightOptionTypes.attack": "Posture offensive", "BOL.fightOptionTypes.attack": "Offensive Posture",
"BOL.itemCategory.object": "Objet", "BOL.itemCategory.object": "Object",
"BOL.itemCategory.equipment": "Équipement", "BOL.itemCategory.equipment": "Equipment",
"BOL.itemCategory.consumable": "Consommable", "BOL.itemCategory.consumable": "Consumable",
"BOL.itemCategory.spell": "Sort", "BOL.itemCategory.spell": "Spell",
"BOL.itemCategory.vehicle": "Monture/Véhicule", "BOL.itemCategory.vehicle": "Mount/Vehicle",
"BOL.itemCategory.other": "Autre", "BOL.itemCategory.other": "Other",
"BOL.itemCategory.capacity" : "Capacité", "BOL.itemCategory.capacity" : "Capacity",
"BOL.itemCategory.alchemy": "Alchemy", "BOL.itemCategory.alchemy": "Alchemy",
"BOL.combatCategory.protections": "Protections", "BOL.combatCategory.protections": "Protections",
"BOL.combatCategory.shields": "Boucliers", "BOL.combatCategory.shields": "Shields",
"BOL.combatCategory.melee": "Armes de contact", "BOL.combatCategory.melee": "Melee",
"BOL.combatCategory.ranged": "Armes à distance", "BOL.combatCategory.ranged": "Ranged",
"BOL.combatCategory.fightOptions": "Fight options", "BOL.combatCategory.fightOptions": "Fight options",
"BOL.combatCategory.natural": "Natural Weapons", "BOL.combatCategory.natural": "Natural Weapons",
"BOL.equipmentCategory.weapon": "Arme", "BOL.equipmentCategory.weapon": "Weapon",
"BOL.equipmentCategory.armor": "Armure", "BOL.equipmentCategory.armor": "Armor",
"BOL.equipmentCategory.protection": "Protection", "BOL.equipmentCategory.protection": "Protection",
"BOL.equipmentCategory.shield": "Bouclier", "BOL.equipmentCategory.shield": "Shield",
"BOL.equipmentCategory.helm": "Casque", "BOL.equipmentCategory.helm": "Helm",
"BOL.equipmentCategory.jewel": "Bijou", "BOL.equipmentCategory.jewel": "Jewel",
"BOL.equipmentCategory.scroll": "Parchemin", "BOL.equipmentCategory.scroll": "Scroll",
"BOL.equipmentCategory.ammunition": "Munition", "BOL.equipmentCategory.ammunition": "Ammunition",
"BOL.equipmentCategory.container": "Conteneur", "BOL.equipmentCategory.container": "Container",
"BOL.equipmentCategory.currency": "Monnaie", "BOL.equipmentCategory.currency": "Money",
"BOL.equipmentCategory.other": "Autre", "BOL.equipmentCategory.other": "Other",
"BOL.protectionCategory.armor": "Armure", "BOL.protectionCategory.armor": "Armor",
"BOL.protectionCategory.shield": "Bouclier", "BOL.protectionCategory.shield": "Shield",
"BOL.protectionCategory.helm": "Casque", "BOL.protectionCategory.helm": "Helm",
"BOL.protectionCategory.other": "Autre", "BOL.protectionCategory.other": "Other",
"BOL.spellItem.charm": "Charm", "BOL.spellItem.charm": "Charm",
"BOL.spellItem.circle1": "First Circle", "BOL.spellItem.circle1": "First Circle",
@ -226,140 +226,140 @@
"BOL.alchemyItem.legend": "Legendary", "BOL.alchemyItem.legend": "Legendary",
"BOL.alchemyItem.mythic": "Mythic", "BOL.alchemyItem.mythic": "Mythic",
"BOL.weaponCategory.melee": "Arme de mêlée", "BOL.weaponCategory.melee": "Melee",
"BOL.weaponCategory.ranged": "Arme de tir", "BOL.weaponCategory.ranged": "Ranged",
"BOL.weaponCategory.other": "Autre", "BOL.weaponCategory.other": "Other",
"BOL.itemProperty.damageMultiplier": "Damages Multiplier", "BOL.itemProperty.damageMultiplier": "Damage Multiplier",
"BOL.itemProperty.attackBonusDice": "Attack Bonus Dice", "BOL.itemProperty.attackBonusDice": "Attack Bonus Dice",
"BOL.itemProperty.equipable": "Équipable", "BOL.itemProperty.equipable": "Equipable",
"BOL.itemProperty.protection": "Protection", "BOL.itemProperty.protection": "Protection",
"BOL.itemProperty.blocking": "Blocage", "BOL.itemProperty.blocking": "Blocking",
"BOL.itemProperty.magical": "Magique", "BOL.itemProperty.magical": "Magical",
"BOL.itemProperty.concealable": "Dissimulable", "BOL.itemProperty.concealable": "Concealable",
"BOL.itemProperty.2H": "Arme à 2 mains", "BOL.itemProperty.2H": "2H Weapon",
"BOL.itemProperty.helm": "Casque", "BOL.itemProperty.helm": "Helm",
"BOL.itemProperty.improvised": "Improvisée", "BOL.itemProperty.improvised": "Improvised",
"BOL.itemProperty.shield": "Bouclier", "BOL.itemProperty.shield": "Shield",
"BOL.itemProperty.melee": "Arme de contact", "BOL.itemProperty.melee": "Melee",
"BOL.itemProperty.throwable": "Peut être lancée", "BOL.itemProperty.throwable": "Throwable",
"BOL.itemProperty.ignoreshield": "Ignore les boucliers", "BOL.itemProperty.ignoreshield": "Ignore Shield",
"BOL.itemProperty.bashing": "Dégâts non létaux", "BOL.itemProperty.bashing": "Bashing",
"BOL.itemProperty.stackable": "Empilable", "BOL.itemProperty.stackable": "Stackable",
"BOL.itemProperty.ranged": "A distance", "BOL.itemProperty.ranged": "Ranged",
"BOL.itemProperty.weapon": "Offensive", "BOL.itemProperty.weapon": "Weapon",
"BOL.itemProperty.reloadable": "Rechargeable", "BOL.itemProperty.reloadable": "Reloadable",
"BOL.itemProperty.worn": "Équipé", "BOL.itemProperty.worn": "Equipped",
"BOL.itemProperty.spell" : "Sort", "BOL.itemProperty.spell" : "Spell",
"BOL.itemProperty.armor" : "Armure", "BOL.itemProperty.armor" : "Armor",
"BOL.itemProperty.consumable" : "Consommable", "BOL.itemProperty.consumable" : "Consumable",
"BOL.itemProperty.bow" : "Arc", "BOL.itemProperty.bow" : "Bow",
"BOL.itemProperty.crossbow" : "Arbalète", "BOL.itemProperty.crossbow" : "Crossbow",
"BOL.itemProperty.throwing" : "Arme de jet", "BOL.itemProperty.throwing" : "Throwing",
"BOL.itemProperty.activable" : "Activable", "BOL.itemProperty.activable" : "Activable",
"BOL.itemProperty.powder" : "Arme à poudre", "BOL.itemProperty.powder" : "Powder",
"BOL.itemProperty.attackAttribute" : "Attaque (Attribut)", "BOL.itemProperty.attackAttribute" : "Attack (Attribute)",
"BOL.itemProperty.attackAptitude" : "Attaque (Aptitude)", "BOL.itemProperty.attackAptitude" : "Attack (Aptitude)",
"BOL.itemProperty.attackModifiers" : "Attaque (Modificateurs)", "BOL.itemProperty.attackModifiers" : "Attack (Modifiers)",
"BOL.itemProperty.attackReroll1" : "Attaque (Relancer les 1)", "BOL.itemProperty.attackReroll1" : "Attack (Reroll 1's)",
"BOL.itemProperty.damage" : "Dommages (Dés)", "BOL.itemProperty.damage" : "Damage (Dmg)",
"BOL.itemProperty.damageModifiers" : "Dommages (Modificateurs)", "BOL.itemProperty.damageModifiers" : "Damage (Modifiers)",
"BOL.itemProperty.damageAttribute" : "Dommages (Attribut)", "BOL.itemProperty.damageAttribute" : "Damage (Attribute)",
"BOL.itemProperty.damageSpecial" : "Dommages (Spécial)", "BOL.itemProperty.damageSpecial" : "Damage (Special)",
"BOL.itemProperty.damageReroll1" : "Relancer les 1", "BOL.itemProperty.damageReroll1" : "Reroll 1's",
"BOL.itemProperty.range" : "Portée (en m)", "BOL.itemProperty.range" : "Range (in m)",
"BOL.itemProperty.soakFormula": "Encaissement (Formule)", "BOL.itemProperty.soakFormula": "Soak (Formula)",
"BOL.itemProperty.soakModifiers": "Encaissement (Modificateur)", "BOL.itemProperty.soakModifiers": "Soak (Modifiers)",
"BOL.itemProperty.soakValue": "Encaissement (Valeur par défaut)", "BOL.itemProperty.soakValue": "Soak (Default Value)",
"BOL.itemProperty.armorQuality": "Qualité d'armure", "BOL.itemProperty.armorQuality": "Armor Quality",
"BOL.itemProperty.blockingMalus" : "Malus de blocage", "BOL.itemProperty.blockingMalus" : "Blocking Modifier",
"BOL.itemProperty.blockingAttacksBlocked" : "Attaques bloquée", "BOL.itemProperty.blockingAttacksBlocked" : "Attacks blocked",
"BOL.itemProperty.blocking1Attack" : "Bloque 1 attaque", "BOL.itemProperty.blocking1Attack" : "Block 1 attack",
"BOL.itemProperty.blockingAllAttacks" : "Bloque toutes les attaques", "BOL.itemProperty.blockingAllAttacks" : "Block all attacks",
"BOL.itemProperty.slot" : "Emplacement utilisé", "BOL.itemProperty.slot" : "Slot",
"BOL.itemProperty.reload": "Rechargement (Actions)", "BOL.itemProperty.reload": "Reload (Actions)",
"BOL.itemProperty.weaponSize" : "Classe d'arme", "BOL.itemProperty.weaponSize" : "Weapon Size",
"BOL.itemProperty.difficulty": "Difficulty", "BOL.itemProperty.difficulty": "Difficulty",
"BOL.itemProperty.natural": "Natural weapon", "BOL.itemProperty.natural": "Natural weapon",
"BOL.itemProperty.onlymodifier": "Modifier only (ie creatures attacks)", "BOL.itemProperty.onlymodifier": "Modifier only (ie creatures attacks)",
"BOL.itemStat.quantity": "Quantité", "BOL.itemStat.quantity": "Quantity",
"BOL.itemStat.weight": "Poids", "BOL.itemStat.weight": "Weight",
"BOL.itemStat.price": "Prix", "BOL.itemStat.price": "Price",
"BOL.itemStat.range": "Portée", "BOL.itemStat.range": "Range",
"BOL.itemStat.damage": "Dommages", "BOL.itemStat.damage": "Damage",
"BOL.itemStat.reload": "Rechargement (Actions)", "BOL.itemStat.reload": "Reload (Actions)",
"BOL.itemStat.soak": "Valeur de protection", "BOL.itemStat.soak": "Soak",
"BOL.itemStat.blocking": "Bloquage", "BOL.itemStat.blocking": "Blocking",
"BOL.itemStat.modifiers": "Modificateurs", "BOL.itemStat.modifiers": "Modifiers",
"BOL.weaponSize.unarmed" : "Mains nues", "BOL.weaponSize.unarmed" : "Unarmed",
"BOL.weaponSize.improvised" : "Arme improvisée", "BOL.weaponSize.improvised" : "Improvised",
"BOL.weaponSize.light" : "Légère", "BOL.weaponSize.light" : "Light",
"BOL.weaponSize.medium" : "Moyenne", "BOL.weaponSize.medium" : "Medium",
"BOL.weaponSize.heavy" : "Lourde", "BOL.weaponSize.heavy" : "heavy",
"BOL.itemModifiers.init": "Malus (Initiative)", "BOL.itemModifiers.init": "Modifier (Initiative)",
"BOL.itemModifiers.social": "Malus (Social)", "BOL.itemModifiers.social": "Modifier (Social)",
"BOL.itemModifiers.agility": "Malus (Agilité)", "BOL.itemModifiers.agility": "Modifier (Agility)",
"BOL.itemModifiers.powercost": "Malus (Coût supplémentaire en PP)", "BOL.itemModifiers.powercost": "Modifier (Additional Cost in PP)",
"BOL.itemBlocking.malus": "Social", "BOL.itemBlocking.malus": "Modifier",
"BOL.itemBlocking.nbAttacksPerRound": "Agilité", "BOL.itemBlocking.nbAttacksPerRound": "Agility",
"BOL.soakFormula.none" : "-", "BOL.soakFormula.none" : "-",
"BOL.soakFormula.light" : "Légère (Annule d6-3 dégâts subis)", "BOL.soakFormula.light" : "Light (Cancels d6-3 damage)",
"BOL.soakFormula.medium" : "Moyenne (Annule d6-2 dégâts subis)", "BOL.soakFormula.medium" : "Medium (Cancels d6-2 damage)",
"BOL.soakFormula.heavy" : "Lourde (Annule d6-1 dégâts subis)", "BOL.soakFormula.heavy" : "Heavy (Cancels d6-1 damage)",
"BOL.armorQuality.none" : "-", "BOL.armorQuality.none" : "-",
"BOL.armorQuality.light" : "Légère", "BOL.armorQuality.light" : "Light",
"BOL.armorQuality.lightQ" : "Légère de qualité", "BOL.armorQuality.lightQ" : "Light Quality",
"BOL.armorQuality.lightSup" : "Légère Supérieure", "BOL.armorQuality.lightSup" : "Light Superior",
"BOL.armorQuality.lightLeg" : "Légère Légendaire", "BOL.armorQuality.lightLeg" : "Light Legendary",
"BOL.armorQuality.medium" : "Moyenne", "BOL.armorQuality.medium" : "Medium",
"BOL.armorQuality.mediumQ" : "Moyenne de qualité", "BOL.armorQuality.mediumQ" : "Medium Quality",
"BOL.armorQuality.mediumSup" : "Moyenne Supérieure", "BOL.armorQuality.mediumSup" : "Medium Superior",
"BOL.armorQuality.mediumLeg" : "Moyenne Légendaire", "BOL.armorQuality.mediumLeg" : "Medium Legendary",
"BOL.armorQuality.heavy" : "Lourde", "BOL.armorQuality.heavy" : "Heavy",
"BOL.armorQuality.heavyQ" : "Lourde de qualité", "BOL.armorQuality.heavyQ" : "Heavy Quality",
"BOL.armorQuality.heavySup" : "Lourde Supérieure", "BOL.armorQuality.heavySup" : "Heavy Superior",
"BOL.armorQuality.heavyLeg" : "Lourde Légendaire", "BOL.armorQuality.heavyLeg" : "Heavy Legendary",
"BOL.equipmentSlots.none" : "-", "BOL.equipmentSlots.none" : "-",
"BOL.equipmentSlots.head" : "Tête", "BOL.equipmentSlots.head" : "Head",
"BOL.equipmentSlots.neck" : "Cou", "BOL.equipmentSlots.neck" : "Neck",
"BOL.equipmentSlots.shoulders" : "Épaules", "BOL.equipmentSlots.shoulders" : "Shoulders",
"BOL.equipmentSlots.body" : "Corps", "BOL.equipmentSlots.body" : "Body",
"BOL.equipmentSlots.rhand" : "Main droite", "BOL.equipmentSlots.rhand" : "Right hand",
"BOL.equipmentSlots.lhand" : "Main gauche", "BOL.equipmentSlots.lhand" : "Left hand",
"BOL.equipmentSlots.2hands" : "2 mains", "BOL.equipmentSlots.2hands" : "2 hands",
"BOL.equipmentSlots.rarm" : "Bras droit", "BOL.equipmentSlots.rarm" : "Right arm",
"BOL.equipmentSlots.larm" : "Bras gauche", "BOL.equipmentSlots.larm" : "Left arm",
"BOL.equipmentSlots.chest" : "Torse", "BOL.equipmentSlots.chest" : "Chest",
"BOL.equipmentSlots.belt" : "Ceinture", "BOL.equipmentSlots.belt" : "Belt",
"BOL.equipmentSlots.legs" : "Jambes", "BOL.equipmentSlots.legs" : "Legs",
"BOL.equipmentSlots.feet" : "Pieds", "BOL.equipmentSlots.feet" : "Feet",
"BOL.equipmentSlots.finder" : "Doigt", "BOL.equipmentSlots.finder" : "Finger",
"BOL.equipmentSlots.ear" : "Oreille", "BOL.equipmentSlots.ear" : "Ear",
"BOL.vehicleCategory.mount" : "Monture terrestre", "BOL.vehicleCategory.mount" : "Ground Mount",
"BOL.vehicleCategory.flying" : "Monture volante", "BOL.vehicleCategory.flying" : "Flying Mount",
"BOL.vehicleCategory.boat" : "Bateau", "BOL.vehicleCategory.boat" : "Boat",
"BOL.vehicleCategory.other" : "Autre", "BOL.vehicleCategory.other" : "Other",
"BOL.range.PointBlank": "Bout portant", "BOL.range.PointBlank": "Point Blank",
"BOL.range.Short": "Courte", "BOL.range.Short": "Short",
"BOL.range.Medium": "Moyenne", "BOL.range.Medium": "Medium",
"BOL.range.Long": "Long", "BOL.range.Long": "Long",
"BOL.range.VeryLong": "Très longue", "BOL.range.VeryLong": "Very Long",
"BOL.range.Extreme": "Extrême", "BOL.range.Extreme": "Extreme",
"BOL.range.Maximum": "Maximale", "BOL.range.Maximum": "Maximum",
"BOL.notification.MacroMultipleTokensSelected": "Vous avez sélectionné plusieurs tokens", "BOL.notification.MacroMultipleTokensSelected": "You have selected several tokens!",
"BOL.notification.MacroNoActorAvailable": "Aucun acteur n'a pu être ciblé", "BOL.notification.MacroNoActorAvailable": "No actor could be targeted!",
"BOL.notification.MacroNoTokenSelected": "Vous devez sélectionner un token", "BOL.notification.MacroNoTokenSelected": "You must select a token!",
"BOL.size.tiny": "Tiny", "BOL.size.tiny": "Tiny",
"BOL.size.verysmall": "Very Small", "BOL.size.verysmall": "Very Small",
@ -372,6 +372,84 @@
"BOL.size.enormous": "Enormous", "BOL.size.enormous": "Enormous",
"BOL.size.gigantic": "Gigantic", "BOL.size.gigantic": "Gigantic",
"BOL.size.immense": "Immense", "BOL.size.immense": "Immense",
"BOL.size.colossal": "Colossal" "BOL.size.colossal": "Colossal",
"BOL.chat.fightactive": "{name} activates the fight option {foName} for this round !",
"BOL.chat.fightunactive": "{name} deactivates the fight option {foName} for this round !",
"BOL.chat.isdead": "{name} is dead !",
"BOL.chat.epitaph": "Keep his name and memory in honor !",
"BOL.chat.vitalityzero": "Lifeblood of {name} is now {hp} : he is going to fall unconscious !",
"BOL.chat.vitalityheroism": "You can spent 1 Hero Point to raise up for 1 round.",
"BOL.chat.vitalityheroismhint": "In this case, your lifeblood raises up to its maximum divided by 2.",
"BOL.chat.vitalitydying": "Lifeblood of {name} is now {hp} ! He is dying ...",
"BOL.chat.vitalitydyingheroism": "You can spent 1 Hero Point to Defy Death.",
"BOL.chat.alchemytitle": "Alchemy recipe : {name}",
"BOL.chat.alchemypoints": "Craft Points cost : {pcCostCurrent}",
"BOL.chat.alchemysuccess": "The alchemy recipe is a success !<br>Create the relevant item/effect in your Inventory.<br>Stage counter has been resetted.",
"BOL.chat.alchemyfailure": "The alchemy recipe has failed !<br>Stage counter has been resetted.",
"BOL.chat.rolldamage": "Roll for damages",
"BOL.chat.rolldamage6": "Roll for damages +6",
"BOL.chat.rolldamage12": "Roll for damages +12 (1 HP)",
"BOL.chat.damageresult": "Damages of {name} : {total}",
"BOL.chat.damagetarget": "Target : {target}",
"BOL.chat.applydamagetotarget": "Apply damages to the target",
"BOL.chat.fightoption": "Combat options",
"BOL.chat.reroll": "Reroll (1 HP)",
"BOL.chat.toheroic": "Convert to Mighty success (1 HP)",
"BOL.chat.tolegend": "Convert to Legendary succes (1 HP)",
"BOL.chat.hurttitle": "{name} is going to receive {damageTotal} damages !",
"BOL.chat.armordefault": "This attack is bypassing armor : armor is not used to reduce damages !",
"BOL.chat.witharmor": "Hit with armor",
"BOL.chat.withoutarmor": "Hit without armor",
"BOL.chat.shakeoff": "Shake off Wounds (1 HP)",
"BOL.chat.splinteredshield": "Splintered Shield/Sword {name} (1 HP)",
"BOL.chat.damagesummary": "Damages received by {name}",
"BOL.chat.protectvalue": "Armor protect",
"BOL.chat.noprotectvalue": "No armor !",
"BOL.chat.heroreducedamage": "One Hero Point has been spent, for reducing damges by {total}.",
"BOL.chat.herosplintered": "No damages received, thanks to splintered shield/sword with {weaponHero.name}. The weapon/shield has been destroyed ! One HP point has been spent also.",
"BOL.chat.finaldamage": "Final Damage : {finalDamage} damages !",
"BOL.chat.spell": "Spell",
"BOL.chat.spellcost": "Power Points cost",
"BOL.chat.spellremaining": "Remaining Power Points",
"BOL.dialog.soeasy": "So easy (+4)",
"BOL.dialog.veryeasy": "Very easy (+2)",
"BOL.dialog.easy": "Easy (+1)",
"BOL.dialog.moderate": "Moderate (0)",
"BOL.dialog.hard": "Hard (-1)",
"BOL.dialog.tough": "Tough (-2)",
"BOL.dialog.demanding": "Demanding (-4)",
"BOL.dialog.formidable": "Formidable (-6)",
"BOL.dialog.heroic": "Heroic (-8)",
"BOL.dialog.mythic": "Mythic (-10)",
"BOL.dialog.divine": "Divine (-12)",
"BOL.dialog.pointblank": "Point blank (+1)",
"BOL.dialog.close": "Close (0)",
"BOL.dialog.medium": "Medium (-1))",
"BOL.dialog.long": "Long (-2)",
"BOL.dialog.distant": "Distant (-4)",
"BOL.dialog.extreme": "Extreme (-6)",
"BOL.dialog.utmost": "Utmost (-8)",
"BOL.ui.name": "Name",
"BOL.ui.xp": "Experience",
"BOL.ui.xpspent": "Spent",
"BOL.ui.xptotal": "Total",
"BOL.ui.biosize": "Size",
"BOL.ui.bioweight": "Weight",
"BOL.ui.bioage": "Age",
"BOL.ui.biohair": "Hair",
"BOL.ui.bioeyes": "Eyes",
"BOL.ui.biosigns": "Signs",
"BOL.ui.biodescription": "Description",
"BOL.ui.bionotes": "Notes",
"BOL.chat.welcome1": "Welcome to Barbarians of Lemuria (Ludospherik version)",
"BOL.chat.welcome2": "Books are necessary to play, and ca be found here : http://www.ludospherik.fr/content/14-barbarians-of-lemuria",
"BOL.chat.welcome3": "The integrated maps are authorized by Guillaume Tavernier and Ludospherik. Thanks to them !.",
"BOL.chat.welcome4": "All support for this system is available on this Discord server : https://discord.gg/pPSDNJk",
"BOL.chat.welcome5": "Good game in Lemuria !"
} }

View File

@ -87,6 +87,7 @@
"BOL.ui.failure": "Échec", "BOL.ui.failure": "Échec",
"BOL.ui.fumble": "Échec critique", "BOL.ui.fumble": "Échec critique",
"BOL.ui.critical": "Succès critique", "BOL.ui.critical": "Succès critique",
"BOL.ui.criticallegend": "Succès légendaire !",
"BOL.ui.maneuvers": "Actions de combat", "BOL.ui.maneuvers": "Actions de combat",
"BOL.ui.stacksize": "Taille de pile (max)", "BOL.ui.stacksize": "Taille de pile (max)",
"BOL.ui.weapons": "Armes", "BOL.ui.weapons": "Armes",
@ -348,5 +349,87 @@
"BOL.size.enormous": "Colossale", "BOL.size.enormous": "Colossale",
"BOL.size.gigantic": "Gigantesque", "BOL.size.gigantic": "Gigantesque",
"BOL.size.immense": "Immense", "BOL.size.immense": "Immense",
"BOL.size.colossal": "Monstrueuse" "BOL.size.colossal": "Monstrueuse",
}
"BOL.chat.fightactive": "{name} active son option de combat {foName} pour ce round !",
"BOL.chat.fightunactive": "{name} désactive son option de combat {foName} pour ce round !",
"BOL.chat.isdead": "{name} est mort !",
"BOL.chat.epitaph": "Que son nom soit honoré sur les champs de batailles de Lémurie !",
"BOL.chat.vitalityzero": "La Vitalité de {name} est {hp} : il va s'écrouler au sol et sombrer dans l'inconscience !",
"BOL.chat.vitalityheroism": "Vous pouvez dépenser 1 Point d'Héroisme pour reprendre vos esprits pendant 1 round.",
"BOL.chat.vitalityheroismhint": "Dans ce cas votre vitalité remonte à son maximum divisé par 2 (arrondi au supérieur).",
"BOL.chat.vitalitydying": "La Vitalité de {name} est de {hp} ! Il est mourant ...",
"BOL.chat.vitalitydyingheroism": "Vous pouvez cependant dépenser 1 Point d'Héroisme pour Défier la Mort (cf. page 58).",
"BOL.chat.alchemytitle": "Préparation Alchimique : {name}",
"BOL.chat.alchemypoints": "Points de Création Investis : {pcCostCurrent}",
"BOL.chat.alchemysuccess": "La préparation alchimique a été réalisée avec succès !<br>Créez l'item ou l'effet correspondant dans votre Inventaire.<br>L'avancement dans la préparation a été remis à 0.",
"BOL.chat.alchemyfailure": "La préparation alchimique a échouée !<br>L'avancement dans la préparation a été remis à 0.",
"BOL.chat.rolldamage": "Lancer les dommages",
"BOL.chat.rolldamage6": "Lancer les dommages +6",
"BOL.chat.rolldamage12": "Dommages +12 (1 Pt. d'Heroisme)",
"BOL.chat.damageresult": "Dommages de {name} : {total}",
"BOL.chat.damagetarget": "Cible : {target}",
"BOL.chat.applydamagetotarget": "Appliquer les dommages à la cible",
"BOL.chat.fightoption": "Option de combat",
"BOL.chat.reroll": "Relancer (1 P. Heroisme)",
"BOL.chat.toheroic": "Transformer en succés Héroïque (1 P. Héroisme)",
"BOL.chat.tolegend": "Transformer en succes Légendaire (1 P. Heroisme)",
"BOL.chat.hurttitle": "{name} va encaisser {damageTotal} dégats !",
"BOL.chat.armordefault": "C'est une attaque au défaut de l'armure : vous devez encaisser SANS la protection de l'armure !",
"BOL.chat.witharmor": "Encaisser avec la protection de l'armure",
"BOL.chat.withoutarmor": "Encaisser sans la protection de l'armure",
"BOL.chat.shakeoff": "Juste une égratignure (1 Point d'Héroisme)",
"BOL.chat.splinteredshield": "Parade in Extremis avec {name} (1 Point d'Héroisme)",
"BOL.chat.damagesummary": "Dégats subis par {name}",
"BOL.chat.protectvalue": "Protection de l'armure",
"BOL.chat.noprotectvalue": "Aucune protection d'armure !",
"BOL.chat.heroreducedamage": "Un point d'héroisme dépensé, pour une réduction des dommages supplémentaire de {total}.",
"BOL.chat.herosplintered": "Aucun dommage encaissé, grâce à la parade in-extremis avec {weaponHero.name}. L'arme a été détruite pendant cette parade ! Un point d'héroisme a également été dépensé.",
"BOL.chat.finaldamage": "Encaissement final : {finalDamage} dégats !",
"BOL.chat.spell": "Sort",
"BOL.chat.spellcost": "Cout en Points de Pouvoir",
"BOL.chat.spellremaining": "Points de Pouvoir restants",
"BOL.chat.nodamagesummary": "Aucun dégats n'a été subi ....",
"BOL.chat.damageresume": "{name} a subi des blessures ...",
"BOL.chat.fumblemessage": "Si vous acceptez les conséquences d'un echec catastrophique (au choix du MJ), vous pourrez bénéficier d'1 point d'Héroïsme supplémentaire",
"BOL.dialog.soeasy": "Inmanquable (+4)",
"BOL.dialog.veryeasy": "Trés Facile (+2)",
"BOL.dialog.easy": "Facile (+1)",
"BOL.dialog.moderate": "Moyenne (0)",
"BOL.dialog.hard": "Ardue (-1)",
"BOL.dialog.tough": "Difficile (-2)",
"BOL.dialog.demanding": "Très Difficile (-4)",
"BOL.dialog.formidable": "Impossible (-6)",
"BOL.dialog.heroic": "Héroïque (-8)",
"BOL.dialog.mythic": "Mythique (-10)",
"BOL.dialog.divine": "Divine (-12)",
"BOL.dialog.pointblank": "Bout portant (+1)",
"BOL.dialog.close": "Courte (0)",
"BOL.dialog.medium": "Moyenne (-1))",
"BOL.dialog.long": "Longue (-2)",
"BOL.dialog.distant": "Très longue (-4)",
"BOL.dialog.extreme": "Extrême (-6)",
"BOL.dialog.utmost": "Maximale (-8)",
"BOL.ui.name": "Nom",
"BOL.ui.xp": "Experience",
"BOL.ui.xpspent": "Dépensée",
"BOL.ui.xptotal": "Totale",
"BOL.ui.biosize": "Taille",
"BOL.ui.bioweight": "Poids",
"BOL.ui.bioage": "Age",
"BOL.ui.biohair": "Cheveux",
"BOL.ui.bioeyes": "Yeux",
"BOL.ui.biosigns": "Signes distinctifs",
"BOL.ui.biodescription": "Description",
"BOL.ui.bionotes": "Notes",
"BOL.chat.welcome1": "Bienvenue dans Barbarians of Lemuria (Ludospherik version)",
"BOL.chat.welcome2": "Les livres nécessaires pour jouer sont disponibles sur le site de l'éditeur : http://www.ludospherik.fr/content/14-barbarians-of-lemuria",
"BOL.chat.welcome3": "Les cartes intégrées au système le sont grace à l'aimable autorisation de leur auteur Guillaume Tavernier et des éditions Ludospherik. Merci à eux !.",
"BOL.chat.welcome4": "Tout le support et le suivi de ce système est disponible via le Discord Foundry FR : https://discord.gg/pPSDNJk",
"BOL.chat.welcome5": "Bon jeu en Lemurie !"
}

View File

@ -12,7 +12,7 @@ export class BoLActorSheet extends ActorSheet {
return mergeObject(super.defaultOptions, { return mergeObject(super.defaultOptions, {
classes: ["bol", "sheet", "actor"], classes: ["bol", "sheet", "actor"],
template: "systems/bol/templates/actor/actor-sheet.hbs", template: "systems/bol/templates/actor/actor-sheet.hbs",
width: 600, width: 860,
height: 600, height: 600,
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }], dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }] tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }]
@ -25,6 +25,13 @@ export class BoLActorSheet extends ActorSheet {
activateListeners(html) { activateListeners(html) {
super.activateListeners(html); super.activateListeners(html);
function onLoad() {
let logoSheet = BoLUtility.getLogoActorSheet()
$(".bol-actor-form").css("backgroundImage",`url(${logoSheet})`)
}
// Setup everything onload
$(function () { onLoad(); });
// Everything below here is only needed if the sheet is editable // Everything below here is only needed if the sheet is editable
if (!this.options.editable) return; if (!this.options.editable) return;
@ -66,10 +73,9 @@ export class BoLActorSheet extends ActorSheet {
const incr = parseInt(dataset.incr) const incr = parseInt(dataset.incr)
const min = parseInt(dataset.min) const min = parseInt(dataset.min)
const max = parseInt(dataset.max) || 10000 const max = parseInt(dataset.max) || 10000
const itemData = item.data; let value = eval("item." + target)
let value = eval("itemData." + target)
value = value || 0 value = value || 0
console.log("IncDec", item, target, value, operator, min, max) //console.log("IncDec", item, target, value, operator, min, max)
if (operator === "minus") { if (operator === "minus") {
if (value >= min + incr) value -= incr; if (value >= min + incr) value -= incr;
else value = min; else value = min;
@ -108,17 +114,18 @@ export class BoLActorSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
/** @override */ /** @override */
getData(options) { async getData(options) {
const data = super.getData(options); const data = super.getData(options)
const actorData = duplicate(data.data); const actorData = duplicate(data)
let formData = duplicate(data) let formData = duplicate(data)
formData.config = game.bol.config formData.config = game.bol.config
formData.data = actorData.data formData.data = actorData
formData.details = this.actor.details formData.details = this.actor.details
formData.attributes = this.actor.attributes formData.attributes = this.actor.attributes
formData.aptitudes = this.actor.aptitudes formData.aptitudes = this.actor.aptitudes
formData.resources = this.actor.getResourcesFromType() formData.resources = this.actor.getResourcesFromType()
formData.xp = this.actor.system.xp
formData.equipment = this.actor.equipment formData.equipment = this.actor.equipment
formData.equipmentCreature = this.actor.equipmentCreature formData.equipmentCreature = this.actor.equipmentCreature
formData.weapons = this.actor.weapons formData.weapons = this.actor.weapons
@ -133,14 +140,17 @@ export class BoLActorSheet extends ActorSheet {
formData.ammos = this.actor.ammos formData.ammos = this.actor.ammos
formData.misc = this.actor.misc formData.misc = this.actor.misc
formData.combat = this.actor.buildCombat() formData.combat = this.actor.buildCombat()
formData.combatCreature = this.actor.buildCombatCreature() //formData.combatCreature = this.actor.buildCombatCreature()
formData.features = this.actor.buildFeatures() formData.features = this.actor.buildFeatures()
formData.isGM = game.user.isGM formData.isGM = game.user.isGM
formData.options = this.options formData.options = this.options
formData.owner = this.document.isOwner formData.owner = this.document.isOwner
formData.editScore = this.options.editScore formData.editScore = this.options.editScore
formData.useBougette = BoLUtility.getUseBougette() formData.useBougette = BoLUtility.getUseBougette()
formData.charType = this.actor.getCharType()
formData.villainy = this.actor.getVillainy()
formData.biography = await TextEditor.enrichHTML(this.object.system.details.biography, {async: true})
formData.notes = await TextEditor.enrichHTML(this.object.system.details.notes, {async: true})
formData.isSorcerer = this.actor.isSorcerer() formData.isSorcerer = this.actor.isSorcerer()
formData.isAlchemist = this.actor.isAlchemist() formData.isAlchemist = this.actor.isAlchemist()
formData.isPriest = this.actor.isPriest() formData.isPriest = this.actor.isPriest()

View File

@ -9,29 +9,43 @@ export class BoLActor extends Actor {
/** @override */ /** @override */
prepareData() { prepareData() {
const actorData = this.data;
if (actorData.type === 'character') { if (this.type === 'character') {
actorData.type = 'player'; this.chartype = 'player'
actorData.villainy = false; this.villainy = false
} }
if (actorData.type === 'encounter') { if (this.type === 'encounter') {
actorData.type = 'tough'; this.chartype = 'tough'
actorData.villainy = true; this.villainy = true
} }
super.prepareData(); super.prepareData()
}
/* -------------------------------------------- */
getCharType() {
if (this.type === 'character') {
return 'player'
}
return this.system.chartype
}
/* -------------------------------------------- */
getVillainy() {
if (this.type === 'character') {
return false
}
return true
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
updateResourcesData() { updateResourcesData() {
if (this.type == 'character') { if (this.type == 'character') {
let newVitality = 10 + this.data.data.attributes.vigor.value + this.data.data.resources.hp.bonus let newVitality = 10 + this.system.attributes.vigor.value + this.system.resources.hp.bonus
if (this.data.data.resources.hp.max != newVitality) { if (this.system.resources.hp.max != newVitality) {
this.update({ 'data.resources.hp.max': newVitality }); this.update({ 'system.resources.hp.max': newVitality })
} }
let newPower = 10 + this.data.data.attributes.mind.value + this.data.data.resources.power.bonus let newPower = 10 + this.system.attributes.mind.value + this.system.resources.power.bonus
if (this.data.data.resources.power.max != newPower) { if (this.system.resources.power.max != newPower) {
this.update({ 'data.resources.power.max': newPower }); this.update({ 'system.resources.power.max': newPower })
} }
} }
} }
@ -44,25 +58,22 @@ export class BoLActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
get itemData() {
return Array.from(this.data.items.values()).map(i => i.data)
}
get details() { get details() {
return this.data.data.details return this.system.details
} }
get attributes() { get attributes() {
return Object.values(this.data.data.attributes) return Object.values(this.system.attributes)
} }
get aptitudes() { get aptitudes() {
return Object.values(this.data.data.aptitudes) return Object.values(this.system.aptitudes)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
clearRoundModifiers() { // Process data/items that are finished at end of a round clearRoundModifiers() { // Process data/items that are finished at end of a round
let foList = this.fightoptions let foList = this.fightoptions
for (let fo of foList) { for (let fo of foList) {
if (fo.data.properties.used) { if (fo.system.properties.used) {
this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'data.properties.used': false }]) this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'system.properties.used': false }])
} }
} }
} }
@ -71,28 +82,28 @@ export class BoLActor extends Actor {
get defenseValue() { get defenseValue() {
let defMod = 0 let defMod = 0
let fo = this.getActiveFightOption() let fo = this.getActiveFightOption()
if (fo && fo.data.properties.fightoptiontype == "intrepid") { if (fo && fo.system.properties.fightoptiontype == "intrepid") {
defMod += -2 defMod += -2
} }
if (fo && fo.data.properties.fightoptiontype == "fulldefense") { if (fo && fo.system.properties.fightoptiontype == "fulldefense") {
defMod += 2 defMod += 2
} }
if (fo && fo.data.properties.fightoptiontype == "twoweaponsdef" && !fo.data.properties.used) { if (fo && fo.system.properties.fightoptiontype == "twoweaponsdef" && !fo.system.properties.used) {
defMod += 1 defMod += 1
this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'data.properties.used': true }]) this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'system.properties.used': true }])
} }
if (fo && fo.data.properties.fightoptiontype == "defense") { if (fo && fo.system.properties.fightoptiontype == "defense") {
defMod += 1 defMod += 1
} }
if (fo && fo.data.properties.fightoptiontype == "attack") { if (fo && fo.system.properties.fightoptiontype == "attack") {
defMod += -1 defMod += -1
} }
return this.data.data.aptitudes.def.value + defMod return this.system.aptitudes.def.value + defMod
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getActiveFightOption() { getActiveFightOption() {
let it = this.itemData.find(i => i.type === "feature" && i.data.subtype === "fightoption" && i.data.properties.activated) let it = this.items.find(i => i.type === "feature" && i.system.subtype === "fightoption" && i.system.properties.activated)
if (it) { if (it) {
return duplicate(it) return duplicate(it)
} }
@ -101,14 +112,14 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
incAttributeXP(key) { incAttributeXP(key) {
let attr = duplicate(this.data.data.attributes[key]) let attr = duplicate(this.system.attributes[key])
if (attr) { if (attr) {
let nextXP = (attr.value == -1) ? 2 : attr.value + (attr.value + 1) let nextXP = (attr.value == -1) ? 2 : attr.value + (attr.value + 1)
let xp = duplicate(this.data.data.xp) let xp = duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) { if (xp.total - xp.spent >= nextXP) {
attr.value += 1 attr.value += 1
xp.spent += nextXP xp.spent += nextXP
this.update({ [`data.attributes.${key}`]: attr, [`data.xp`]: xp }) this.update({ [`system.attributes.${key}`]: attr, [`system.xp`]: xp })
} else { } else {
ui.notifications.warn("Pas assez de points d'expérience !") ui.notifications.warn("Pas assez de points d'expérience !")
} }
@ -117,14 +128,14 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
incAptitudeXP(key) { incAptitudeXP(key) {
let apt = duplicate(this.data.data.aptitudes[key]) let apt = duplicate(this.system.aptitudes[key])
if (apt) { if (apt) {
let nextXP = (apt.value == -1) ? 1 : apt.value + 2 let nextXP = (apt.value == -1) ? 1 : apt.value + 2
let xp = duplicate(this.data.data.xp) let xp = duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) { if (xp.total - xp.spent >= nextXP) {
apt.value += 1 apt.value += 1
xp.spent += nextXP xp.spent += nextXP
this.update({ [`data.aptitudes.${key}`]: apt, [`data.xp`]: xp }) this.update({ [`system.aptitudes.${key}`]: apt, [`system.xp`]: xp })
} else { } else {
ui.notifications.warn("Pas assez de points d'expérience !") ui.notifications.warn("Pas assez de points d'expérience !")
} }
@ -132,15 +143,15 @@ export class BoLActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
incCareerXP(itemId) { incCareerXP(itemId) {
let career = this.data.items.get(itemId) let career = this.items.get(itemId)
if (career) { if (career) {
career = duplicate(career) career = duplicate(career)
let nextXP = career.data.rank + 1 let nextXP = career.system.rank + 1
let xp = duplicate(this.data.data.xp) let xp = duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) { if (xp.total - xp.spent >= nextXP) {
xp.spent += nextXP xp.spent += nextXP
this.update({ [`data.xp`]: xp }) this.update({ [`system.xp`]: xp })
this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'data.rank': career.data.rank + 1 }]) this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'system.rank': career.system.rank + 1 }])
} else { } else {
ui.notifications.warn("Pas assez de points d'expérience !") ui.notifications.warn("Pas assez de points d'expérience !")
} }
@ -149,18 +160,18 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async toggleFightOption(itemId) { async toggleFightOption(itemId) {
let fightOption = this.data.items.get(itemId) let fightOption = this.items.get(itemId)
let state let state
let updates = [] let updates = []
if (fightOption) { if (fightOption) {
fightOption = duplicate(fightOption) fightOption = duplicate(fightOption)
if (fightOption.data.properties.activated) { if (fightOption.system.properties.activated) {
state = false state = false
} else { } else {
state = true state = true
} }
updates.push({ _id: fightOption._id, 'data.properties.activated': state }) // Update the selected one updates.push({ _id: fightOption._id, 'system.properties.activated': state }) // Update the selected one
await this.updateEmbeddedDocuments("Item", updates) // Apply all changes await this.updateEmbeddedDocuments("Item", updates) // Apply all changes
// Then notify // Then notify
ChatMessage.create({ ChatMessage.create({
@ -175,13 +186,13 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */ /*-------------------------------------------- */
get armorMalusValue() { // used for Fight Options get armorMalusValue() { // used for Fight Options
for (let armor of this.armors) { for (let armor of this.armors) {
if (armor.data.properties.armorQuality.includes("light")) { if (armor.system.properties.armorQuality.includes("light")) {
return 1 return 1
} }
if (armor.data.properties.armorQuality.includes("medium")) { if (armor.system.properties.armorQuality.includes("medium")) {
return 2 return 2
} }
if (armor.data.properties.armorQuality.includes("heavy")) { if (armor.system.properties.armorQuality.includes("heavy")) {
return 3 return 3
} }
} }
@ -189,109 +200,113 @@ export class BoLActor extends Actor {
} }
get resources() { get resources() {
return Object.values(this.data.data.resources) return Object.values(this.system.resources)
} }
get boons() { get boons() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "boon"); return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "boon") || []);
} }
get flaws() { get flaws() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "flaw"); return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw") || []);
} }
get careers() { get careers() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "career"); return duplicate( this.items.filter(i => i.type === "feature" && i.system.subtype === "career") || [])
} }
get origins() { get origins() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "origin"); return this.items.filter(i => i.type === "feature" && i.system.subtype === "origin");
} }
get races() { get races() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "race"); return this.items.filter(i => i.type === "feature" && i.system.subtype === "race");
} }
get languages() { get languages() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "language") return this.items.filter(i => i.type === "feature" && i.system.subtype === "language")
} }
get fightoptions() { get fightoptions() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "fightoption") return this.items.filter(i => i.type === "feature" && i.system.subtype === "fightoption")
}
get godsfaith() {
return this.items.filter(i => i.type === "feature" && i.system.subtype === "godsfaith")
} }
get features() { get features() {
return this.itemData.filter(i => i.type === "feature") return this.items.filter(i => i.type === "feature")
} }
get equipment() { get equipment() {
return this.itemData.filter(i => i.type === "item") return this.items.filter(i => i.type === "item")
} }
get equipmentCreature() { get equipmentCreature() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && (( i.data.subtype === "weapon" && i.data.properties.natural === true) || (i.data.subtype === "armor")) ) return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && (( i.system.subtype === "weapon" && i.system.properties.natural === true) || (i.system.subtype === "armor")) )
} }
get armors() { get armors() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "armor"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "armor");
} }
get helms() { get helms() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "helm"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "helm");
} }
get shields() { get shields() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "shield"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "shield");
} }
get weapons() { get weapons() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "weapon"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "weapon");
} }
get protections() { get protections() {
return this.armors.concat(this.helms).concat(this.shields) return this.armors.concat(this.helms).concat(this.shields)
} }
get spells() { get spells() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "spell"); return this.items.filter(i => i.type === "item" && i.system.category === "spell");
} }
get alchemy() { get alchemy() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "alchemy"); return this.items.filter(i => i.type === "item" && i.system.category === "alchemy");
} }
get melee() { get melee() {
return this.weapons.filter(i => i.data.properties.melee === true); return this.weapons.filter(i => i.system.properties.melee === true);
} }
get natural() { get natural() {
return this.weapons.filter(i => i.data.properties.natural === true); return this.weapons.filter(i => i.system.properties.natural === true);
} }
get ranged() { get ranged() {
return this.weapons.filter(i => i.data.properties.ranged === true); return this.weapons.filter(i => i.system.properties.ranged === true);
} }
get containers() { get containers() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "container"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "container");
} }
get treasure() { get treasure() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "currency"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "currency");
} }
get vehicles() { get vehicles() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "vehicle"); return this.items.filter(i => i.type === "item" && i.system.category === "vehicle");
} }
get ammos() { get ammos() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "ammunition"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "ammunition");
} }
get misc() { get misc() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && (i.data.subtype === "other" || i.data.subtype === "container" || i.data.subtype === "scroll" || i.data.subtype === "jewel")); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && (i.system.subtype === "other" || i.system.subtype === "container" || i.system.subtype === "scroll" || i.system.subtype === "jewel"));
} }
get bonusBoons() { get bonusBoons() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "boon" && i.data.properties.isbonusdice); let boons = this.items.filter(i => i.type === "feature" && i.system.subtype === "boon" && i.system.properties.isbonusdice)
return duplicate( boons || [])
} }
get malusFlaws() { get malusFlaws() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "flaw" && i.data.properties.ismalusdice); return duplicate( this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw" && i.system.properties.ismalusdice) || []);
} }
isSorcerer() { isSorcerer() {
if (this.careers.find(item => item.data.properties.sorcerer == true)) if (this.careers.find(item => item.system.properties.sorcerer == true))
return true return true
return false return false
} }
isAlchemist() { isAlchemist() {
if (this.careers.find(item => item.data.properties.alchemist == true)) if (this.careers.find(item => item.system.properties.alchemist == true))
return true return true
return false return false
} }
isPriest() { isPriest() {
if (this.careers.find(item => item.data.properties.priest == true)) if (this.careers.find(item => item.system.properties.priest == true))
return true return true
return false return false
} }
@ -301,8 +316,8 @@ export class BoLActor extends Actor {
let armors = this.armors let armors = this.armors
let ppCostArmor = 0 let ppCostArmor = 0
for (let armor of armors) { for (let armor of armors) {
if (armor.data.worn) { if (armor.system.worn) {
ppCostArmor += Number(armor.data.properties.modifiers.powercost) || 0 ppCostArmor += Number(armor.system.properties.modifiers.powercost) || 0
} }
} }
return ppCostArmor return ppCostArmor
@ -311,8 +326,8 @@ export class BoLActor extends Actor {
getArmorAgiMalus() { getArmorAgiMalus() {
let malusAgi = 0 let malusAgi = 0
for (let armor of this.protections) { for (let armor of this.protections) {
if (armor.data.worn) { if (armor.system.worn) {
malusAgi += Number(armor.data.properties.modifiers.agility) || 0 malusAgi += Number(armor.system.properties.modifiers.agility) || 0
} }
} }
return malusAgi return malusAgi
@ -321,8 +336,8 @@ export class BoLActor extends Actor {
getArmorInitMalus() { getArmorInitMalus() {
let malusInit = 0 let malusInit = 0
for (let armor of this.protections) { for (let armor of this.protections) {
if (armor.data.worn) { if (armor.system.worn) {
malusInit += Number(armor.data.properties.modifiers.init) || 0 malusInit += Number(armor.system.properties.modifiers.init) || 0
} }
} }
return malusInit return malusInit
@ -330,57 +345,61 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */ /*-------------------------------------------- */
spendPowerPoint(ppCost) { spendPowerPoint(ppCost) {
let newPP = this.data.data.resources.power.value - ppCost let newPP = this.system.resources.power.value - ppCost
newPP = (newPP < 0) ? 0 : newPP newPP = (newPP < 0) ? 0 : newPP
this.update({ 'data.resources.power.value': newPP }) this.update({ 'system.resources.power.value': newPP })
return newPP
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
resetAlchemyStatus(alchemyId) { resetAlchemyStatus(alchemyId) {
let alchemy = this.data.items.get(alchemyId) let alchemy = this.items.get(alchemyId)
if (alchemy) { if (alchemy) {
this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'data.properties.pccurrent': 0 }]) this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'system.properties.pccurrent': 0 }])
} }
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
async spendAlchemyPoint(alchemyId, pcCost) { async spendAlchemyPoint(alchemyId, pcCost) {
let alchemy = this.data.items.get(alchemyId) let alchemy = this.items.get(alchemyId)
if (alchemy) { if (alchemy) {
pcCost = Number(pcCost) ?? 0 pcCost = Number(pcCost) ?? 0
if (this.data.data.resources.alchemypoints.value >= pcCost) { if (this.system.resources.alchemypoints.value >= pcCost) {
let newPC = this.data.data.resources.alchemypoints.value - pcCost let newPC = this.system.resources.alchemypoints.value - pcCost
newPC = (newPC < 0) ? 0 : newPC newPC = (newPC < 0) ? 0 : newPC
this.update({ 'data.resources.alchemypoints.value': newPC }) this.update({ 'data.resources.alchemypoints.value': newPC })
newPC = alchemy.data.data.properties.pccurrent + pcCost newPC = alchemy.system.properties.pccurrent + pcCost
await this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'data.properties.pccurrent': newPC }]) await this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'system.properties.pccurrent': newPC }])
} else { } else {
ui.notifications.warn("Plus assez de Points de Création !") ui.notifications.warn("Plus assez de Points de Création !")
} }
} }
} }
/*-------------------------------------------- */
getAlchemistBonus() { getAlchemistBonus() {
let sorcerer = this.careers.find(item => item.data.properties.alchemist == true) let sorcerer = this.careers.find(item => item.system.properties.alchemist == true)
if (sorcerer) { if (sorcerer) {
return sorcerer.data.rank return sorcerer.system.rank
} }
return 0; return 0;
} }
/*-------------------------------------------- */
getSorcererBonus() { getSorcererBonus() {
let sorcerer = this.careers.find(item => item.data.properties.sorcerer == true) let sorcerer = this.careers.find(item => item.system.properties.sorcerer == true)
if (sorcerer) { if (sorcerer) {
return sorcerer.data.rank return sorcerer.system.rank
} }
return 0; return 0;
} }
/*-------------------------------------------- */
heroReroll() { heroReroll() {
if (this.type == 'character') { if (this.type == 'character') {
return this.data.data.resources.hero.value > 0; return this.system.resources.hero.value > 0;
} else { } else {
if (this.data.data.type == 'adversary') { if (this.system.type == 'adversary') {
return this.data.data.resources.hero.value > 0; return this.system.resources.hero.value > 0;
} }
} }
return false return false
@ -389,17 +408,17 @@ export class BoLActor extends Actor {
getResourcesFromType() { getResourcesFromType() {
let resources = {}; let resources = {};
if (this.type == 'encounter') { if (this.type == 'encounter') {
resources['hp'] = this.data.data.resources.hp; resources['hp'] = this.system.resources.hp;
if (this.data.data.type != 'base') { if (this.system.type != 'base') {
resources['faith'] = this.data.data.resources.faith resources['faith'] = this.system.resources.faith
resources['power'] = this.data.data.resources.power resources['power'] = this.system.resources.power
} }
if (this.data.data.type == 'adversary') { if (this.system.type == 'adversary') {
resources['hero'] = duplicate(this.data.data.resources.hero) resources['hero'] = duplicate(this.system.resources.hero)
resources['hero'].label = "BOL.resources.villainy" resources['hero'].label = "BOL.resources.villainy"
} }
} else { } else {
resources = this.data.data.resources; resources = this.system.resources;
} }
return resources return resources
} }
@ -440,6 +459,11 @@ export class BoLActor extends Actor {
"label": "BOL.featureCategory.fightoptions", "label": "BOL.featureCategory.fightoptions",
"ranked": false, "ranked": false,
"items": this.fightoptions "items": this.fightoptions
},
"godsfaith": {
"label": "BOL.featureSubtypes.gods",
"ranked": false,
"items": this.godsfaith
} }
} }
} }
@ -455,6 +479,15 @@ export class BoLActor extends Actor {
"options": false, "options": false,
"items": this.melee "items": this.melee
}, },
"natural": {
"label": "BOL.combatCategory.natural",
"weapon": true,
"protection": false,
"blocking": false,
"ranged": false,
"options": false,
"items": this.natural
},
"ranged": { "ranged": {
"label": "BOL.combatCategory.ranged", "label": "BOL.combatCategory.ranged",
"weapon": true, "weapon": true,
@ -494,39 +527,17 @@ export class BoLActor extends Actor {
} }
} }
buildCombatCreature() {
return {
"natural": {
"label": "BOL.combatCategory.natural",
"weapon": true,
"protection": false,
"blocking": false,
"ranged": false,
"options": false,
"items": this.natural
},
"protections": {
"label": "BOL.combatCategory.protections",
"weapon": false,
"protection": true,
"blocking": false,
"ranged": false,
"options": false,
"items": this.protections
},
}
}
/*-------------------------------------------- */ /*-------------------------------------------- */
buildRollList() { buildRollList() {
let rolls = [] let rolls = []
for (let key in this.data.data.attributes) { for (let key in this.system.attributes) {
let attr = this.data.data.attributes[key] let attr = this.system.attributes[key]
rolls.push({ key: key, value: attr.value, name: attr.label, type: "attribute" }) rolls.push({ key: key, value: attr.value, name: attr.label, type: "attribute" })
} }
for (let key in this.data.data.aptitudes) { for (let key in this.system.aptitudes) {
if (key != "def") { if (key != "def") {
let apt = this.data.data.aptitudes[key] let apt = this.system.aptitudes[key]
rolls.push({ key: key, value: apt.value, name: apt.label, type: "aptitude" }) rolls.push({ key: key, value: apt.value, name: apt.label, type: "aptitude" })
} }
} }
@ -535,20 +546,20 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */ /*-------------------------------------------- */
buildListeActions() { buildListeActions() {
return this.melee.concat(this.ranged) return this.melee.concat(this.ranged).concat(this.natural)
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
async manageHealthState() { async manageHealthState() {
let hpID = "lastHP" + this.id let hpID = "lastHP" + this.id
let lastHP = await this.getFlag("world", hpID) let lastHP = await this.getFlag("world", hpID)
if (lastHP != this.data.data.resources.hp.value && this.isOwner ) { if (lastHP != this.system.resources.hp.value && game.user.isGM ) { // Only GM sends this
await this.setFlag("world", hpID, this.data.data.resources.hp.value) await this.setFlag("world", hpID, this.system.resources.hp.value)
if (this.data.data.resources.hp.value <= 0) { if (this.system.resources.hp.value <= 0) {
ChatMessage.create({ ChatMessage.create({
alias: this.name, alias: this.name,
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name), whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.data.data.resources.hp.value }) content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.system.resources.hp.value })
}) })
} }
} }
@ -556,46 +567,46 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */ /*-------------------------------------------- */
registerInit(initScore, isCritical, isFumble) { registerInit(initScore, isCritical, isFumble) {
this.update({ 'data.combat.lastinit': initScore, 'data.combat.iscritical': isCritical, 'data.combat.isfumble': isFumble }) this.update({ 'system.combat.lastinit': initScore, 'system.combat.iscritical': isCritical, 'system.combat.isfumble': isFumble })
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
getLastInitData() { getLastInitData() {
return this.data.data.combat return this.system.combat
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
async subHeroPoints(nb) { async subHeroPoints(nb) {
let newHeroP = this.data.data.resources.hero.value - nb; let newHeroP = this.system.resources.hero.value - nb;
newHeroP = (newHeroP < 0) ? 0 : newHeroP; newHeroP = (newHeroP < 0) ? 0 : newHeroP;
await this.update({ 'data.resources.hero.value': newHeroP }); await this.update({ 'system.resources.hero.value': newHeroP });
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
async sufferDamage(damage) { async sufferDamage(damage) {
let newHP = this.data.data.resources.hp.value - damage; let newHP = this.system.resources.hp.value - damage
await this.update({ 'data.resources.hp.value': newHP }); await this.update({ 'system.resources.hp.value': newHP })
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getArmorFormula() { getArmorFormula() {
let protectWorn = this.protections.filter(item => item.data.worn) let protectWorn = this.protections.filter(item => item.system.worn)
let formula = "" let formula = ""
for (let protect of protectWorn) { for (let protect of protectWorn) {
if (protect.data.subtype == 'helm') { if (protect.system.subtype == 'helm') {
formula += "+1" formula += "+1"
} else if (protect.data.subtype == 'armor') { } else if (protect.system.subtype == 'armor') {
if (BoLUtility.getRollArmor()) { if (BoLUtility.getRollArmor()) {
if (!protect.data.properties.soak.formula || protect.data.properties.soak.formula == "") { if (!protect.system.properties.soak.formula || protect.system.properties.soak.formula == "") {
ui.notifications.warn(`L'armure ${protect.name} n'a pas de formule pour la protection !`) ui.notifications.warn(`L'armure ${protect.name} n'a pas de formule pour la protection !`)
} else { } else {
formula += "+" + protect.data.properties.soak.formula formula += "+" + " max(" + protect.system.properties.soak.formula +",0)"
} }
} else { } else {
if (protect.data.properties.soak.value == undefined) { if (protect.system.properties.soak.value == undefined) {
ui.notifications.warn(`L'armure ${protect.name} n'a pas de valeur fixe pour la protection !`) ui.notifications.warn(`L'armure ${protect.name} n'a pas de valeur fixe pour la protection !`)
} else { } else {
formula += "+ " + protect.data.properties.soak.value formula += "+ " + protect.system.properties.soak.value
} }
} }
} }
@ -606,19 +617,19 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
rollProtection(itemId) { rollProtection(itemId) {
let armor = this.data.items.get(itemId) let armor = duplicate(this.items.get(itemId))
if (armor) { if (armor) {
let armorFormula = armor.data.data.properties.soak.formula; let armorFormula = "max("+armor.system.properties.soak.formula + ", 0)"
let rollArmor = new Roll(armorFormula) let rollArmor = new Roll(armorFormula)
rollArmor.roll({ async: false }).toMessage(); rollArmor.roll({ async: false }).toMessage()
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
rollWeaponDamage(itemId) { rollWeaponDamage(itemId) {
let weapon = this.data.items.get(itemId) let weapon = duplicate(this.items.get(itemId))
if (weapon) { if (weapon) {
let r = new BoLDefaultRoll({ id: randomID(16), isSuccess: true, mode: "weapon", weapon: weapon, actor: this }) let r = new BoLDefaultRoll({ id: randomID(16), isSuccess: true, mode: "weapon", weapon: weapon, actorId: this.id, actor: this })
r.setSuccess(true) r.setSuccess(true)
r.rollDamage() r.rollDamage()
} }
@ -626,10 +637,10 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
toggleEquipItem(item) { toggleEquipItem(item) {
const equipable = item.data.data.properties.equipable; const equipable = item.system.properties.equipable;
if (equipable) { if (equipable) {
let itemData = duplicate(item.data); let itemData = duplicate(item);
itemData.data.worn = !itemData.data.worn; itemData.system.worn = !itemData.system.worn;
return item.update(itemData); return item.update(itemData);
} }
} }

View File

@ -13,6 +13,8 @@ import { BoLUtility } from "./system/bol-utility.js"
import { BoLCombatManager } from "./system/bol-combat.js" import { BoLCombatManager } from "./system/bol-combat.js"
import { BoLTokenHud } from "./system/bol-action-hud.js" import { BoLTokenHud } from "./system/bol-action-hud.js"
import { BoLHotbar } from "./system/bol-hotbar.js" import { BoLHotbar } from "./system/bol-hotbar.js"
import { BoLAdventureGenerator } from "./system/bol-adventure-generator.js"
import { BoLCommands} from "./system/bol-commands.js"
/* -------------------------------------------- */ /* -------------------------------------------- */
Hooks.once('init', async function () { Hooks.once('init', async function () {
@ -28,7 +30,7 @@ Hooks.once('init', async function () {
// Game socket // Game socket
game.socket.on("system.bol", sockmsg => { game.socket.on("system.bol", sockmsg => {
BoLUtility.onSocketMessage(sockmsg); BoLUtility.onSocketMessage(sockmsg);
}); })
/** /**
@ -55,6 +57,8 @@ Hooks.once('init', async function () {
BoLUtility.init() BoLUtility.init()
BoLTokenHud.init() BoLTokenHud.init()
BoLHotbar.init() BoLHotbar.init()
BoLCommands.init()
BoLAdventureGenerator.init()
// Preload Handlebars Templates // Preload Handlebars Templates
await preloadHandlebarsTemplates(); await preloadHandlebarsTemplates();
@ -75,6 +79,7 @@ function registerUsageCount( registerKey ) {
name: "Unique world key", name: "Unique world key",
scope: "world", scope: "world",
config: false, config: false,
default: "",
type: String type: String
}); });
@ -84,7 +89,10 @@ function registerUsageCount( registerKey ) {
game.settings.set(registerKey, "world-key", worldKey ) game.settings.set(registerKey, "world-key", worldKey )
} }
// Simple API counter // Simple API counter
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.data.version}"` let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
//$.ajaxSetup({
//headers: { 'Access-Control-Allow-Origin': '*' }
//})
$.ajax(regURL) $.ajax(regURL)
} }
} }
@ -95,19 +103,21 @@ function welcomeMessage() {
user: game.user.id, user: game.user.id,
whisper: [game.user.id], whisper: [game.user.id],
content: `<div id="welcome-message-pegasus"><span class="rdd-roll-part"> content: `<div id="welcome-message-pegasus"><span class="rdd-roll-part">
<strong>Bienvenue dans Barbarians of Lemuria (Ludospherik version)</strong> <strong>` + game.i18n.localize("BOL.chat.welcome1") + `</strong><p>` +
<p>Les livres nécessaires pour jouer sont disponibles sur le site de l'éditeur : http://www.ludospherik.fr/content/14-barbarians-of-lemuria</p> game.i18n.localize("BOL.chat.welcome2") + "<p>" +
<p>Les cartes intégrées au système le sont grace à l'aimable autorisation de leur auteur Guillaume Tavernier et des éditions Ludospherik. Merci à eux !. game.i18n.localize("BOL.chat.welcome3") + "<p>" +
<p>Tout le support et le suivi de ce système es disponible via le Discord Foundry FR : https://discord.gg/pPSDNJk </p> game.i18n.localize("BOL.chat.welcome4") + "</p>" +
<p>Bon jeu en Lemurie !</p> game.i18n.localize("BOL.chat.welcome5") + "</p>"
` }); } )
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
Hooks.once('ready', async function () { Hooks.once('ready', async function () {
BoLUtility.ready()
registerUsageCount('bol') registerUsageCount('bol')
welcomeMessage() welcomeMessage()
}); })

View File

@ -18,13 +18,14 @@ export class BoLRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
static attributeCheck(actor, key) { static attributeCheck(actor, key) {
let attribute = eval(`actor.data.data.attributes.${key}`) let attribute = eval(`actor.system.attributes.${key}`)
let label = (attribute.label) ? game.i18n.localize(attribute.label) : null let label = (attribute.label) ? game.i18n.localize(attribute.label) : null
let description = game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label) let description = game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label)
let rollData = { let rollData = {
mode: "attribute", mode: "attribute",
actorId: actor.id, actorId: actor.id,
img: actor.img,
attribute: attribute, attribute: attribute,
attrValue: attribute.value, attrValue: attribute.value,
aptValue: 0, aptValue: 0,
@ -42,9 +43,9 @@ export class BoLRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
static aptitudeCheck(actor, key) { static aptitudeCheck(actor, key) {
let aptitude = eval(`actor.data.data.aptitudes.${key}`) let aptitude = eval(`actor.system.aptitudes.${key}`)
let attrKey = this.getDefaultAttribute(key) let attrKey = this.getDefaultAttribute(key)
let attribute = eval(`actor.data.data.attributes.${attrKey}`) let attribute = eval(`actor.system.attributes.${attrKey}`)
let label = (aptitude.label) ? game.i18n.localize(aptitude.label) : null; let label = (aptitude.label) ? game.i18n.localize(aptitude.label) : null;
let description = game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label); let description = game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label);
@ -52,6 +53,7 @@ export class BoLRoll {
{ {
mode: "aptitude", mode: "aptitude",
actorId: actor.id, actorId: actor.id,
img: actor.img,
attribute: attribute, attribute: attribute,
aptitude: aptitude, aptitude: aptitude,
attrValue: attribute.value, attrValue: attribute.value,
@ -70,13 +72,13 @@ export class BoLRoll {
let target = BoLUtility.getTarget() let target = BoLUtility.getTarget()
let weaponData = weapon.data.data let weaponData = weapon.system
let attribute = eval(`actor.data.data.attributes.${weaponData.properties.attackAttribute}`) let attribute = eval(`actor.system.attributes.${weaponData.properties.attackAttribute}`)
let aptitude = eval(`actor.data.data.aptitudes.${weaponData.properties.attackAptitude}`) let aptitude = eval(`actor.system.aptitudes.${weaponData.properties.attackAptitude}`)
// Manage specific case // Manage specific case
let fightOption = actor.getActiveFightOption() let fightOption = actor.getActiveFightOption()
if (fightOption && fightOption.data.fightoptiontype == "fulldefense") { if (fightOption && fightOption.system.fightoptiontype == "fulldefense") {
ui.notifications.warn(`{{actor.name}} est en Défense Totale ! Il ne peut pas attaquer ce round.`) ui.notifications.warn(`{{actor.name}} est en Défense Totale ! Il ne peut pas attaquer ce round.`)
return return
} }
@ -84,12 +86,13 @@ export class BoLRoll {
let rolldata = { let rolldata = {
mode: "weapon", mode: "weapon",
actorId: actor.id, actorId: actor.id,
img: actor.img,
weapon: weapon, weapon: weapon,
isRanged: weaponData.properties.ranged || weaponData.properties.throwing, isRanged: weaponData.properties.ranged || weaponData.properties.throwing,
targetId: target?.id, targetId: target?.id,
fightOption: fightOption, fightOption: fightOption,
careerBonus: 0, careerBonus: 0,
defenderId: target?.data?.actorId, defenderId: target?.actor.id,
attribute: attribute, attribute: attribute,
aptitude: aptitude, aptitude: aptitude,
attrValue: attribute.value, attrValue: attribute.value,
@ -106,23 +109,25 @@ export class BoLRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
static weaponCheck(actor, event) { static weaponCheck(actor, event) {
const li = $(event.currentTarget).parents(".item") const li = $(event.currentTarget).parents(".item")
const weapon = actor.items.get(li.data("item-id")) let weapon = actor.items.get(li.data("item-id"))
if (!weapon) { if (!weapon) {
ui.notifications.warn("Unable to find weapon !") ui.notifications.warn("Unable to find weapon !")
return return
} }
weapon = duplicate(weapon)
return this.weaponCheckWithWeapon(actor, weapon) return this.weaponCheckWithWeapon(actor, weapon)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static alchemyCheck(actor, event) { static alchemyCheck(actor, event) {
const li = $(event.currentTarget).parents(".item"); const li = $(event.currentTarget).parents(".item");
const alchemy = actor.items.get(li.data("item-id")); let alchemy = actor.items.get(li.data("item-id"));
if (!alchemy) { if (!alchemy) {
ui.notifications.warn("Unable to find Alchemy !"); ui.notifications.warn("Unable to find Alchemy !");
return; return;
} }
let alchemyData = alchemy.data.data alchemy = duplicate(alchemy)
let alchemyData = alchemy.system
if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) { if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) {
ui.notifications.warn("Pas assez de Points de Cration investis dans la Préparation !") ui.notifications.warn("Pas assez de Points de Cration investis dans la Préparation !")
return return
@ -131,9 +136,10 @@ export class BoLRoll {
let alchemyDef = { let alchemyDef = {
mode: "alchemy", mode: "alchemy",
actorId: actor.id, actorId: actor.id,
img: actor.img,
alchemy: alchemy, alchemy: alchemy,
attribute: actor.data.data.attributes.mind, attribute: actor.system.attributes.mind,
attrValue: actor.data.data.attributes.mind.value, attrValue: actor.system.attributes.mind.value,
aptValue: 0, aptValue: 0,
careerBonus: actor.getAlchemistBonus(), careerBonus: actor.getAlchemistBonus(),
pcCost: Number(alchemyData.properties.pccost), pcCost: Number(alchemyData.properties.pccost),
@ -150,40 +156,41 @@ export class BoLRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
static spellCheckWithSpell( actor, spell ) { static spellCheckWithSpell( actor, spell ) {
let spellData = spell.data.data
let spellDef = { let spellDef = {
mode: "spell", mode: "spell",
actorId: actor.id, actorId: actor.id,
img: actor.img,
spell: spell, spell: spell,
attribute: actor.data.data.attributes.mind, attribute: actor.system.attributes.mind,
attrValue: actor.data.data.attributes.mind.value, attrValue: actor.system.attributes.mind.value,
aptValue: 0, aptValue: 0,
ppCurrent: Number(actor.data.data.resources.power.value), ppCurrent: Number(actor.system.resources.power.value),
careerBonus: actor.getSorcererBonus(), careerBonus: actor.getSorcererBonus(),
ppCostArmor: actor.getPPCostArmor(), ppCostArmor: actor.getPPCostArmor(),
ppCost: Number(spell.data.data.properties.ppcost), ppCost: Number(spell.system.properties.ppcost),
mod: Number(spellData.properties.difficulty), mod: Number(spell.system.properties.difficulty),
armorAgiMalus: actor.getArmorAgiMalus(), armorAgiMalus: actor.getArmorAgiMalus(),
armorInitMalus: actor.getArmorInitMalus(), armorInitMalus: actor.getArmorInitMalus(),
label: spell.name, label: spell.name,
description: game.i18n.localize('BOL.ui.focusSpell') + " : " + spell.name, description: game.i18n.localize('BOL.ui.focusSpell') + " : " + spell.name,
} }
console.log("SPELL!", spellDef) //console.log("SPELL!", spellDef)
return this.displayRollDialog(spellDef) return this.displayRollDialog(spellDef)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static spellCheck(actor, event) { static spellCheck(actor, event) {
if (actor.data.data.resources.power.value <= 0) { if (actor.system.resources.power.value <= 0) {
ui.notifications.warn("Plus assez de points de Pouvoir !") ui.notifications.warn("Plus assez de points de Pouvoir !")
return return
} }
const li = $(event.currentTarget).parents(".item") const li = $(event.currentTarget).parents(".item")
const spell = actor.items.get(li.data("item-id")) let spell = actor.items.get(li.data("item-id"))
if (!spell) { if (!spell) {
ui.notifications.warn("Impossible de trouver ce sort !") ui.notifications.warn("Impossible de trouver ce sort !")
return return
} }
spell = duplicate(spell)
return this.spellCheckWithSpell( actor, spell) return this.spellCheckWithSpell( actor, spell)
} }
@ -202,7 +209,7 @@ export class BoLRoll {
$('#roll-nbdice').val("2 + " + String(Math.abs(this.rollData.bmDice)) + letter) $('#roll-nbdice').val("2 + " + String(Math.abs(this.rollData.bmDice)) + letter)
} }
let rollbase = this.rollData.attrValue + "+" + this.rollData.aptValue let rollbase = this.rollData.attrValue + "+" + this.rollData.aptValue
if ( this.rollData.weapon && this.rollData.weapon.data.data.properties.onlymodifier ) { if ( this.rollData.weapon && this.rollData.weapon.system.properties.onlymodifier ) {
rollbase = "" rollbase = ""
} }
$('#roll-modifier').val(rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" + $('#roll-modifier').val(rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" +
@ -219,20 +226,20 @@ export class BoLRoll {
let fgItem = rollData.fightOption let fgItem = rollData.fightOption
if (fgItem) { if (fgItem) {
console.log(fgItem) console.log(fgItem)
if (fgItem.data.properties.fightoptiontype == "armordefault") { if (fgItem.system.properties.fightoptiontype == "armordefault") {
rollData.modArmorMalus = rollData.armorMalus // Activate the armor malus rollData.modArmorMalus = rollData.armorMalus // Activate the armor malus
rollData.damagesIgnoresArmor = true rollData.damagesIgnoresArmor = true
} }
if (fgItem.data.properties.fightoptiontype == "intrepid") { if (fgItem.system.properties.fightoptiontype == "intrepid") {
rollData.attackModifier += 2 rollData.attackModifier += 2
} }
if (fgItem.data.properties.fightoptiontype == "defense") { if (fgItem.system.properties.fightoptiontype == "defense") {
rollData.attackModifier += -1 rollData.attackModifier += -1
} }
if (fgItem.data.properties.fightoptiontype == "attack") { if (fgItem.system.properties.fightoptiontype == "attack") {
rollData.attackModifier += 1 rollData.attackModifier += 1
} }
if (fgItem.data.properties.fightoptiontype == "twoweaponsdef" || fgItem.data.properties.fightoptiontype == "twoweaponsatt") { if (fgItem.system.properties.fightoptiontype == "twoweaponsdef" || fgItem.system.properties.fightoptiontype == "twoweaponsatt") {
rollData.attackModifier += -1 rollData.attackModifier += -1
} }
} }
@ -282,15 +289,15 @@ export class BoLRoll {
html.find('#attr').change((event) => { html.find('#attr').change((event) => {
let attrKey = event.currentTarget.value let attrKey = event.currentTarget.value
let actor = game.actors.get( this.rollData.actorId) let actor = game.actors.get( this.rollData.actorId)
this.rollData.attribute = duplicate(actor.data.data.attributes[attrKey]) this.rollData.attribute = duplicate(actor.system.attributes[attrKey])
this.rollData.attrValue = actor.data.data.attributes[attrKey].value this.rollData.attrValue = actor.system.attributes[attrKey].value
this.updateTotalDice() this.updateTotalDice()
}) })
html.find('#apt').change((event) => { html.find('#apt').change((event) => {
let aptKey = event.currentTarget.value let aptKey = event.currentTarget.value
let actor = game.actors.get( this.rollData.actorId) let actor = game.actors.get( this.rollData.actorId)
this.rollData.aptitude = duplicate(actor.data.data.aptitudes[aptKey]) this.rollData.aptitude = duplicate(actor.system.aptitudes[aptKey])
this.rollData.aptValue = actor.data.data.aptitudes[aptKey].value this.rollData.aptValue = actor.system.aptitudes[aptKey].value
this.updateTotalDice() this.updateTotalDice()
}) })
@ -309,12 +316,12 @@ export class BoLRoll {
}) })
html.find('#boon').change((event) => { html.find('#boon').change((event) => {
let boons = $('#boon').val() let boons = $('#boon').val()
this.rollData.nbBoons = (!boons || boons.length == 0) ? 0 : Math.max(...boons.map(i => parseInt(i))) this.rollData.nbBoons = (!boons || boons.length == 0) ? 0 : boons.length
this.updateTotalDice() this.updateTotalDice()
}) })
html.find('#flaw').change((event) => { html.find('#flaw').change((event) => {
let flaws = $('#flaw').val() let flaws = $('#flaw').val()
this.rollData.nbFlaws = (!flaws || flaws.length == 0) ? 0 : Math.max(...flaws.map(i => parseInt(i))) this.rollData.nbFlaws = (!flaws || flaws.length == 0) ? 0 : flaws.length
this.updateTotalDice() this.updateTotalDice()
}) })
html.find('.bdice').click((event) => { html.find('.bdice').click((event) => {
@ -330,18 +337,18 @@ export class BoLRoll {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static preProcessWeapon(rollData) { static preProcessWeapon(rollData, defender) {
if (rollData.mode == "weapon") { if (rollData.mode == "weapon") {
rollData.weaponModifier = rollData.weapon.data.data.properties.attackModifiers ?? 0; rollData.weaponModifier = rollData.weapon.system.properties.attackModifiers ?? 0;
rollData.attackBonusDice = rollData.weapon.data.data.properties.attackBonusDice rollData.attackBonusDice = rollData.weapon.system.properties.attackBonusDice
if (rollData.defender) { // If target is selected if (defender) { // If target is selected
rollData.defence = rollData.defender.defenseValue rollData.defence = defender.defenseValue
rollData.armorMalus = rollData.defender.armorMalusValue rollData.armorMalus = defender.armorMalusValue
rollData.shieldBlock = 'none' rollData.shieldBlock = 'none'
let shields = rollData.defender.shields let shields = defender.shields
for (let shield of shields) { for (let shield of shields) {
rollData.shieldBlock = (shield.data.properties.blocking.blockingAll) ? 'blockall' : 'blockone'; rollData.shieldBlock = (shield.system.properties.blocking.blockingAll) ? 'blockall' : 'blockone';
rollData.shieldAttackMalus = (shield.data.properties.blocking.malus) ? shield.data.properties.blocking.malus : 1; rollData.shieldAttackMalus = (shield.system.properties.blocking.malus) ? shield.system.properties.blocking.malus : 1;
rollData.applyShieldMalus = false rollData.applyShieldMalus = false
} }
} }
@ -356,6 +363,12 @@ export class BoLRoll {
const rollOptionTpl = `systems/bol/templates/dialogs/${rollData.mode}-roll-dialog.hbs` const rollOptionTpl = `systems/bol/templates/dialogs/${rollData.mode}-roll-dialog.hbs`
let actor = game.actors.get( rollData.actorId ) let actor = game.actors.get( rollData.actorId )
let defender
if ( rollData.targetId) {
let token = game.scenes.current.tokens.get(rollData.targetId)
defender = token.actor
}
rollData.careers = actor.careers rollData.careers = actor.careers
rollData.boons = actor.bonusBoons rollData.boons = actor.bonusBoons
rollData.flaws = actor.malusFlaws rollData.flaws = actor.malusFlaws
@ -381,7 +394,7 @@ export class BoLRoll {
rollData.attackBonusDice = false rollData.attackBonusDice = false
rollData.armorMalus = 0 rollData.armorMalus = 0
// Specific stuff // Specific stuff
this.preProcessWeapon(rollData) this.preProcessWeapon(rollData, defender)
this.preProcessFightOption(rollData) this.preProcessFightOption(rollData)
this.updateArmorMalus(rollData) this.updateArmorMalus(rollData)
this.updatePPCost(rollData) this.updatePPCost(rollData)
@ -418,7 +431,7 @@ export class BoLRoll {
rollData.nbDice += (rollData.attackBonusDice) ? 1 : 0 rollData.nbDice += (rollData.attackBonusDice) ? 1 : 0
let rollbase = rollData.attrValue + rollData.aptValue let rollbase = rollData.attrValue + rollData.aptValue
if ( rollData.weapon && rollData.weapon.data.data.properties.onlymodifier ) { if ( rollData.weapon && rollData.weapon.system.properties.onlymodifier ) {
rollbase = 0 rollbase = 0
} }
const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus
@ -443,7 +456,6 @@ export class BoLRoll {
export class BoLDefaultRoll { export class BoLDefaultRoll {
constructor(rollData) { constructor(rollData) {
BoLUtility.storeRoll(rollData)
this.rollData = rollData this.rollData = rollData
if (this.rollData.isSuccess == undefined) { // First init if (this.rollData.isSuccess == undefined) { // First init
this.rollData.isSuccess = false; this.rollData.isSuccess = false;
@ -451,10 +463,10 @@ export class BoLDefaultRoll {
this.rollData.isFumble = false; this.rollData.isFumble = false;
} }
if (this.rollData.optionsId) { if (this.rollData.optionsId) {
$(`#${this.rollData.optionsId}`).hide() // Hide the options roll buttons BoLUtility.cleanupButtons( this.rollData.optionsId)
} }
if (this.rollData.applyId) { if (this.rollData.applyId) {
$(`#${this.rollData.applyId}`).hide() // Hide the options roll buttons BoLUtility.cleanupButtons( this.rollData.applyId)
} }
this.rollData.optionsId = randomID(16) this.rollData.optionsId = randomID(16)
this.rollData.applyId = randomID(16) this.rollData.applyId = randomID(16)
@ -476,6 +488,9 @@ export class BoLDefaultRoll {
this.rollData.isLegendary = false this.rollData.isLegendary = false
this.rollData.isFumble = (diceTotal === 2) this.rollData.isFumble = (diceTotal === 2)
this.rollData.isFailure = !this.rollData.isSuccess this.rollData.isFailure = !this.rollData.isSuccess
//this.rollData.isRealCritical = true
//this.rollData.isFumble = true
let actor = game.actors.get( this.rollData.actorId) let actor = game.actors.get( this.rollData.actorId)
if (this.rollData.reroll == undefined) { if (this.rollData.reroll == undefined) {
@ -486,10 +501,10 @@ export class BoLDefaultRoll {
actor.registerInit(r.total, this.rollData.isCritical, this.rollData.isFumble) actor.registerInit(r.total, this.rollData.isCritical, this.rollData.isFumble)
} }
if (this.rollData.isSuccess && this.rollData.mode == "spell") { // PP cost management if (this.rollData.isSuccess && this.rollData.mode == "spell") { // PP cost management
actor.spendPowerPoint(this.rollData.ppCost + this.rollData.ppCostArmor) this.rollData.remainingPP = actor.spendPowerPoint(this.rollData.ppCost + this.rollData.ppCostArmor)
} }
if (this.rollData.mode == "alchemy") { // PP cost management if (this.rollData.mode == "alchemy") { // PP cost management
actor.resetAlchemyStatus(this.rollData.alchemy.id) actor.resetAlchemyStatus(this.rollData.alchemy._id)
} }
await this.sendChatMessage() await this.sendChatMessage()
@ -498,14 +513,15 @@ export class BoLDefaultRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
async sendChatMessage() { async sendChatMessage() {
let actor = game.actors.get( this.rollData.actorId) let actor = game.actors.get( this.rollData.actorId)
this._buildChatMessage(this.rollData).then(msgFlavor => { this._buildChatMessage(this.rollData).then( async msgFlavor => {
this.rollData.roll.toMessage({ let msg = await this.rollData.roll.toMessage({
user: game.user.id, user: game.user.id,
rollMode: game.settings.get("core", "rollMode"), rollMode: game.settings.get("core", "rollMode"),
//whisper: BoLUtility.getWhisperRecipientsAndGMs(this.rollData.actor.name), //whisper: BoLUtility.getWhisperRecipientsAndGMs(this.rollData.actor.name),
flavor: msgFlavor, flavor: msgFlavor,
speaker: ChatMessage.getSpeaker({ actor: actor }), speaker: ChatMessage.getSpeaker({ actor: actor }),
}) })
msg.setFlag("world", "bol-roll-data", this.rollData)
}) })
} }
@ -544,22 +560,25 @@ export class BoLDefaultRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
async sendDamageMessage() { async sendDamageMessage() {
let actor = game.actors.get( this.rollData.actorId) let actor = game.actors.get( this.rollData.actorId)
this._buildDamageChatMessage(this.rollData).then(msgFlavor => { this._buildDamageChatMessage(this.rollData).then(async msgFlavor => {
this.rollData.damageRoll.toMessage({ let msg = await this.rollData.damageRoll.toMessage({
user: game.user.id, user: game.user.id,
flavor: msgFlavor, flavor: msgFlavor,
speaker: ChatMessage.getSpeaker({ actor: actor }), speaker: ChatMessage.getSpeaker({ actor: actor }),
flags: { msgType: "default" } flags: { msgType: "default" }
}) })
}); this.rollData.actor = undefined // Cleanup
msg.setFlag("world", "bol-roll-data", this.rollData)
})
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getDamageAttributeValue(attrDamage) { getDamageAttributeValue(attrDamage, actorId = undefined) {
let attrDamageValue = 0 let attrDamageValue = 0
let actor = game.actors.get( this.rollData.actorId)
let actor = game.actors.get( (actorId) ? actorId: this.rollData.actorId)
if (attrDamage.includes("vigor")) { if (attrDamage.includes("vigor")) {
attrDamageValue = actor.data.data.attributes.vigor.value attrDamageValue = actor.system.attributes.vigor.value
if (attrDamage.includes("half")) { if (attrDamage.includes("half")) {
attrDamageValue = Math.floor(attrDamageValue / 2) attrDamageValue = Math.floor(attrDamageValue / 2)
} }
@ -570,7 +589,7 @@ export class BoLDefaultRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
async rollDamage() { async rollDamage() {
if (this.rollData.mode != "weapon") { // Only specific process in Weapon mode if (this.rollData.mode != "weapon") { // Only specific process in Weapon mode
return; return
} }
if (this.rollData.isSuccess) { if (this.rollData.isSuccess) {
@ -582,8 +601,8 @@ export class BoLDefaultRoll {
if (this.rollData.damageMode == 'damage-plus-12') { if (this.rollData.damageMode == 'damage-plus-12') {
bonusDmg = 12 bonusDmg = 12
} }
let attrDamageValue = this.getDamageAttributeValue(this.rollData.weapon.data.data.properties.damageAttribute) let attrDamageValue = this.getDamageAttributeValue(this.rollData.weapon.system.properties.damageAttribute)
let weaponFormula = BoLUtility.getDamageFormula(this.rollData.weapon.data.data, this.rollData.fightOption) let weaponFormula = BoLUtility.getDamageFormula(this.rollData.weapon.system, this.rollData.fightOption)
let damageFormula = weaponFormula + "+" + bonusDmg + "+" + attrDamageValue let damageFormula = weaponFormula + "+" + bonusDmg + "+" + attrDamageValue
console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData) console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData)
@ -594,7 +613,7 @@ export class BoLDefaultRoll {
await this.rollData.damageRoll.roll({ "async": false }) await this.rollData.damageRoll.roll({ "async": false })
this.rollData.damageTotal = this.rollData.damageRoll.total this.rollData.damageTotal = this.rollData.damageRoll.total
} }
$(`#${this.rollData.optionsId}`).hide() // Hide the options roll buttons BoLUtility.cleanupButtons(this.rollData.optionsId)
this.sendDamageMessage() this.sendDamageMessage()
} }
} }

View File

@ -19,43 +19,43 @@ export class BoLItemSheet extends ItemSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
/** @override */ /** @override */
getData(options) { async getData(options) {
const data = super.getData(options); const data = super.getData(options)
const itemData = data.data; let itemData = duplicate(data.document)
data.config = game.bol.config; data.config = game.bol.config
data.item = itemData; data.item = itemData
data.data = itemData.data; data.category = itemData.system.category
data.category = itemData.category;
data.itemProperties = this.item.itemProperties;
data.isGM = game.user.isGM; data.isGM = game.user.isGM;
data.itemProperties = this.item.itemProperties;
data.description = await TextEditor.enrichHTML(this.object.system.description, {async: true})
// Dynamic default data fix/adapt // Dynamic default data fix/adapt
if (itemData.type == "item") { if (itemData.type == "item") {
if (!itemData.data.category) { if (!itemData.system.category) {
itemData.data.category = "equipment" itemData.system.category = "equipment"
} }
if ( itemData.data.category == "equipment" && itemData.data.properties.equipable) { if ( itemData.system.category == "equipment" && itemData.system.properties.equipable) {
if (!itemData.data.properties.slot) { if (!itemData.system.properties.slot) {
itemData.data.properties.slot = "-" itemData.system.properties.slot = "-"
} }
} }
if (itemData.data.category == 'spell') { if (itemData.system.category == 'spell') {
if(!itemData.data.properties.mandatoryconditions) { if(!itemData.system.properties.mandatoryconditions) {
itemData.data.properties.mandatoryconditions = [] itemData.system.properties.mandatoryconditions = []
} }
if(!itemData.data.properties.optionnalconditions) { if(!itemData.system.properties.optionnalconditions) {
itemData.data.properties.optionnalconditions = [] itemData.system.properties.optionnalconditions = []
} }
for (let i = 0; i < 4; i++) { for (let i = 0; i < 4; i++) {
itemData.data.properties.mandatoryconditions[i] = itemData.data.properties.mandatoryconditions[i] ?? "" itemData.system.properties.mandatoryconditions[i] = itemData.system.properties.mandatoryconditions[i] ?? ""
} }
for (let i = 0; i < 8; i++) { for (let i = 0; i < 8; i++) {
itemData.data.properties.optionnalconditions[i] = itemData.data.properties.optionnalconditions[i] ?? "" itemData.system.properties.optionnalconditions[i] = itemData.system.properties.optionnalconditions[i] ?? ""
} }
} }
} else { } else {
if (!itemData.data.subtype) { if (!itemData.system.subtype) {
itemData.data.category = "origin" itemData.system.category = "origin"
} }
} }

View File

@ -7,21 +7,17 @@ export class BoLItem extends Item {
* Augment the basic Item data model with additional dynamic data. * Augment the basic Item data model with additional dynamic data.
*/ */
prepareData() { prepareData() {
super.prepareData(); super.prepareData()
// console.debug("Item prepareData");
// Get the Item's data
const itemData = this.data;
// console.log(itemData);
const actorData = this.actor ? this.actor.data : {};
const data = itemData.data;
}
get properties() { const actorData = this.actor ? this.actor.system : {}
return this.data.properties;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
get properties() {
return this.system.properties
}
/* -------------------------------------------- */
/** /**
* Get the Array of item properties which are used in the small sidebar of the description tab * Get the Array of item properties which are used in the small sidebar of the description tab
* @return {Array} * @return {Array}
@ -29,11 +25,11 @@ export class BoLItem extends Item {
*/ */
get itemProperties() { get itemProperties() {
const props = []; const props = [];
if ( this.data.type === "item" ) { if ( this.type === "item" ) {
const entries = Object.entries(this.data.data.properties); const entries = Object.entries(this.system.properties)
props.push(...entries.filter(e => e[1] === true).map(e => { return game.bol.config.itemProperties2[e[0]] })); props.push(...entries.filter(e => e[1] === true).map(e => { return game.bol.config.itemProperties2[e[0]] }))
} }
return props.filter(p => !!p); return props.filter(p => !!p)
} }

View File

@ -0,0 +1,620 @@
{
"titre1": [
{
"prefix": "la",
"name": "Prophétie"
},
{
"prefix": "les",
"name": "Grottes",
"isLieu": true
},
{
"prefix": "les",
"name": "Collines",
"isLieu": true
},
{
"prefix": "les",
"name": "Voleurs",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "les",
"name": "Sorcier(s)",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "la",
"name": "Bataille"
},
{
"prefix": "la",
"name": "Légende"
},
{
"prefix": "la",
"name": "Tour",
"isLieu": true
},
{
"prefix": "l'",
"name": "Ile",
"isLieu": true
},
{
"prefix": "les",
"name": "Pirates",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "les",
"name": "Druide(s)",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "le",
"name": "Navire",
"isCarriere": false
},
{
"prefix": "la",
"name": "Couronne",
"isObjet": true
},
{
"prefix": "la",
"name": "Cité",
"isLieu": true
},
{
"prefix": "le",
"name": "Désert",
"isLieu": true
},
{
"prefix": "les",
"name": "Bête(s)",
"isEnnemi": true,
"isLieu": false
},
{
"prefix": "les",
"name": "Démon(s)",
"isEnnemi": true,
"isLieu": false
},
{
"prefix": "le",
"name": "Trésor",
"isObjet": true
},
{
"prefix": "l'",
"name": "Epée",
"isObjet": true
},
{
"prefix": "l'",
"name": "Arène",
"isLieu": true
},
{
"prefix": "les",
"name": "Marais",
"isLieu": true
},
{
"prefix": "les",
"name": "Seigneur(s)",
"isEnnemi": true,
"isLieu": false
},
{
"prefix": "les",
"name": "Assassin(s)",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "le",
"name": "Culte",
"isEnnemi": true,
"isCarriere": false
},
{
"prefix": "le",
"name": "Secret",
"isCarriere": false
},
{
"prefix": "le",
"name": "Palais",
"isLieu": true
},
{
"prefix": "la",
"name": "Mer",
"isLieu": true
},
{
"prefix": "les",
"name": "Barbares",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "le",
"name": "Manuscrit",
"isObjet": true
},
{
"prefix": "les",
"name": "Plaines",
"isLieu": true
},
{
"prefix": "le",
"name": "Sang",
"isLieu": false
},
{
"prefix": "la",
"name": "Tombe",
"isLieu": true
},
{
"prefix": "la",
"name": "Forêt",
"isLieu": true
},
{
"prefix": "les",
"name": "Esclaves",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "les",
"name": "Mendiant(s)",
"isEnnemi": true,
"isCarriere": true
},
{
"prefix": "les",
"name": "Montagnes",
"isCarriereLieu": true
}
],
"titre2": [
{
"prefix": "du",
"name": "mal"
},
{
"prefix": "et le",
"name": "Roi Maussade",
"isEnnemi": true
},
{
"prefix": "et la",
"name": "pestilence",
"isEnnemi": false
},
{
"prefix": "de",
"name": "Malakut",
"isLieu": true
},
{
"prefix": "d'",
"name": "Halakh",
"isLieu": true
},
{
"prefix": "d'",
"name": "Hyrdral",
"isLieu": true
},
{
"prefix": "des",
"name": "esprits abandonnés",
"isEnnemi": true
},
{
"prefix": "du",
"name": "chaos",
"isEnnemi": true
},
{
"prefix": "de la",
"name": "folie",
"isEnnemi": false
},
{
"prefix": "de",
"name": "Satarla",
"isLieu": true
},
{
"prefix": "d'",
"name": "Urceb",
"isLieu": true
},
{
"prefix": "des",
"name": "Terres Désolées",
"isLieu": true
},
{
"prefix": "de la",
"name": "mort",
"isLieu": false
},
{
"prefix": "des",
"name": "idoles impies",
"isObjet": true
},
{
"prefix": "des",
"name": "ténèbres",
"isObjet": false
},
{
"prefix": "de",
"name": "Parsool",
"isLieu": true
},
{
"prefix": "de",
"name": "Qiddesh",
"isLieu": true
},
{
"prefix": "de",
"name": "Kasht",
"isLieu": true
},
{
"prefix": "de la ",
"name": "falalité",
"isLieu": false
},
{
"prefix": "du",
"name": "Nécromant",
"isEnnemi": true
},
{
"prefix": "du",
"name": "Néant",
"isEnnemi": false
},
{
"prefix": "de",
"name": "Lysor",
"isLieu": true
},
{
"prefix": "d'",
"name": "Oosal",
"isLieu": true
},
{
"prefix": "de",
"name": "Thulé",
"isLieu": true
},
{
"prefix": "du",
"name": "désespoir",
"isLieu": false
},
{
"prefix": "du",
"name": "Dieu Bouffi",
"isEnnemi": true
},
{
"prefix": "du",
"name": "silence",
"isEnnemi": false
},
{
"prefix": "de",
"name": "Tyrus",
"isLieu": true
},
{
"prefix": "d'",
"name": "Ygddar",
"isLieu": true
},
{
"prefix": "de",
"name": "la Côte de Feu",
"isLieu": true
},
{
"prefix": "des",
"name": "ombres cruelles",
"isLieu": false
},
{
"prefix": "de la",
"name": "poussière écarlate",
"isLieu": false
},
{
"prefix": "du",
"name": "destin",
"isLieu": false
},
{
"prefix": "du",
"name": "Valgard",
"isLieu": true
},
{
"prefix": "de",
"name": "Qeb",
"isLieu": true
},
{
"prefix": "de",
"name": "la Mer Inconnue",
"isLieu": true
}
],
"mission": [
{
"name": "dattaquer un lieu."
},
{
"name": "de détruire un certain objet."
},
{
"name": "de kidnapper quelquun."
},
{
"name": "dobtenir une certaine chose."
},
{
"name": "dexplorer un lieu."
},
{
"name": "de sauver une personne."
},
{
"name": "déchapper à quelquun."
},
{
"name": "de fuir un lieu."
},
{
"name": "de trouver une personne."
},
{
"name": "de trouver un lieu."
},
{
"name": "de trouver chose."
},
{
"name": "de protéger une personne."
},
{
"name": "de protéger un lieu."
},
{
"name": "de protéger chose."
},
{
"name": "de dérober une certaine chose."
},
{
"name": "de tuer une personne."
},
{
"name": "de détruire une chose."
},
{
"name": "descorter une personne."
},
{
"name": "de transporter une chose."
}
],
"carriere": [
"Noble",
"Acrobate",
"Sorcier",
"Alchimiste",
"Esclave",
"Courtisane",
"Médecin",
"Marin",
"Érudit",
"Mendiant",
"Scribe",
"Poète",
"Forgeron",
"Prêtre",
"Danseur",
"Marchand",
"Pilote des airs",
"Fermier"
],
"lieux1": [
"Palais",
"Donjon",
"Ruines",
"Sanctuaire",
"Crypte",
"Forteresse",
"Tombeau",
"Grottes",
"Tour",
"Antre",
"Île",
"Montagne"
],
"lieux2": [
"de la mort.",
"de la destruction.",
"du désespoir.",
"des morts-vivants.",
"du sage.",
"de l'or.",
"de la tempête.",
"de la terreur.",
"descannibales.",
"du désespoir.",
"des Rois-Sorciers.",
"des âmes perdues."
],
"objets1": [
"Livre",
"Anneau",
"Coupe",
"Joyau",
"Casque",
"Parchemin",
"Couronne",
"Sceau",
"Cristal",
"Crâne",
"Épée",
"Bâton"
],
"objets2": [
"des sept sceaux.",
"de l'éternelle douleur.",
"du sang bouillonnant.",
"de la mort hideuse.",
"du pouvoir suprême.",
"du serpent sournois.",
"du plaisir infini.",
"de la richesse illusoire.",
"de la cruelle trahison.",
"du froid funeste.",
"des spectres inapaisés.",
"du mystère."
],
"motivation": [
"cest le genre de choses que fait Krongar.",
"sinon il finira en prison.",
"il est victime dun chantage.",
"il a trouvé une carte.",
"il a été maudit.",
"il a eu une vision (peut-être un soir de beuverie).",
"il a été engagé pour le faire.",
"il a surpris une conversation.",
"il a lu quelque chose dans un ancien manuscrit.",
"il est tombé accidentellement dans cette affaire.",
"il cherche à assouvir une vengeance.",
"il a ,été dupé."
],
"rival": [
"un poète obsédé.",
"un prince (esse) guerrier.",
"un ministre corrompu.",
"un sectateur fanatique.",
"un noble arrogant.",
"un étrange alchimiste.",
"un sorcier maléfique.",
"un druide cruel.",
"un marchand cupide.",
"un brigand sans foi ni loi.",
"un démon sanguinaire.",
"un fantôme errant."
],
"dieu": [
"Tharungozoth",
"Yrzlak",
"Dyr",
"Knothakon",
"Hadron",
"Shazzadion",
"Chiomalla",
"SaTel",
"Morgazzon",
"Hurm",
"Afyra",
"Grondil",
"Zaggath",
"Zalkyr",
"Fillana",
"Lilandra",
"Zylidith",
"Quathoomar",
"Iondal",
"Piandra",
"Nemmereth",
"Charkond",
"Karyzon",
"Zarymphyxos",
"Kryphondus"
],
"complique1": [
"cest toujours comme ça avec Krongar !",
"la situation réveille chez Krongar des peurs ancestrales.",
"un usurier et ses hommes de main veulent récupérer leur argent.",
"une grave épidémie ravage la région.",
"Krongar est traqué pour un crime passé.",
"les actions dun groupe de rebelles rendent la région peu sûre.",
"des hordes de guerriers envahissent la région pour la conquérir",
"un(e) ancien(ne) admirateur (trice) éconduit(e) cherche à se venger.",
"la loi locale est très sévère et interdit une chose nécessaire à laccomplissement de la mission.",
"un(e) admirateur (trice) inattendu(e) déclare son amour.",
"un rival qui fut défait autrefois réapparaît et met son grain de sel.",
"la folie de Morgazzon fait des ravages dans la région."
],
"obstacle": [
"dun ancien secret.",
"dun long voyage.",
"dune malédiction.",
"dun voleur rusé.",
"dune forte troupe de soldats.",
"dun énorme monstre.",
"dune horde de monstres.",
"dun manque de temps.",
"de gardes et de pièges magiques.",
"dune catastrophe naturelle sur le point de se produire.",
"dune énigme à résoudre.",
"dune bataille à gagner."
],
"retournement": [
"Lennemi est en fait Krongar lui-même, venu dune autre réalité !",
"Toute cette histoire était un piège machiavélique !",
"Lennemi est en fait un vieil ami ou un allié qui a comploté dans lombre !",
"Krongar est contraint de sassocier à un rival pour accomplir la mission !",
"Tout ce qui semblait ordinaire se révèle en fait surnaturel !",
"Lennemi est en fait le père, la mère, le frère ou la sœur de Krongar !",
"Une toute autre mission attend en fait notre héros !",
"Parfois, il ny a pas de retournement de situation !",
"i la mission est accomplie, cela entraînera de terribles répercussions !",
"Le destin offre à Krongar une chance daméliorer les choses, et il est renvoyé dans le temps au début de laventure. La saga recommence, mais cette fois sans retournement de situation !",
"Un ami ou un allié a trahi Krongar !",
"Les dieux sont furieux et lui imposent d'autres tâches"
],
"recompense": [
"Rien du tout ! On sest joué de lui !",
"Beaucoup moins quescompté.",
"Beaucoup moins quescompté, mais il gagne au moins la reconnaissance dune personne haut placée.",
"Beaucoup moins quescompté, mais il est marqué par les dieux (avantage).",
"La récompense escomptée.",
"La récompense escomptée, et il est marqué par les dieux (avantage).",
"La récompense escomptée, ainsi que la reconnaissance dune personne haut placée.",
"Plus quescompté.",
"Plus quescompté, ainsi que la reconnaissance dune personne haut placée.",
"Plus quescompté, et il est marqué par les dieux (avantage).",
"Plus quescompté, ainsi que la reconnaissance dune personne haut placée, et il est marqué par les dieux (avantage).",
"Une promotion... Longue vie au roi Krongar !"
]
}

View File

@ -31,7 +31,7 @@ export class BoLTokenHud {
let actionIndex = Number(event.currentTarget.attributes['data-action-index'].value) let actionIndex = Number(event.currentTarget.attributes['data-action-index'].value)
let action = hudData.actionsList[actionIndex] let action = hudData.actionsList[actionIndex]
const weapon = actor.items.get( action._id ) const weapon = actor.items.get( action._id )
BoLRoll.weaponCheckWithWeapon(hudData.actor, weapon) BoLRoll.weaponCheckWithWeapon(hudData.actor, duplicate(weapon))
//console.log("Clicked", action) //console.log("Clicked", action)
} ) } )

View File

@ -0,0 +1,86 @@
/* -------------------------------------------- */
import { BoLUtility } from "./bol-utility.js";
/* -------------------------------------------- */
export class BoLAdventureGenerator {
/* -------------------------------------------- */
static async init() {
this.adventureData = await fetchJsonWithTimeout("systems/bol/module/system/adventure_data.json")
}
/* -------------------------------------------- */
static async createAdventure() {
let roll1 = new Roll("1d" + this.adventureData.titre1.length).evaluate({ async: false })
let roll2 = new Roll("1d" + this.adventureData.titre2.length).evaluate({ async: false })
let p1 = this.adventureData.titre1[roll1.result - 1]
let p2 = this.adventureData.titre2[roll2.result - 1]
let story = {}
story.title = "Krongar et " + p1.prefix + " " + p1.name + " " + p2.prefix + " " + p2.name
let rollM = new Roll("1d" + this.adventureData.mission.length).evaluate({ async: false })
story.mission = "La mission de Krongar est de " + this.adventureData.mission[rollM.result - 1].name
if (!p1.isCarriere && !p2.isCarriere) {
let rollC = new Roll("1d" + this.adventureData.carriere.length).evaluate({ async: false })
story.carriere = "Une carrière : " + this.adventureData.carriere[rollC.result - 1]
}
if (!p1.isLieu && !p2.isLieu) {
let rollL1 = new Roll("1d" + this.adventureData.lieux1.length).evaluate({ async: false })
let rollL2 = new Roll("1d" + this.adventureData.lieux2.length).evaluate({ async: false })
story.lieu = "Un lieu : " + this.adventureData.lieux1[rollL1.result - 1] + " " + this.adventureData.lieux2[rollL2.result - 1]
}
if (!p1.isObjet && !p2.isObjet) {
let rollO1 = new Roll("1d" + this.adventureData.objets1.length).evaluate({ async: false })
let rollO2 = new Roll("1d" + this.adventureData.objets2.length).evaluate({ async: false })
story.objet = "Un objet : " + this.adventureData.objets1[rollO1.result - 1] + " " + this.adventureData.objets2[rollO2.result - 1]
}
let rollMOT = new Roll("1d" + this.adventureData.motivation.length).evaluate({ async: false })
story.motivation = "Krongar entreprend cette mission parce que " + this.adventureData.motivation[rollMOT.result - 1]
if (!p1.isEnnemi && !p2.isEnnemi) {
let rollE = new Roll("1d" + this.adventureData.rival.length).evaluate({ async: false })
story.rival = "Un rival : " + this.adventureData.rival[rollE.result - 1]
}
let rollDieu = new Roll("1d6").evaluate({ async: false })
if (rollDieu.result == 6) {
rollDieu = new Roll("1d" + this.adventureData.dieu.length).evaluate({ async: false })
story.dieu = "Un Dieu est impliqué : " + this.adventureData.dieu[rollDieu.result - 1]
}
let rollComp = new Roll("1d6").evaluate({ async: false })
if (rollComp.result >= 5) {
rollComp = new Roll("1d" + this.adventureData.complique1.length).evaluate({ async: false })
story.complication = "Une complication : " + this.adventureData.complique1[rollComp.result - 1]
}
let rollObs = new Roll("1d6").evaluate({ async: false })
if (rollObs.result >= 5) {
rollObs = new Roll("1d" + this.adventureData.obstacle.length).evaluate({ async: false })
story.obstacle = "Un obstacle : " + this.adventureData.obstacle[rollObs.result - 1]
}
let rollRet = new Roll("1d6").evaluate({ async: false })
if (rollRet.result == 6) {
rollRet = new Roll("1d" + this.adventureData.retournement.length).evaluate({ async: false })
story.retournement = "Un retournement : " + this.adventureData.retournement[rollRet.result - 1]
}
let rollRec = new Roll("1d" + this.adventureData.recompense.length).evaluate({ async: false })
story.recompense = "Pour sa peine, Krongar reçoit " + this.adventureData.recompense[rollRec.result - 1]
ChatMessage.create({
alias: this.name,
whisper: BoLUtility.getUsers(user => user.isGM),
content: await renderTemplate('systems/bol/templates/chat/chat-adventure-result.hbs',
{ name: "Aventure !", img: "icons/commodities/gems/gem-cluster-red.webp", story : story})
})
}
}

View File

@ -15,7 +15,7 @@ export class BoLCombatManager extends Combat {
/************************************************************************************/ /************************************************************************************/
async rollInitiative(ids, formula = undefined, messageOptions = {}) { async rollInitiative(ids, formula = undefined, messageOptions = {}) {
console.log(`${game.data.system.data.title} | Combat.rollInitiative()`, ids, formula, messageOptions); console.log(`${game.system.title} | Combat.rollInitiative()`, ids, formula, messageOptions);
// Structure input data // Structure input data
ids = typeof ids === "string" ? [ids] : ids; ids = typeof ids === "string" ? [ids] : ids;
const currentId = this.combatant._id; const currentId = this.combatant._id;
@ -24,6 +24,7 @@ export class BoLCombatManager extends Combat {
for (let cId = 0; cId < ids.length; cId++) { for (let cId = 0; cId < ids.length; cId++) {
const combatant = this.combatants.get(ids[cId]); const combatant = this.combatants.get(ids[cId]);
let fvttInit = 5 let fvttInit = 5
//console.log("TYPE", combatant.actor.type)
if (combatant.actor.type == 'character') { if (combatant.actor.type == 'character') {
let initData = combatant.actor.getLastInitData() let initData = combatant.actor.getLastInitData()
console.log("Init data !!!", initData) console.log("Init data !!!", initData)
@ -37,11 +38,12 @@ export class BoLCombatManager extends Combat {
fvttInit = 3 fvttInit = 3
} }
} else { } else {
fvttInit = 4 // Pietaille par defaut fvttInit = 4 // Pietaille par defautco
if ( combatant.actor.getSubtype == 'adversary') { //console.log("ACTOR", combatant.actor.getCharType())
if ( combatant.actor.getCharType() == 'adversary') {
fvttInit = 7 fvttInit = 7
} }
if ( combatant.actor.getSubtype == 'tough') { if ( combatant.actor.getCharType() == 'tough') {
fvttInit = 6 fvttInit = 6
} }
} }

View File

@ -0,0 +1,108 @@
/* -------------------------------------------- */
import { BoLAdventureGenerator } from "./bol-adventure-generator.js"
/* -------------------------------------------- */
export class BoLCommands {
static init() {
if (!game.bol.commands) {
const bolCommands = new BoLCommands()
bolCommands.registerCommand({ path: ["/adventure"], func: (content, msg, params) => BoLAdventureGenerator.createAdventure(), descr: "Nouvelle idée d'aventure!" });
game.bol.commands = bolCommands
}
Hooks.on("chatMessage", (html, content, msg) => {
if (content[0] == '/') {
let regExp = /(\S+)/g;
let commands = content.match(regExp);
if (game.bol.commands.processChatCommand(commands, content, msg)) {
return false;
}
}
return true
})
}
constructor() {
this.commandsTable = {}
}
/* -------------------------------------------- */
registerCommand(command) {
this._addCommand(this.commandsTable, command.path, '', command);
}
/* -------------------------------------------- */
_addCommand(targetTable, path, fullPath, command) {
if (!this._validateCommand(targetTable, path, command)) {
return;
}
const term = path[0];
fullPath = fullPath + term + ' '
if (path.length == 1) {
command.descr = `<strong>${fullPath}</strong>: ${command.descr}`;
targetTable[term] = command;
}
else {
if (!targetTable[term]) {
targetTable[term] = { subTable: {} };
}
this._addCommand(targetTable[term].subTable, path.slice(1), fullPath, command)
}
}
/* -------------------------------------------- */
_validateCommand(targetTable, path, command) {
if (path.length > 0 && path[0] && command.descr && (path.length != 1 || targetTable[path[0]] == undefined)) {
return true;
}
console.warn("bolCommands._validateCommand failed ", targetTable, path, command);
return false;
}
/* -------------------------------------------- */
/* Manage chat commands */
processChatCommand(commandLine, content = '', msg = {}) {
// Setup new message's visibility
let rollMode = game.settings.get("core", "rollMode");
if (["gmroll", "blindroll"].includes(rollMode)) msg["whisper"] = ChatMessage.getWhisperRecipients("GM");
if (rollMode === "blindroll") msg["blind"] = true;
msg["type"] = 0;
let command = commandLine[0].toLowerCase();
let params = commandLine.slice(1);
return this.process(command, params, content, msg);
}
/* -------------------------------------------- */
process(command, params, content, msg) {
return this._processCommand(this.commandsTable, command, params, content, msg);
}
/* -------------------------------------------- */
_processCommand(commandsTable, name, params, content = '', msg = {}, path = "") {
console.log("===> Processing command")
let command = commandsTable[name];
path = path + name + " ";
if (command && command.subTable) {
if (params[0]) {
return this._processCommand(command.subTable, params[0], params.slice(1), content, msg, path)
}
else {
this.help(msg, command.subTable);
return true;
}
}
if (command && command.func) {
const result = command.func(content, msg, params);
if (result == false) {
BoLCommands._chatAnswer(msg, command.descr);
}
return true;
}
return false;
}
}

View File

@ -2,6 +2,21 @@ import { BoLRoll } from "../controllers/bol-rolls.js";
export class BoLHotbar { export class BoLHotbar {
static async assignToHotBar( item, slot) {
let command = `game.bol.BoLHotbar.rollMacro("${item.name}", "${item.type}");`
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command))
if (!macro) {
macro = await Macro.create({
name: item.name,
type: "script",
img: item.img,
command: command
}, { displaySheet: false })
}
await game.user.assignHotbarMacro(macro, slot);
}
/** /**
* Create a macro when dropping an entity on the hotbar * Create a macro when dropping an entity on the hotbar
* Item - open roll dialog for item * Item - open roll dialog for item
@ -10,55 +25,20 @@ export class BoLHotbar {
*/ */
static init( ) { static init( ) {
Hooks.on("hotbarDrop", async (bar, documentData, slot) => { Hooks.on("hotbarDrop", (bar, documentData, slot) => {
// Create item macro if rollable item - weapon, spell, prayer, trait, or skill // Create item macro if rollable item - weapon, spell, prayer, trait, or skill
if (documentData.type == "Item") { if (documentData.type == "Item") {
console.log("Drop done !!!", bar, documentData, slot) let item = fromUuidSync(documentData.uuid)
let item = documentData.data if (item == undefined) {
let command = `game.bol.BoLHotbar.rollMacro("${item.name}", "${item.type}");` item = this.actor.items.get(documentData.uuid)
let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command))
if (!macro) {
macro = await Macro.create({
name: item.name,
type: "script",
img: item.img,
command: command
}, { displaySheet: false })
} }
game.user.assignHotbarMacro(macro, slot); if (item && (item.system.subtype === "weapon" || item.system.category === "spell")) {
} this.assignToHotBar( item, slot )
// Create a macro to open the actor sheet of the actor dropped on the hotbar return false
else if (documentData.type == "Actor") {
let actor = game.actors.get(documentData.id);
let command = `game.actors.get("${documentData.id}").sheet.render(true)`
let macro = game.macros.contents.find(m => (m.name === actor.name) && (m.command === command));
if (!macro) {
macro = await Macro.create({
name: actor.data.name,
type: "script",
img: actor.data.img,
command: command
}, { displaySheet: false })
game.user.assignHotbarMacro(macro, slot);
} }
} }
// Create a macro to open the journal sheet of the journal dropped on the hotbar return true
else if (documentData.type == "JournalEntry") { })
let journal = game.journal.get(documentData.id);
let command = `game.journal.get("${documentData.id}").sheet.render(true)`
let macro = game.macros.contents.find(m => (m.name === journal.name) && (m.command === command));
if (!macro) {
macro = await Macro.create({
name: journal.data.name,
type: "script",
img: "systems/bol/icons/images/icone_parchement_vierge.webp",
command: command
}, { displaySheet: false })
game.user.assignHotbarMacro(macro, slot);
}
}
return false;
});
} }
/** Roll macro */ /** Roll macro */
@ -76,10 +56,10 @@ export class BoLHotbar {
return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`) return ui.notifications.warn(`Impossible de trouver l'objet de cette macro`)
} }
// Trigger the item roll // Trigger the item roll
if (item.data.data.category === "equipment" && item.data.data.subtype === "weapon") { if (item.system.category === "equipment" && item.system.subtype === "weapon") {
return BoLRoll.weaponCheckWithWeapon( actor, item) return BoLRoll.weaponCheckWithWeapon( actor, item)
} }
if (item.data.data.category === "spell") { if (item.system.category === "spell") {
return BoLRoll.spellCheckWithSpell( actor, item) return BoLRoll.spellCheckWithSpell( actor, item)
} }
} }

View File

@ -18,7 +18,7 @@ export class BoLUtility {
default: true, default: true,
type: Boolean, type: Boolean,
onChange: lang => window.location.reload() onChange: lang => window.location.reload()
}); })
game.settings.register("bol", "useBougette", { game.settings.register("bol", "useBougette", {
name: "Utiliser la Bougette (règle fan-made)", name: "Utiliser la Bougette (règle fan-made)",
hint: "Utilise un indicateur de Bougette, comme décrit dans l'aide de jeu Gold&Glory du RatierBretonnien (https://www.lahiette.com/leratierbretonnien/)", hint: "Utilise un indicateur de Bougette, comme décrit dans l'aide de jeu Gold&Glory du RatierBretonnien (https://www.lahiette.com/leratierbretonnien/)",
@ -27,14 +27,32 @@ export class BoLUtility {
default: false, default: false,
type: Boolean, type: Boolean,
onChange: lang => window.location.reload() onChange: lang => window.location.reload()
}); })
game.settings.register("bol", "logoActorSheet", {
name: "Chemin du logo des fiches de perso",
hint: "Vous pouvez changer le logo BoL des fiches de perso, pour jouer dans un autre univers (idéalement 346 x 200, défaut : /systems/bol/ui/logo.webp)",
scope: "world",
config: true,
default: "/systems/bol/ui/logo.webp",
type: String,
onChange: lang => window.location.reload()
})
game.settings.register("bol", "logoTopLeft", {
name: "Chemin du logo haut gauche",
hint: "Vous pouvez changer le logo BoL en haut à gauche de chaque écran (idéalement 718 x 416, défaut : /systems/bol/ui/logo2.webp)",
scope: "world",
config: true,
default: "/systems/bol/ui/logo2.webp",
type: String,
onChange: lang => window.location.reload()
})
this.rollArmor = game.settings.get("bol", "rollArmor") // Roll armor or not this.rollArmor = game.settings.get("bol", "rollArmor") // Roll armor or not
this.useBougette = game.settings.get("bol", "useBougette") // Use optionnal bougette rules this.useBougette = game.settings.get("bol", "useBougette") // Use optionnal bougette rules
this.actorSheetLogo = game.settings.get("bol", "logoActorSheet") || "/systems/bol/ui/logo.webp"
this.logoTopLeft = game.settings.get("bol", "logoTopLeft") || "/systems/bol/ui/logo2.webp"
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getRollArmor() { static getRollArmor() {
return this.rollArmor return this.rollArmor
@ -43,9 +61,19 @@ export class BoLUtility {
static getUseBougette() { static getUseBougette() {
return this.useBougette return this.useBougette
} }
/* -------------------------------------------- */
static getLogoActorSheet() {
return this.actorSheetLogo
}
/* -------------------------------------------- */
static getLogoTopLeft() {
return this.logoTopLeft
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static async ready() { static async ready() {
//$("#logo").attr("src", this.getLogoTopLeft() )
$("#logo").css("content",`url(${this.getLogoTopLeft()})`)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -63,12 +91,12 @@ export class BoLUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static storeRoll(roll) { static storeRoll(roll) {
this.lastRoll = roll this.rollTab[roll.id] = roll
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getLastRoll() { static getRoll(rollId) {
return this.lastRoll return this.rollTab[roll.id]
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -127,16 +155,16 @@ export class BoLUtility {
return undefined; return undefined;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getOtherWhisperRecipients( name) { static getOtherWhisperRecipients(name) {
let users = [] let users = []
for( let user of game.users) { for (let user of game.users) {
if ( !user.isGM && user.name != name) { if (!user.isGM && user.name != name) {
users.push( user.data._id) users.push(user.id)
} }
} }
return users return users
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static getWhisperRecipientsAndGMs(name) { static getWhisperRecipientsAndGMs(name) {
let recep1 = ChatMessage.getWhisperRecipients(name) || []; let recep1 = ChatMessage.getWhisperRecipients(name) || [];
@ -173,35 +201,47 @@ export class BoLUtility {
//console.log("FOUND 1!!! ", actor) //console.log("FOUND 1!!! ", actor)
if (actor && actor.isOwner) return if (actor && actor.isOwner) return
else if (game.user.isGM || data.author.id === game.user.id) return else if (game.user.isGM || data.author.id === game.user.id) return
const divButtons = chatCard.find('.actions-section') const divButtons = chatCard.find('.actions-section')
console.log("FOUND 2!! ", divButtons)
divButtons.hide() divButtons.hide()
} }
} }
/* -------------------------------------------- */
static getRollDataFromMessage(event) {
let messageId = BoLUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
return message.getFlag("world", "bol-roll-data")
}
/* -------------------------------------------- */
static cleanupButtons(id) {
$(`#${id}`).hide() // Hide the options roll buttons
game.socket.emit("system.bol", { name: "msg_cleanup_buttons", data: { id: id } })
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static async chatListeners(html) { static async chatListeners(html) {
// Damage handling // Damage handling
html.on("click", '.chat-damage-apply', event => { html.on("click", '.chat-damage-apply', event => {
let rollData = BoLUtility.getLastRoll() let rollData = BoLUtility.getRollDataFromMessage(event)
$(`#${rollData.applyId}`).hide() BoLUtility.cleanupButtons(rollData.applyId)
BoLUtility.sendAttackSuccess(rollData) BoLUtility.sendAttackSuccess(rollData)
}); });
html.on("click", '.chat-damage-roll', event => { html.on("click", '.chat-damage-roll', event => {
event.preventDefault(); event.preventDefault()
let rollData = BoLUtility.getLastRoll() let rollData = BoLUtility.getRollDataFromMessage(event)
rollData.damageMode = event.currentTarget.attributes['data-damage-mode'].value; rollData.damageMode = event.currentTarget.attributes['data-damage-mode'].value
let bolRoll = new BoLDefaultRoll(rollData) let bolRoll = new BoLDefaultRoll(rollData)
bolRoll.rollDamage() bolRoll.rollDamage()
}); });
html.on("click", '.transform-legendary-roll', event => { html.on("click", '.transform-legendary-roll', event => {
event.preventDefault(); event.preventDefault();
let rollData = BoLUtility.getLastRoll() let rollData = BoLUtility.getRollDataFromMessage(event)
let actor = game.actors.get( rollData.actorId) let actor = game.actors.get(rollData.actorId)
actor.subHeroPoints(1) actor.subHeroPoints(1)
let r = new BoLDefaultRoll(rollData) let r = new BoLDefaultRoll(rollData)
r.upgradeToLegendary() r.upgradeToLegendary()
@ -209,8 +249,8 @@ export class BoLUtility {
html.on("click", '.transform-heroic-roll', event => { html.on("click", '.transform-heroic-roll', event => {
event.preventDefault(); event.preventDefault();
let rollData = BoLUtility.getLastRoll() let rollData = BoLUtility.getRollDataFromMessage(event)
let actor = game.actors.get( rollData.actorId) let actor = game.actors.get(rollData.actorId)
actor.subHeroPoints(1) actor.subHeroPoints(1)
let r = new BoLDefaultRoll(rollData) let r = new BoLDefaultRoll(rollData)
r.upgradeToHeroic() r.upgradeToHeroic()
@ -218,8 +258,8 @@ export class BoLUtility {
html.on("click", '.hero-reroll', event => { html.on("click", '.hero-reroll', event => {
event.preventDefault(); event.preventDefault();
let rollData = BoLUtility.getLastRoll() let rollData = BoLUtility.getRollDataFromMessage(event)
let actor = game.actors.get( rollData.actorId) let actor = game.actors.get(rollData.actorId)
actor.subHeroPoints(1) actor.subHeroPoints(1)
rollData.reroll = false // Disable reroll option for second roll rollData.reroll = false // Disable reroll option for second roll
let r = new BoLDefaultRoll(rollData) let r = new BoLDefaultRoll(rollData)
@ -231,24 +271,24 @@ export class BoLUtility {
let attackId = event.currentTarget.attributes['data-attack-id'].value let attackId = event.currentTarget.attributes['data-attack-id'].value
let defenseMode = event.currentTarget.attributes['data-defense-mode'].value let defenseMode = event.currentTarget.attributes['data-defense-mode'].value
let weaponId = (event.currentTarget.attributes['data-weapon-id']) ? event.currentTarget.attributes['data-weapon-id'].value : -1 let weaponId = (event.currentTarget.attributes['data-weapon-id']) ? event.currentTarget.attributes['data-weapon-id'].value : -1
// Remove message for all
let msgId = BoLUtility.findChatMessageId(event.currentTarget)
if (game.user.isGM) { if (game.user.isGM) {
console.log("Process handling !!! -> GM direct damage handling") BoLUtility.processDamageHandling(attackId, defenseMode, weaponId, msgId)
BoLUtility.processDamageHandling(event, attackId, defenseMode, weaponId)
} else { } else {
console.log("Process handling !!! -> socket emit") game.socket.emit("system.bol", { name: "msg_damage_handling", data: { msgId: msgId, attackId: attackId, defenseMode: defenseMode, weaponId: weaponId } })
game.socket.emit("system.bol", { name: "msg_damage_handling", data: { event: event, attackId: attackId, defenseMode: defenseMode, weaponId: weaponId } });
} }
}); })
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async processDamageHandling(event, attackId, defenseMode, weaponId = -1) { static async processDamageHandling(attackId, defenseMode, weaponId = -1, msgId) {
if (!game.user.isGM) { if (!game.user.isGM) {
return; return
} }
BoLUtility.removeChatMessageId(BoLUtility.findChatMessageId(event.currentTarget)); BoLUtility.removeChatMessageId( msgId )
console.log("Damage Handling", attackId, defenseMode, weaponId)
console.log("Damage Handling", event, attackId, defenseMode, weaponId)
// Only GM process this // Only GM process this
let attackDef = this.attackStore[attackId] let attackDef = this.attackStore[attackId]
if (attackDef && attackDef.defenderId) { if (attackDef && attackDef.defenderId) {
@ -256,54 +296,70 @@ export class BoLUtility {
return return
} // ?? Why ??? } // ?? Why ???
attackDef.defenseDone = true attackDef.defenseDone = true
attackDef.defenseMode = defenseMode; attackDef.defenseMode = defenseMode
let defender = game.actors.get(attackDef.defenderId) let token = game.scenes.current.tokens.get(attackDef.targetId)
let defender = token.actor
if (defenseMode == 'damage-with-armor') { if (defenseMode == 'damage-with-armor') {
let armorFormula = defender.getArmorFormula() let armorFormula = defender.getArmorFormula()
attackDef.rollArmor = new Roll(armorFormula) attackDef.rollArmor = new Roll(armorFormula)
attackDef.rollArmor.roll( { async: false } ) attackDef.rollArmor.roll({ async: false })
console.log("Armor roll ", attackDef.rollArmor) attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total
attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total; attackDef.finalDamage = attackDef.damageTotal - attackDef.armorProtect
attackDef.finalDamage = attackDef.damageRoll.total - attackDef.armorProtect; attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage
attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage; defender.sufferDamage(attackDef.finalDamage)
defender.sufferDamage(attackDef.finalDamage); console.log("Armor roll -> result ", attackDef)
} }
if (defenseMode == 'damage-without-armor') { if (defenseMode == 'damage-without-armor') {
attackDef.finalDamage = attackDef.damageRoll.total; attackDef.finalDamage = attackDef.damageTotal
defender.sufferDamage(attackDef.finalDamage); defender.sufferDamage(attackDef.finalDamage)
} }
if (defenseMode == 'hero-reduce-damage') { if (defenseMode == 'hero-reduce-damage') {
let armorFormula = defender.getArmorFormula(); let armorFormula = defender.getArmorFormula()
attackDef.rollArmor = new Roll(armorFormula) attackDef.rollArmor = new Roll(armorFormula)
attackDef.rollArmor.roll({ async: false }); attackDef.rollArmor.roll({ async: false })
attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total; attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total
attackDef.rollHero = new Roll("1d6"); attackDef.rollHero = new Roll("1d6")
attackDef.rollHero.roll({ async: false }); attackDef.rollHero.roll({ async: false })
attackDef.finalDamage = attackDef.damageRoll.total - attackDef.rollHero.total - attackDef.armorProtect; attackDef.finalDamage = attackDef.damageTotal - attackDef.rollHero.total - attackDef.armorProtect
attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage; attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage
defender.sufferDamage(attackDef.finalDamage); defender.sufferDamage(attackDef.finalDamage)
defender.subHeroPoints(1); defender.subHeroPoints(1)
} }
if (defenseMode == 'hero-in-extremis') { if (defenseMode == 'hero-in-extremis') {
attackDef.finalDamage = 0; attackDef.finalDamage = 0;
attackDef.weaponHero = defender.weapons.find(item => item._id == weaponId); attackDef.weaponHero = defender.weapons.find(item => item._id == weaponId);
defender.deleteEmbeddedDocuments("Item", [weaponId]); defender.deleteEmbeddedDocuments("Item", [weaponId]);
} }
let defenderUser
for (let user of game.users) {
if ( user.character && user.character.id == defender.id ) {
defenderUser = user
}
}
let damageResults = {
attackId: attackDef.id,
attacker: attackDef.attacker,
rollArmor: attackDef.rollArmor,
rollHero: attackDef.rollHero,
weaponHero: attackDef.weaponHero,
armorProtect: attackDef.armorProtect,
name: defender.name,
defender: defender,
defenseMode: attackDef.defenseMode,
finalDamage: attackDef.finalDamage
}
ChatMessage.create({ ChatMessage.create({
alias: defender.name, alias: defender.name,
whisper: BoLUtility.getWhisperRecipientsAndGMs(defender.name), whisper: BoLUtility.getWhisperRecipientsAndGMs(defender.name),
content: await renderTemplate('systems/bol/templates/chat/rolls/defense-result-card.hbs', { content: await renderTemplate('systems/bol/templates/chat/rolls/defense-result-card.hbs', damageResults)
attackId: attackDef.id, })
attacker: attackDef.attacker, console.log("Defender data : ", defenderUser)
rollArmor: attackDef.rollArmor, ChatMessage.create({
rollHero: attackDef.rollHero, alias: defender.name,
weaponHero: attackDef.weaponHero, whisper: BoLUtility.getOtherWhisperRecipients(defenderUser?.name),
armorProtect: attackDef.armorProtect, content: await renderTemplate('systems/bol/templates/chat/rolls/defense-summary-card.hbs', damageResults)
defender: defender,
defenseMode: attackDef.defenseMode,
finalDamage: attackDef.finalDamage
})
}) })
} }
} }
@ -386,8 +442,8 @@ export class BoLUtility {
} }
// Build and send the defense message to the relevant people (ie GM + defender) // Build and send the defense message to the relevant people (ie GM + defender)
let defender = game.actors.get(attackDef.defenderId) let defender = game.actors.get(attackDef.defenderId)
let defenderWeapons = defender.weapons console.log("DEF WEP", attackDef, defender)
console.log("DEF WEP", attackDef) let defenderWeapons = defender.weapons || []
this.attackStore[attackDef.id] = attackDef // Store ! this.attackStore[attackDef.id] = attackDef // Store !
ChatMessage.create({ ChatMessage.create({
alias: defender.name, alias: defender.name,
@ -408,15 +464,18 @@ export class BoLUtility {
if (sockmsg.name == "msg_attack_success") { if (sockmsg.name == "msg_attack_success") {
BoLUtility.processAttackSuccess(sockmsg.data) BoLUtility.processAttackSuccess(sockmsg.data)
} }
if (sockmsg.name == "msg_cleanup_buttons") {
$(`#${sockmsg.data.id}`).hide() // Hide the options roll buttons
}
if (sockmsg.name == "msg_damage_handling") { if (sockmsg.name == "msg_damage_handling") {
BoLUtility.processDamageHandling(sockmsg.data.event, sockmsg.data.attackId, sockmsg.data.defenseMode) BoLUtility.processDamageHandling(sockmsg.data.attackId, sockmsg.data.defenseMode, sockmsg.data.weaponId, sockmsg.data.msgId)
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static computeSpellCost(spell, nbOptCond = 0) { static computeSpellCost(spell, nbOptCond = 0) {
let pp = spell.data.data.properties.ppcost let pp = spell.data.properties.ppcost
let minpp = __circle2minpp[spell.data.data.properties.circle] let minpp = __circle2minpp[spell.data.properties.circle]
pp = (pp - nbOptCond < minpp) ? minpp : pp - nbOptCond pp = (pp - nbOptCond < minpp) ? minpp : pp - nbOptCond
return pp return pp
} }
@ -441,11 +500,11 @@ export class BoLUtility {
let postForm = 'kh' + nbDice let postForm = 'kh' + nbDice
let modIndex = 3 let modIndex = 3
// Upgrade damage if needed // Upgrade damage if needed
if ( upgradeDamage && ( !res[3] || res[3]=="") ) { if (upgradeDamage && (!res[3] || res[3] == "")) {
res[3] = "B" // Upgrade to bonus res[3] = "B" // Upgrade to bonus
} }
if (res[3]) { if (res[3]) {
if ( upgradeDamage && res[3] == 'M') { if (upgradeDamage && res[3] == 'M') {
res[3] = "" // Disable lamlus for upgradeDamage res[3] = "" // Disable lamlus for upgradeDamage
} }
if (res[3] == 'M') { if (res[3] == 'M') {
@ -453,11 +512,21 @@ export class BoLUtility {
nbDice++ nbDice++
modIndex = 4 modIndex = 4
} }
if (res[3] == 'MM') {
postForm = 'kl' + nbDice
nbDice += 2
modIndex = 4
}
if (res[3] == 'B') { if (res[3] == 'B') {
postForm = 'kh' + nbDice postForm = 'kh' + nbDice
nbDice++ nbDice++
modIndex = 4 modIndex = 4
} }
if (res[3] == 'BB') {
postForm = 'kh' + nbDice
nbDice += 2
modIndex = 4
}
} }
formula = "(" + nbDice + "d" + res[2] + reroll + postForm + "+" + modifier + ") *" + multiplier formula = "(" + nbDice + "d" + res[2] + reroll + postForm + "+" + modifier + ") *" + multiplier
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,17 +1,17 @@
{"name":"Pinxi","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.yRWlUr9BF1gr0hAe"}},"_id":"4CZOPpGP1YzYGLSB"} {"_id":"4CZOPpGP1YzYGLSB","name":"Pinxi","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>la langue des Xi Lu, encore commun&eacute;ment parl&eacute;e par cette ethnie, m&ecirc;me si la plupart des Xi&nbsp;Lu apprennent au moins des rudiments de gatha&iuml;, la langue officielle du gouvernement du grand khan.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.yRWlUr9BF1gr0hAe"}}}
{"name":"Céruléen","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.2dZ1OrZgx6M47jl5"}},"_id":"61dDXTOhyN3VLHny"} {"_id":"61dDXTOhyN3VLHny","name":"Céruléen","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>Les nomades bleus parlent leur&nbsp;propre langue, qui n&rsquo;a pas de forme &eacute;crite. Les&nbsp;marchands d&rsquo;Oomis apprennent souvent le&nbsp;c&eacute;rul&eacute;en.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.2dZ1OrZgx6M47jl5"}}}
{"name":"Yggdari","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.emz8WuzZsArE0v2U"}},"_id":"8LKy7DkKy8Cd3QuX"} {"_id":"8LKy7DkKy8Cd3QuX","name":"Yggdari","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>C&rsquo;est le nom de l&rsquo;ancienne langue des&nbsp;hommes (aussi appel&eacute;e langue des Anciens). Peu&nbsp;d&rsquo;individus la parlent aujourd&rsquo;hui, et encore moins&nbsp;peuvent la lire. Il arrive cependant que d&rsquo;antiques&nbsp;textes soient retrouv&eacute;s dans les ruines d&rsquo;Ygddar,&nbsp;de Qiddesh, de Qeb, de Qar ou d&rsquo;Oosal, mais leur&nbsp;traduction requiert g&eacute;n&eacute;ralement les services d&rsquo;un&nbsp;scribe particuli&egrave;rement comp&eacute;tent.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.emz8WuzZsArE0v2U"}}}
{"name":"Beshaari","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.kzOlopZyDtVZHqca"}},"_id":"9PDA54isBWhIFGqw"} {"_id":"9PDA54isBWhIFGqw","name":"Beshaari","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>Les nomades du d&eacute;sert de Beshaar&nbsp;parlent et &eacute;crivent leur propre langue. La plupart&nbsp;des habitants d&rsquo;Halakh parlent le beshaari en plus&nbsp;du l&eacute;murien.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.kzOlopZyDtVZHqca"}}}
{"name":"Chant du Vent","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.Q9oqF2G0xqPzS08z"}},"_id":"AiG20gJfHhxWNF5v"} {"_id":"AiG20gJfHhxWNF5v","name":"Chant du Vent","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>La langue chantante des&nbsp;hommes-oiseaux peut &eacute;voquer tour &agrave; tour le son&nbsp;de la brise se faufilant entre les rochers escarp&eacute;s&nbsp;des sommets et le sifflement des bourrasques&nbsp;s&rsquo;engouffrant dans les canyons montagneux et les&nbsp;cavernes. Cette langue est tr&egrave;s difficile &agrave; parler&nbsp;correctement pour un &eacute;tranger. Elle poss&egrave;de une&nbsp;forme &eacute;crite, qui est tout aussi difficile &agrave; ma&icirc;triser&nbsp;et &agrave; traduire.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.Q9oqF2G0xqPzS08z"}}}
{"name":"Wei","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.yRWlUr9BF1gr0hAe"}},"_id":"LpdWKjWDblL4lVG8"} {"_id":"LpdWKjWDblL4lVG8","name":"Wei","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>Les Wei poss&egrave;dent leur propre langue, difficile &agrave; ma&icirc;triser pour des &eacute;trangers en raison de&nbsp;ses sonorit&eacute;s particuli&egrave;res, avec un emploi abondant de claquements de langue. Les Wei n&rsquo;ont pas&nbsp;d&rsquo;&eacute;criture ; leur culture repose sur la transmission orale des savoirs et des coutumes.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.yRWlUr9BF1gr0hAe"}}}
{"name":"Lemurien","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.XDWxHZYrzDyAKPrC"}},"_id":"RzrUDaHczkxVvk1b"} {"_id":"RzrUDaHczkxVvk1b","name":"Lemurien","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>La langue la plus commun&eacute;ment&nbsp;parl&eacute;e en L&eacute;murie. Chaque cit&eacute; parle cependant&nbsp;son propre dialecte l&eacute;murien, ce qui veut dire&nbsp;qu&rsquo;un voyageur aura parfois du mal &agrave; comprendre&nbsp;les gens du coin. Le MJ pourra &agrave; l&rsquo;occasion vous&nbsp;demander de r&eacute;ussir un jet d&rsquo;esprit pour communiquer avec des gens d&rsquo;autres cit&eacute;s que la v&ocirc;tre.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.XDWxHZYrzDyAKPrC"}}}
{"name":"Malakutien","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.8PUJGWZtZeARrV5C"}},"_id":"SlDoVbJ5ndxbDVFR"} {"_id":"SlDoVbJ5ndxbDVFR","name":"Malakutien","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>Lles habitants de Malakut et de la&nbsp;r&eacute;gion environnante parlent leur propre langue.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.8PUJGWZtZeARrV5C"}}}
{"name":"Valgardien","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.Kqy1EMnW5cygirUn"}},"_id":"Td6HDtdzJ2nlGDWa"} {"_id":"Td6HDtdzJ2nlGDWa","name":"Valgardien","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>Les gens du Valgard parlent et&nbsp;&eacute;crivent leur propre langue, qui est &eacute;tonnamment&nbsp;&eacute;labor&eacute;e.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.Kqy1EMnW5cygirUn"}}}
{"name":"Festroli","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.0qYsNoL6d0rhLPKl"}},"_id":"cqJnm3azUpN4GiD5"} {"_id":"cqJnm3azUpN4GiD5","name":"Festreli","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>A l&rsquo;origine, le festreli &eacute;tait un dialecte&nbsp;du l&eacute;murien, mais il s&rsquo;en est tellement &eacute;loign&eacute;&nbsp;qu&rsquo;il est &agrave; pr&eacute;sent devenu presque inintelligible&nbsp;pour des locuteurs du l&eacute;murien.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.0qYsNoL6d0rhLPKl"}}}
{"name":"Shamite","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.hDyBLMY9ZDkcKEBs"}},"_id":"dyJoULpfzwZMlJrr"} {"_id":"dyJoULpfzwZMlJrr","name":"Shamite","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>Les habitants de Shamballah et de la&nbsp;r&eacute;gion environnante parlent leur propre langue.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.hDyBLMY9ZDkcKEBs"}}}
{"name":"Axien","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.b0e4uZzlo4DFP2gv"}},"_id":"nMboUYMjDqzfASMM"} {"_id":"nMboUYMjDqzfASMM","name":"Axien","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>L&rsquo;axien est la langue des tribus barbares qui vivent dans la cha&icirc;ne de l&rsquo;Axos. Cette langue reste plut&ocirc;t confin&eacute;e &agrave; cette r&eacute;gion montagneuse,&nbsp;&nbsp;mais on raconte que d&rsquo;anciens textes datant de l&rsquo;&eacute;poque lointaine o&ugrave; l&rsquo;axien &eacute;tait plus largement&nbsp;r&eacute;pandu seraient entrepos&eacute;s dans des grottes&nbsp;oubli&eacute;es au c&oelig;ur des montagnes.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.b0e4uZzlo4DFP2gv"}}}
{"name":"Kashtien","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.RWHkb4OkXhZfURmw"}},"_id":"pUaLtMJVL0xhy2GM"} {"_id":"pUaLtMJVL0xhy2GM","name":"Kashtien","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>Les habitants des marais de Kasht&nbsp;ont leur propre langue, dont chaque tribu utilise&nbsp;une variante qui lui est propre.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.RWHkb4OkXhZfURmw"}}}
{"name":"Argot des Mers","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.yRWlUr9BF1gr0hAe"}},"_id":"tXDz4UokSbGh6Rhw"} {"_id":"tXDz4UokSbGh6Rhw","name":"Argot des Mers","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>Les &icirc;les du Cr&acirc;ne, &agrave; la population&nbsp;h&eacute;t&eacute;roclite en provenance des quatre coins du&nbsp;monde, ont d&eacute;velopp&eacute; leur propre langue, un&nbsp;assemblage bigarr&eacute; d&rsquo;influences diverses. Il n&rsquo;en&nbsp;existe pas de forme &eacute;crite.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.yRWlUr9BF1gr0hAe"}}}
{"name":"Grooth","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.OpUZ9bTcD7k8iGd1"}},"_id":"u5RK8dQRbcwHtcbM"} {"_id":"u5RK8dQRbcwHtcbM","name":"Grooth","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>Il ne s&rsquo;agit pas d&rsquo;une langue &agrave;&nbsp;proprement parler, mais plut&ocirc;t d&rsquo;un langage&nbsp;rudimentaire fait de grognements, de grimaces,&nbsp;de tapements du pied et de grands mouvements&nbsp;simiesques. Ce langage n&rsquo;a pas de forme &eacute;crite et&nbsp;est totalement inusit&eacute; en dehors des tribus des&nbsp;grooth.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.OpUZ9bTcD7k8iGd1"}}}
{"name":"Ghatai","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.yRWlUr9BF1gr0hAe"}},"_id":"vaAQiuAHdyQrQiUX"} {"_id":"vaAQiuAHdyQrQiUX","name":"Ghatai","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>Langue des nomades du sud du Khanat, le ghata&iuml; s&rsquo;apparente &agrave; un dialecte ancien du&nbsp;l&eacute;murien, avec de nombreux emprunts au pinxi (cf. ci-dessous), pour le vocabulaire notamment. Avec&nbsp;un peu d&rsquo; effort et beaucoup de patience, un locuteur du l&eacute;murien sera en mesure de communiquer de&nbsp;mani&egrave;re rudimentaire avec des gens qui parlent le ghata&iuml;. Cette langue, qui &agrave; l&rsquo;origine ne poss&eacute;dait pas&nbsp;son propre syst&egrave;me d&rsquo;&eacute;criture, utilise d&eacute;sormais celui du pinxi.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.yRWlUr9BF1gr0hAe"}}}
{"name":"Démonique","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.fjq6EF5RN8JXr5vT"}},"_id":"zNHxODKXOL4LtYMe"} {"_id":"zNHxODKXOL4LtYMe","name":"Démonique","type":"feature","img":"icons/skills/social/diplomacy-handshake-gray.webp","data":{"category":null,"subtype":"language","description":"<p>C&rsquo;est l&rsquo;ancienne langue des Rois-&nbsp;Sorciers, dans laquelle sont r&eacute;dig&eacute;s tous les&nbsp;textes remontant &agrave; leur &eacute;poque. Les magiciens,&nbsp;alchimistes, druides et pr&ecirc;tres doivent apprendre&nbsp;le d&eacute;monique s&rsquo;ils veulent pouvoir utiliser les&nbsp;puissants sortil&egrave;ges et recettes alchimiques de&nbsp;cette antique race. Ce langage est particuli&egrave;rement&nbsp;ardu et ses formes orale et &eacute;crite exigent d&rsquo;&ecirc;tre&nbsp;apprises s&eacute;par&eacute;ment. Les magiciens de Zalut&nbsp;conversent toujours en d&eacute;monique, &agrave; moins de&nbsp;devoir parler &agrave; des &eacute;trangers.</p>","properties":{},"rank":0},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.fjq6EF5RN8JXr5vT"}}}

42
packs/objets-alchimie.db Normal file
View File

@ -0,0 +1,42 @@
{"name":"Serrure ou piège élaboré","type":"item","img":"icons/environment/traps/saw-steel.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>-4 pour les&nbsp;crocheter/d&eacute;samorcer ; un pi&egrave;ge inflige d6+1&nbsp;points de d&eacute;g&acirc;ts</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"0Yhn3r8AFsKXEKeS"}
{"name":"Lance-éclair","type":"item","img":"icons/weapons/crossbows/handcrossbow-green.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>une arme qui a vaguement&nbsp;la forme d&rsquo;une arbal&egrave;te et projette un &eacute;clair.&nbsp;Facteur de port&eacute;e : 75 m ; d6 x2 points de&nbsp;d&eacute;g&acirc;ts ignorant les armure</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"1JMT3kjaWSP8umZ4"}
{"name":"Armure Mythique","type":"item","img":"icons/equipment/chest/breastplate-helmet-metal.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>comme une armure&nbsp;l&eacute;gendaire, mais sans malus d&rsquo;agilit&eacute; ; un&nbsp;h&eacute;ros pourrait m&ecirc;me nager en portant cette&nbsp;armure</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"1VKW5IwOhopbnD70"}
{"name":"Horloge","type":"item","img":"icons/sundries/misc/hourglass-wood.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"2vB2YGtQUh2Uv1Fm"}
{"name":"Habitation intelligente","type":"item","img":"icons/environment/settlement/hut.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"4loLeFR0iwfUnPuK"}
{"name":"Création par croisement et hybridation de plantes ou danimaux mortellement dangereux","type":"item","img":"icons/commodities/flowers/cornflower-gold.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"4siOagfdWzjP5zH7"}
{"name":"Substance chimique luminescente","type":"item","img":"icons/consumables/potions/flask-corked-yellow-glow.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>produit&nbsp;de la lumi&egrave;re pour une demi-journ&eacute;e</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"4tw89CLuUKdEPTjP"}
{"name":"Ceinture dallanium","type":"item","img":"icons/equipment/waist/belt-buckle-spiral-blue.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>permet de flotter dans&nbsp;les airs</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"5mTphkODHSGq3nSQ"}
{"name":"Outil","type":"item","img":"icons/tools/hand/hammer-mason-white-grey.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>Les armes et armures de cette qualit&eacute;&nbsp;permettent, une fois par round, de relancer un 1&nbsp;obtenu sur un jet de d&eacute;g&acirc;ts/de protection.</p>\n<p>En dehors des armes, les autres cr&eacute;ations&nbsp;infligeant des d&eacute;g&acirc;ts ou soignant des blessures&nbsp;provoquent respectivement la perte ou la&nbsp;r&eacute;cup&eacute;ration de d3 points de vitalit&eacute;.</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"9Q5RVK5vLFffDzbF"}
{"name":"Allume-feu","type":"item","img":"icons/tools/laboratory/bowl-liquid-orange.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>permet d&rsquo;allumer un feu&nbsp;facilement et rapidement</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"BPWbng0g7yGicbo1"}
{"name":"Membre Artificiel","type":"item","img":"icons/commodities/biological/hand-yellow-red.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>non articul&eacute;, mais bien&nbsp;plus &eacute;l&eacute;gant qu&rsquo;un simple crochet</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"IuRy0AzysqvPBitL"}
{"name":"Arme","type":"item","img":"icons/weapons/swords/greatsword-crossguard-engraved-green.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>Les armes et armures de cette qualit&eacute;&nbsp;permettent, une fois par round, de relancer un 1&nbsp;obtenu sur un jet de d&eacute;g&acirc;ts/de protection.</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"J4dFYrwkmlm0Nmk3"}
{"name":"Arme dissimulée dans un Objet Courant","type":"item","img":"icons/weapons/fist/fist-katar-gold.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>En dehors des armes, les autres cr&eacute;ations&nbsp;infligeant des d&eacute;g&acirc;ts ou soignant des blessures&nbsp;provoquent respectivement la perte ou la&nbsp;r&eacute;cup&eacute;ration de d6 points de vitalit&eacute;.</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"JaB3ain6oqdYMHO5"}
{"name":"Création de formes de vie hybrides dhomme et danimal","type":"item","img":"icons/creatures/magical/humanoid-silhouette-green.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"KNww1UqQ5xDsoipn"}
{"name":"Antirouille","type":"item","img":"icons/tools/laboratory/bowl-liquid-black.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>quantit&eacute; suffisante pour &ocirc;ter la&nbsp;rouille d&rsquo;une armure compl&egrave;te</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"KlbAhlqMv2aYrVV6"}
{"name":"Cuve de clonage des individus","type":"item","img":"icons/creatures/magical/humanoid-silhouette-aliens-green.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"LDpAggSZbGqrXmlw"}
{"name":"Armure","type":"item","img":"icons/equipment/chest/breastplate-scale-grey.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>Les armes et armures de cette qualit&eacute;&nbsp;permettent, une fois par round, de relancer un 1&nbsp;obtenu sur un jet de d&eacute;g&acirc;ts/de protection.</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"NOeeuqGt5sRZzjZW"}
{"name":"Huile Brulante","type":"item","img":"icons/tools/laboratory/bowl-powder-purple.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>br&ucirc;le au contact et inflige d6&nbsp;points de d&eacute;g&acirc;ts</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"NsWmlAIAiDgaOouM"}
{"name":"Ceinture dinvisibilité","type":"item","img":"icons/equipment/waist/belt-buckle-horned.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>quand on la boucle,&nbsp;cette ceinture offre le m&ecirc;me effet que la&nbsp;poudre d&rsquo;invisibilit&eacute;</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"RuW6v3YvbEE80rWv"}
{"name":"Armure Supérieure","type":"item","img":"icons/equipment/chest/breastplate-layered-leather-stitched.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>offre une protection&nbsp;semblable &agrave; celle d&rsquo;une armure de la cat&eacute;gorie&nbsp;sup&eacute;rieure &ndash; une armure l&eacute;g&egrave;re apporte la&nbsp;m&ecirc;me protection qu&rsquo;une armure moyenne, et&nbsp;une armure lourde apporte une protection de&nbsp;d6. De plus, l&rsquo;armure diminue de moiti&eacute; les&nbsp;d&eacute;g&acirc;ts suppl&eacute;mentaires inflig&eacute;s par un succ&egrave;s&nbsp;h&eacute;ro&iuml;que ou l&eacute;gendaire</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"WXGXDYvnGFqPznDW"}
{"name":"Arme Mythique","type":"item","img":"icons/weapons/swords/greatsword-evil-green.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>comme une arme l&eacute;gendaire,&nbsp;mais elle est de plus consid&eacute;r&eacute;e comme une&nbsp;arme favorite, cf. l&rsquo;avantage du m&ecirc;me nom</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"XLTcm3ZrC5f2obak"}
{"name":"Instrument de musique au son parfait","type":"item","img":"icons/tools/instruments/harp-gold-glowing.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>un d&eacute; de bonus pour en jouer</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"YZ9Pd2jmxmEf7Bfr"}
{"name":"Arme Légendaire","type":"item","img":"icons/weapons/swords/sword-guard-flanged-purple.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>ajoute un d&eacute; de bonus&nbsp;aux jets de d&eacute;g&acirc;ts et ignore les armures, &agrave;&nbsp; l&rsquo;exception de celles cr&eacute;&eacute;es par un alchimiste.&nbsp;De plus, l&rsquo;arme est incassable. Une arme aussi&nbsp;exceptionnelle se doit de recevoir un nom</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"Z16TTJJBk4gifNi4"}
{"name":"Serrure ou piège particulièrement ingénieux","type":"item","img":"icons/environment/traps/metal-spikes.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>-6 pour les crocheter/d&eacute;samorcer ; le pi&egrave;ge&nbsp;inflige d6 x2 points de d&eacute;g&acirc;ts</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"cH4xnb61y15y0VB9"}
{"name":"Microscope","type":"item","img":"icons/tools/scribal/magnifying-glass.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"czeLiVAATVSJXurP"}
{"name":"Dague à lame creuse en verre","type":"item","img":"icons/weapons/daggers/dagger-blue.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>remplie&nbsp;d&rsquo;acide ou de poison</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"dPjpAs6k4oJ1PBJY"}
{"name":"Serrure","type":"item","img":"icons/skills/trades/security-locksmith-key-gray.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>malus de -2 pour la forcer</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"eyhRUXzKxs5USWn4"}
{"name":"Création de formes de vie en laboratoire","type":"item","img":"icons/environment/creatures/bug-worm-teeth-green.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"g0LHWZNu9sSppfS1"}
{"name":"Armure Légendaire","type":"item","img":"icons/equipment/chest/breastplate-pieced-black-02.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>offre une protection&nbsp;semblable &agrave; celle d&rsquo;une armure de la cat&eacute;gorie&nbsp;sup&eacute;rieure &ndash; une armure l&eacute;g&egrave;re apporte la&nbsp;m&ecirc;me protection qu&rsquo;une armure moyenne, et&nbsp;une armure lourde apporte une protection de d6. De plus, le jet de protection de l&rsquo;armure&nbsp;se fait avec un d&eacute; de bonus, et elle diminue de&nbsp;moiti&eacute; les d&eacute;g&acirc;ts suppl&eacute;mentaires inflig&eacute;s par&nbsp;un succ&egrave;s h&eacute;ro&iuml;que ou l&eacute;gendaire.</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"ifyxS1mYVPrVva3D"}
{"name":"Machine Volante","type":"item","img":"icons/magic/air/wind-weather-sailing-ship.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>nef volante, par exemple</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"kGTTnSlZA6ZoQ3u3"}
{"name":"Télescope","type":"item","img":"icons/tools/navigation/spyglass-telescope-brass.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"ket3hVgoT0QwcBEq"}
{"name":"Arme Supérieure","type":"item","img":"icons/weapons/swords/greatsword-crossguard-flanged-purple.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>un d&eacute; de bonus aux jets de&nbsp;d&eacute;g&acirc;ts</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"ki1xuxtM0H4pgTiy"}
{"name":"Arbalète à Grappin","type":"item","img":"icons/weapons/crossbows/handcrossbow-black.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>tire un grappin attach&eacute;&nbsp;&agrave; une corde en soie avec un facteur de port&eacute;e&nbsp;de 7,5 m</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"kuypZbs1owvKVTqI"}
{"name":"Casque permettant à son porteur de respirer sous leau","type":"item","img":"icons/equipment/head/helm-spangen-ridged.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"lEfQUM98WsqLkIxz"}
{"name":"Périscope","type":"item","img":"icons/tools/scribal/magnifying-glass.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"mNOicjjxjXgZmmLy"}
{"name":"Serrure ou piège à la complexité unique","type":"item","img":"icons/commodities/tech/sensor-yellow.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>-8 pour les crocheter/d&eacute;samorcer ; un pi&egrave;ge&nbsp;inflige d6 x3 points de d&eacute;g&acirc;ts</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"oB6gDtBff0AxZ79M"}
{"name":"Machine dotée d'une semi-conscience","type":"item","img":"icons/creatures/magical/construct-iron-stomping-yellow.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"ok8HQzoEyF9GgSKA"}
{"name":"Automate ou golem ayant la forme dune armure animée","type":"item","img":"icons/magic/symbols/cog-orange-red.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"opFsywlBa1q9cb0z"}
{"name":"Navire submersible","type":"item","img":"icons/tools/navigation/sextant-brass-brown.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>un&nbsp; sous-marin&nbsp;descendant &agrave; une profondeur maximale de&nbsp;6 m&egrave;tres et pouvant emporter un &eacute;quipage&nbsp;de quatre personnes. Un tuyau flottant&nbsp;jusqu&rsquo;&agrave; la surface alimente le sous-marin&nbsp;en oxyg&egrave;ne (et peut &ecirc;tre rep&eacute;r&eacute; en surface).&nbsp;Le sous-marin contient suffisamment d&rsquo;air&nbsp;pour rester en plong&eacute;e pendant une heure. Il&nbsp;se d&eacute;place &agrave; une vitesse d&rsquo;environ 8 kilom&egrave;tres&nbsp;&agrave; l&rsquo;heure, propuls&eacute; par la force des membres&nbsp;de l&rsquo;&eacute;quipage qui p&eacute;dalent pour faire tourner&nbsp;l&rsquo;h&eacute;lice</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"rg9EZ0jwe2ZdNrcJ"}
{"name":"Fabrication dallanium et de janium","type":"item","img":"icons/commodities/metal/ingot-engraved-gold.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"tcKKDzPjPqTA8doj"}
{"name":"Machine de guerre blindée","type":"item","img":"icons/commodities/tech/smoke-bomb-yellow.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"vWhFzHoi5H6kVeFM"}
{"name":"Piège","type":"item","img":"icons/environment/traps/trap-jaw-tan.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>malus de -2 pour le rep&eacute;rer et le&nbsp;d&eacute;samorcer ; inflige d3+1 points de d&eacute;g&acirc;t</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"xVWrSPiX0Nwccsn6"}

37
packs/potions-alchimie.db Normal file
View File

@ -0,0 +1,37 @@
{"name":"Prouesse","type":"item","img":"icons/consumables/potions/bottle-corked-blue.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>un d&eacute; de bonus aux jets d&rsquo;attaque de&nbsp;corps &agrave; corps ; dur&eacute;e : une sc&egrave;ne</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"0a8UFoCOd3D35WBb"}
{"name":"Immortalité","type":"item","img":"icons/consumables/potions/bottle-conical-corked-labeled-skull-poison-green.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>Pr&eacute;vient toute mort naturelle.&nbsp;Le buveur vieillit lentement, en se dess&eacute;chant&nbsp;au fil des si&egrave;cles. Seule une mort violente peut&nbsp;l&rsquo; emporter.</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"1CGNqrAk8i4yZHMu"}
{"name":"Alcool de Qualité","type":"item","img":"icons/consumables/drinks/wine-amphora-clay-gray.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>3 bouteilles</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"1","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"3axZyF07LhrFoIKn"}
{"name":"Sommeil Instantané","type":"item","img":"icons/consumables/potions/conical-ornate-purple.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>le buveur doit r&eacute;ussir un&nbsp;jet de vigueur avec votre rang d&rsquo;alchimiste en&nbsp;malus, ou sombrer dans un profond sommeil&nbsp;pendant une demi-journ&eacute;e.</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"3d31dycrddqS41oH"}
{"name":"Feu Alchimique","type":"item","img":"icons/consumables/potions/flask-corked-red-glow.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>une fiole qui, quand elle est&nbsp;bris&eacute;e, explose en une boule de feu de 3 m de&nbsp;rayon, infligeant d6 x2 points de d&eacute;g&acirc;ts</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"3hbPr9YV5UFPT5xV"}
{"name":"Acide","type":"item","img":"icons/consumables/potions/vial-cork-green.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>1 petite fiole, inflige d3 points de&nbsp;d&eacute;g&acirc;ts ou peut percer 2,5 cm de bois ou de&nbsp;m&eacute;tal</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"9g9V7Khr66RkfqYp"}
{"name":"Beauté","type":"item","img":"icons/consumables/potions/bottle-pear-corked-pink.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>+1 en aura ; dur&eacute;e : une sc&egrave;ne</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"CZoAbYpw5V35ICsl"}
{"name":"Puissance","type":"item","img":"icons/consumables/potions/bottle-round-corked-orante-red.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>+1 en vigueur ; dur&eacute;e : une sc&egrave;ne</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"DPbSKaYROI8Ys2QL"}
{"name":"Somnifere","type":"item","img":"icons/consumables/potions/bottle-bulb-corked-green.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>A l&rsquo;ingestion, provoque 2d6 heures&nbsp;de sommeil profond, 3 doses</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{},"_id":"DukviN6iQWAZxvO6"}
{"name":"Antidote Universel","type":"item","img":"icons/consumables/potions/bottle-circular-corked-labeled-green.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>soigne instantan&eacute;ment&nbsp;n&rsquo;importe quel empoisonnement, m&ecirc;me&nbsp;magique ; 1 dose</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"DzNxbiCwykhOI8il"}
{"name":"Agrandissement ou Rapetissement","type":"item","img":"icons/consumables/potions/bottle-corked-red.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>Dur&eacute;e : 1 sc&egrave;ne</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"EScizWIAqEGey7k9"}
{"name":"Altération permanente","type":"item","img":"icons/consumables/potions/potion-jar-corked-labeled-purple-pink.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>bonus permanent&nbsp;de +1 dans un attribut ; on ne peut b&eacute;n&eacute;ficier&nbsp;qu&rsquo;une seule fois des effets de cet &eacute;lixir</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"EvAWKqbqVmOAiJuy"}
{"name":"Perspicacité","type":"item","img":"icons/consumables/potions/bottle-conical-corked-labeled-shell-cyan.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>+1 en esprit ; dur&eacute;e : une sc&egrave;ne</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"HzRud4Pt5prjxdOp"}
{"name":"Anti-Fièvre","type":"item","img":"icons/consumables/potions/bottle-ornate-bat-teal.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>2d6 heures d'effet, 3 doses</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"IwLxp7qwaVqFkXIT"}
{"name":"Illusion de la Jeunesse","type":"item","img":"icons/consumables/potions/flask-corked-blue.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>le buveur retrouve&nbsp;l&rsquo;apparence qu&rsquo;il avait &agrave; 25 ans ; dur&eacute;e : une&nbsp;semaine ; 1 dose</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"LgCquDfrRj68TpGD"}
{"name":"Résistance","type":"item","img":"icons/consumables/potions/potion-tube-corked-bat-gold-red.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>la peau du buveur devient aussi&nbsp;r&eacute;sistante qu&rsquo;une armure, lui offrant d6 de&nbsp;protection ; dur&eacute;e : une sc&egrave;ne ; 1 dose</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"OPg1rCpWtrMEwdpi"}
{"name":"Régénération Suprême","type":"item","img":"icons/consumables/potions/bottle-corked-blue.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>provoque &nbsp;la&nbsp;r&eacute;g&eacute;n&eacute;ration d&rsquo;un membre amput&eacute;, d&rsquo;un &oelig;il&nbsp;perdu, etc., annulant le d&eacute;savantage associ&eacute; &agrave;&nbsp;ce handicap</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"PCGayeKrqCe5y8Yr"}
{"name":"Paralysant","type":"item","img":"icons/consumables/potions/potion-bottle-corked-fancy-orange.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>le buveur doit r&eacute;ussir un jet de&nbsp;vigueur avec votre rang d&rsquo;alchimiste en malus&nbsp;ou se retrouver paralys&eacute; pour une dur&eacute;e de 24&nbsp;heures ; 1 dose</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"ROaHo4M8ry9J0no8"}
{"name":"Mort aux Rats","type":"item","img":"icons/consumables/potions/conical-mushroom-poison-red.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>Tue&nbsp; les&nbsp; petits&nbsp; animaux&nbsp;nuisibles</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"RYq5MG3t3r1yFsKZ"}
{"name":"Philtre damour","type":"item","img":"icons/consumables/potions/round-cork-leaf-green.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>le buveur doit r&eacute;ussir un jet&nbsp;d&rsquo;esprit avec votre rang d&rsquo;alchimiste en malus&nbsp;ou tomber follement amoureux ; dur&eacute;e : une&nbsp;lune ; 1 dose</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"RwLL4Ps54lMaUShO"}
{"name":"Poudre dinvisibilité","type":"item","img":"icons/consumables/potions/round-decorated-snake-green.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>rend invisible aux yeux&nbsp;d&rsquo;autrui, &agrave; moins d&rsquo;entreprendre une action&nbsp;qui attire l&rsquo;attention ; dur&eacute;e : une sc&egrave;ne</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"UBDnUINYuRk1MT67"}
{"name":"Antalgique","type":"item","img":"icons/consumables/potions/bottle-ornate-bat-teal.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>2d6 heures d'effet, 3 doses</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"1","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"UlDQi8b2L5nvdfar"}
{"name":"Sens Accrus","type":"item","img":"icons/consumables/potions/bottle-round-label-cork-blue.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>Un d&eacute; de bonus aux jets d&rsquo;action&nbsp;pour d&eacute;tecter ou rep&eacute;rer quelque chose ;&nbsp;dur&eacute;e : une sc&egrave;ne</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"aExkw1SAqQXQKfih"}
{"name":"Antidote contre les Venins Animaux et Poisons Végétaux","type":"item","img":"icons/consumables/potions/bottle-metal-yellow-gray.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>soigne l&rsquo; empoisonnement&nbsp;en 1 heure, 3 doses</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"cnOu9ysD1SLZ9s1d"}
{"name":"Répulsifs à Insecte","type":"item","img":"icons/consumables/potions/potion-tube-corked-orange.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>4d6 heures d&rsquo;effet, 3 doses</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"1","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"dadXiS7LGF9hsQFd"}
{"name":"Antidote aux Poisons Alchimiques","type":"item","img":"icons/consumables/potions/bottle-bulb-corked-labeled-blue.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>Soigne&nbsp;l&rsquo; empoisonnement en 1 heure, 3 doses</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"g2dZBvSyW8fUdmvi"}
{"name":"Neutralisant dacide","type":"item","img":"icons/consumables/potions/bottle-conical-corked-purple.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>stoppe instantan&eacute;ment&nbsp;les effets d&rsquo;une quantit&eacute; &eacute;quivalente d&rsquo;acide ;&nbsp;9 petites fioles</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"hSftVccCmrEhSYmc"}
{"name":"Teinture de respiration aquatique","type":"item","img":"icons/consumables/potions/potion-bottle-corked-blue.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>permet&nbsp;au buveur de respirer sous l&rsquo;eau pendant une&nbsp;demi-journ&eacute;e</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"iQnztmumTwpX8vbi"}
{"name":"Remède contre la Vérole","type":"item","img":"icons/consumables/potions/bottle-conical-corked-tied-blue.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"j0GkKyweP9tQGybn"}
{"name":"Métamorphose","type":"item","img":"icons/consumables/potions/bottle-bulb-corked-glowing-red.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>le buveur prend l&rsquo;apparence d&rsquo;une autre personne, pour une dur&eacute;e d&rsquo;une heure. N&eacute;cessite quelques cheveux, rognures&nbsp;d&rsquo;ongles, ou gouttes de sang de la personne en&nbsp;question ; 1 dose</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"lVVZdSHnxj7ISSoE"}
{"name":"Vivacité","type":"item","img":"icons/consumables/potions/bottle-round-label-cork-purple.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>+1 en agilit&eacute; ; dur&eacute;e : une sc&egrave;ne</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"m1TrGH7Y71bcsWvC"}
{"name":"Panacée","type":"item","img":"icons/consumables/potions/flask-decorated-label-pink.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>le buveur est gu&eacute;ri de n&rsquo;importe quelle maladie ; 2 doses</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"pBxSv3oC7qVdWk82"}
{"name":"Héroïsme","type":"item","img":"icons/consumables/potions/flask-corked-yellow-glow.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>le buveur b&eacute;n&eacute;ficie d&rsquo;un bonus de&nbsp;+1 &agrave; toutes ses aptitudes de combat ; dur&eacute;e :&nbsp;une sc&egrave;ne ; 1 dose</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"legend","difficulty":"-2","pccost":4,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"r4v0uPgUkeXiojMu"}
{"name":"Poudre de Phénix","type":"item","img":"icons/consumables/potions/potion-bottle-corked-labeled-red.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>une poudre qui br&ucirc;le au&nbsp;contact, m&ecirc;me sous l&rsquo; eau, en infligeant d6 x3&nbsp;points de d&eacute;g&acirc;ts</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"mythic","difficulty":"-4","pccost":8,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"seLHMb7EGeX5skWd"}
{"name":"Précision","type":"item","img":"icons/consumables/potions/bottle-conical-corked-yellow.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>un d&eacute; de bonus aux jets d&rsquo;attaque de&nbsp;tir ; dur&eacute;e : une sc&egrave;ne</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"scarce","difficulty":"-1","pccost":2,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"wxdS4VRUgiEZwteO"}
{"name":"Remède contre le Scorbut","type":"item","img":"icons/consumables/potions/bottle-conical-corked-tied-blue.webp","data":{"category":"alchemy","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"0","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"y84Et9OUilBgtqv6"}
{"name":"Encre Invisible","type":"item","img":"icons/commodities/materials/feather-blue.webp","data":{"category":"alchemy","subtype":"armor","description":"<p>R&eacute;appara&icirc;t quand elle est mouill&eacute;e ou chauff&eacute;e</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"alchemytype":"common","difficulty":"1","pccost":1,"pccurrent":0},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Item.my6uixIzYHN3qrzY"}},"_id":"y9NHZCxKXMZEqcRo"}

View File

View File

@ -1,24 +1,23 @@
{ {
"name": "bol", "id": "bol",
"title": "Barbarians of Lemuria", "title": "Barbarians of Lemuria",
"description": "The Barbarians of Lemuria system for FoundryVTT!", "description": "The Barbarians of Lemuria system for FoundryVTT!",
"author": "Zigmund,LeRatierBretonnien",
"authors": [ "authors": [
{ {
"name": "Zigmund" "name": "LeRatierBretonnien",
"flags": {}
}, },
{ {
"name": "LeRatierBretonnien" "name": "Zigmund",
"flags": {}
} }
], ],
"url": "https://github.com/ZigmundKreud/bol", "url": "https://www.uberwald.me/gitea/public/bol",
"license": "LICENSE.txt", "license": "LICENSE.txt",
"flags": {}, "version": "10.1.5",
"version": "1.3.5", "compatibility": {
"templateVersion": 10, "minimum": "10"
"minimumCoreVersion": "0.8.6", },
"compatibleCoreVersion": "9",
"scripts": [],
"esmodules": [ "esmodules": [
"module/bol.js" "module/bol.js"
], ],
@ -29,12 +28,20 @@
{ {
"lang": "en", "lang": "en",
"name": "English", "name": "English",
"path": "lang/en.json" "path": "lang/en.json",
"flags": {}
}, },
{ {
"lang": "fr", "lang": "fr",
"name": "Français", "name": "Français",
"path": "lang/fr.json" "path": "lang/fr.json",
"flags": {}
},
{
"lang": "de",
"name": "Deutsch",
"path": "lang/de.json",
"flags": {}
} }
], ],
"packs": [ "packs": [
@ -42,64 +49,64 @@
"name": "boons", "name": "boons",
"label": "Avantages", "label": "Avantages",
"system": "bol", "system": "bol",
"path": "./packs/boons.db", "path": "packs/boons.db",
"tag": "boon",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "boons", "name": "boonsflawscreatures",
"label": "Avantages/Désavantages de Créatures", "label": "Avantages/Désavantages de Créatures",
"system": "bol", "system": "bol",
"path": "./packs/boonsflawscreatures.db", "path": "packs/boonsflawscreatures.db",
"tag": "boon",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "flaws", "name": "flaws",
"label": "Désavantages", "label": "Désavantages",
"system": "bol", "system": "bol",
"path": "./packs/flaws.db", "path": "packs/flaws.db",
"tag": "flaw",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "careers", "name": "careers",
"label": "Carrières héroïques", "label": "Carrières héroïques",
"system": "bol", "system": "bol",
"path": "./packs/careers.db", "path": "packs/careers.db",
"tag": "career",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "origins", "name": "origins",
"label": "Origines", "label": "Origines",
"system": "bol", "system": "bol",
"path": "./packs/origins.db", "path": "packs/origins.db",
"tag": "origin",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "races", "name": "races",
"label": "Races", "label": "Races",
"system": "bol", "system": "bol",
"path": "./packs/races.db", "path": "packs/races.db",
"tag": "race",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "equipment", "name": "equipment",
"label": "Equipement", "label": "Equipement",
"system": "bol", "system": "bol",
"path": "./packs/equipment.db", "path": "packs/equipment.db",
"tag": "item",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Aides de Jeu", "label": "Aides de Jeu",
@ -107,7 +114,8 @@
"name": "aides-de-jeu", "name": "aides-de-jeu",
"path": "packs/aides-de-jeu.db", "path": "packs/aides-de-jeu.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Cartes", "label": "Cartes",
@ -115,7 +123,8 @@
"name": "cartes", "name": "cartes",
"path": "packs/cartes.db", "path": "packs/cartes.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Langues", "label": "Langues",
@ -123,7 +132,8 @@
"name": "languages", "name": "languages",
"path": "packs/languages.db", "path": "packs/languages.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Sorts", "label": "Sorts",
@ -131,7 +141,8 @@
"name": "spells", "name": "spells",
"path": "packs/spells.db", "path": "packs/spells.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Dieux", "label": "Dieux",
@ -139,7 +150,8 @@
"name": "godsfaith", "name": "godsfaith",
"path": "packs/godsfaith.db", "path": "packs/godsfaith.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Options de Combat", "label": "Options de Combat",
@ -147,7 +159,26 @@
"name": "fightoptions", "name": "fightoptions",
"path": "packs/fightoptions.db", "path": "packs/fightoptions.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
},
{
"label": "Alchimie - Potions",
"type": "Item",
"name": "potions-alchimie",
"path": "packs/potions-alchimie.db",
"system": "bol",
"private": false,
"flags": {}
},
{
"label": "Alchimie - Objets",
"type": "Item",
"name": "objets-alchimie",
"path": "packs/objets-alchimie.db",
"system": "bol",
"private": false,
"flags": {}
}, },
{ {
"label": "Créatures", "label": "Créatures",
@ -155,18 +186,16 @@
"name": "creatures", "name": "creatures",
"path": "packs/creatures.db", "path": "packs/creatures.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
} }
], ],
"system": [],
"dependencies": [],
"socket": true, "socket": true,
"manifest": "https://raw.githubusercontent.com/ZigmundKreud/bol/master/system.json", "manifest": "https://www.uberwald.me/gitea/public/bol/raw/v10/system.json",
"download": "https://github.com/ZigmundKreud/bol/archive/refs/heads/master.zip", "download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v10.1.5.zip",
"protected": false, "background": "systems/images/map_lemurie.webp",
"background": "images/map_lemurie.webp",
"gridDistance": 1.5, "gridDistance": 1.5,
"gridUnits": "m", "gridUnits": "m",
"primaryTokenAttribute": "resources.hp", "primaryTokenAttribute": "resources.hp",
"secondaryTokenAttribute": "resources.hero" "secondaryTokenAttribute": "resources.hero"
} }

View File

@ -137,7 +137,7 @@
}, },
"character": { "character": {
"templates": [ "base" ], "templates": [ "base" ],
"type": "player", "chartype": "player",
"villainy": false, "villainy": false,
"bougette": { "bougette": {
"state": "nomoney" "state": "nomoney"
@ -157,7 +157,7 @@
}, },
"encounter": { "encounter": {
"templates": [ "base" ], "templates": [ "base" ],
"type": "tough", "chartype": "tough",
"villainy": false, "villainy": false,
"size": "", "size": "",
"environment": "" "environment": ""

View File

@ -1,8 +1,10 @@
<form class="{{cssClass}} flexcol" autocomplete="off"> <form class="{{cssClass}} flexcol bol-actor-form" autocomplete="off">
<!--<img class="system-img" src="/systems/bol/ui/logo.webp" height="115" width="190"/> -->
<div class="wrap flexrow"> <div class="wrap flexrow">
{{!-- Sidebar --}} {{!-- Sidebar --}}
<div class="sidebar flex0"> <div class="sidebar flex0 bol-actor-sidebar">
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="100" width="100" <img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="100" width="100"
style="border:1px outset lightgray; box-shadow: 5px 5px 5px gray" /> style="border:1px outset lightgray; box-shadow: 5px 5px 5px gray" />
</div> </div>

View File

@ -2,27 +2,27 @@
<header class="sheet-header"> <header class="sheet-header">
<div class="header-field flex1"> <div class="header-field flex1">
<div class="header-field-group flexrow"> <div class="header-field-group flexrow">
<label class="header-field-label flex2">Nom</label><br/> <label class="header-field-label flex2">{{localize "BOL.ui.name"}}</label><br/>
<input class="charname flex6" name="name" type="text" value="{{actor.name}}" placeholder="Name"/> <input class="charname flex6" name="name" type="text" value="{{actor.name}}" placeholder="Name"/>
</div> </div>
{{#if (eq data.type "player")}} {{#if (eq charType "player")}}
<div class="header-field-group flexrow"> <div class="header-field-group flexrow">
<label class="header-field-label flex2">Experience</label><br/> <label class="header-field-label flex2">{{localize "BOL.ui.xp"}}</label><br/>
<div class="header-field-group flex3"> <div class="header-field-group flex3">
<label class="header-field-label flex1" style="font-size: 1.5em; color:#606060;">Dépensée</label><br/> <label class="header-field-label flex1" style="font-size: 1.5em; color:#606060;">{{localize "BOL.ui.xpspent"}}</label><br/>
<input class="header-field-value flex1" type="text" name="data.xp.spent" value="{{numberFormat data.xp.spent decimals=0 sign=false}}" data-dtype="Number"/><br/> <input class="header-field-value flex1" type="text" name="system.xp.spent" value="{{numberFormat xp.spent decimals=0 sign=false}}" data-dtype="Number"/><br/>
</div> </div>
<div class="header-field-group flex3"> <div class="header-field-group flex3">
<label class="header-field-label flex1" style="font-size: 1.5em; color:#606060;">&nbsp;Totale</label><br/> <label class="header-field-label flex1" style="font-size: 1.5em; color:#606060;">&nbsp;{{localize "BOL.ui.xptotal"}}</label><br/>
<input class="header-field-value flex1" type="text" name="data.xp.total" value="{{numberFormat data.xp.total decimals=0 sign=false}}" data-dtype="Number"/><br/> <input class="header-field-value flex1" type="text" name="system.xp.total" value="{{numberFormat xp.total decimals=0 sign=false}}" data-dtype="Number"/><br/>
</div> </div>
</div> </div>
{{else}} {{else}}
<div class="header-field-group flexrow"> <div class="header-field-group flexrow">
<label class="header-field-label flex2">Type : </label><br/> <label class="header-field-label flex2">Type : </label><br/>
<select class="field-value" name="data.type" data-dtype="String"> <select class="field-value" name="system.chartype" data-dtype="String">
{{#select data.type}} {{#select charType}}
<option value="creature">Créature</option> <option value="creature">Créature</option>
<option value="base">Piétaille</option> <option value="base">Piétaille</option>
<option value="tough">Coriace</option> <option value="tough">Coriace</option>

View File

@ -12,14 +12,14 @@
<li class="item flexrow" data-item-id="{{item._id}}"> <li class="item flexrow" data-item-id="{{item._id}}">
<div class="item-image" ><img src="{{item.img}}" title="{{item.name}}"/></div> <div class="item-image" ><img src="{{item.img}}" title="{{item.name}}"/></div>
<h4 class="item-name flex2">{{#if ../weapon}}<a class="rollable" data-roll-type="weapon">{{/if}}{{item.name}}{{#if ../weapon}}</a>{{/if}}</h4> <h4 class="item-name flex2">{{#if ../weapon}}<a class="rollable" data-roll-type="weapon">{{/if}}{{item.name}}{{#if ../weapon}}</a>{{/if}}</h4>
{{#if ../protection}}<div class="item-field"><a class="rollable" data-roll-type="protection">{{item.data.properties.soak.formula}}</a> / {{item.data.properties.soak.value}}</div>{{/if}} {{#if ../protection}}<div class="item-field"><a class="rollable" data-roll-type="protection">{{item.system.properties.soak.formula}}</a> / {{item.system.properties.soak.value}}</div>{{/if}}
{{#if ../blocking}}<div class="item-field">{{item.data.properties.blocking.malus}}</div>{{/if}} {{#if ../blocking}}<div class="item-field">{{item.system.properties.blocking.malus}}</div>{{/if}}
{{#if ../weapon}}<div class="item-field"><a class="rollable" data-roll-type="damage"> {{#if ../weapon}}<div class="item-field"><a class="rollable" data-roll-type="damage">
{{item.data.properties.damage}}+{{item.data.properties.damageModifiers}} x{{item.data.properties.damageMultiplier}} {{item.system.properties.damage}}+{{item.system.properties.damageModifiers}}x{{item.system.properties.damageMultiplier}}
</a></div>{{/if}} </a></div>{{/if}}
{{#if ../ranged}}<div class="item-field">{{item.data.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}} {{#if ../ranged}}<div class="item-field">{{item.system.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}}
{{#if ../options}}<div class="item-field"> {{#if ../options}}<div class="item-field">
{{#if item.data.properties.activated}} {{#if item.system.properties.activated}}
<a class="toggle-fight-option">{{localize "BOL.ui.toactivated"}}</a> <a class="toggle-fight-option">{{localize "BOL.ui.toactivated"}}</a>
{{else}} {{else}}
<a class="toggle-fight-option">{{localize "BOL.ui.todeactivated"}}</a> <a class="toggle-fight-option">{{localize "BOL.ui.todeactivated"}}</a>

View File

@ -1,29 +1,29 @@
<ol class="items-list"> <ol class="items-list">
{{#if (ne data.type "creature")}} {{#if (ne actor.type "creature")}}
<li class="item flexrow item-header"> <li class="item flexrow item-header">
<div class="item-name left">Taille </div> <div class="item-name left">{{localize "BOL.ui.biosize"}}</div>
<div class="item-field flex2 left"><input type="text" name="data.details.height" value="{{data.details.height}}"></div> <div class="item-field flex2 left"><input type="text" name="system.details.height" value="{{details.height}}"></div>
<div class="item-name right">Poids </div> <div class="item-name right">{{localize "BOL.ui.bioweight"}}</div>
<div class="item-field flex2 "><input type="text" name="data.details.weight" value="{{data.details.weight}}"></div> <div class="item-field flex2 "><input type="text" name="system.details.weight" value="{{details.weight}}"></div>
<div class="item-name right">Age </div> <div class="item-name right">{{localize "BOL.ui.bioage"}} </div>
<div class="item-field flex2 "><input type="text" name="data.details.age" value="{{data.details.age}}"></div> <div class="item-field flex2 "><input type="text" name="system.details.age" value="{{details.age}}"></div>
</li> </li>
<li class="item flexrow item-header"> <li class="item flexrow item-header">
<div class="item-name left">Cheveux </div> <div class="item-name left">{{localize "BOL.ui.biohair"}} </div>
<div class="item-field flex2 left"><input type="text" name="data.details.hait" value="{{data.details.hait}}"></div> <div class="item-field flex2 left"><input type="text" name="system.details.hait" value="{{details.hait}}"></div>
<div class="item-name right">Yeux </div> <div class="item-name right">{{localize "BOL.ui.bioeyes"}} </div>
<div class="item-field flex2 "><input type="text" name="data.details.eyes" value="{{data.details.eyes}}"></div> <div class="item-field flex2 "><input type="text" name="system.details.eyes" value="{{details.eyes}}"></div>
</li> </li>
<li class="item flexrow item-header"> <li class="item flexrow item-header">
<div class="item-name left">Signes distinctifs </div> <div class="item-name left">{{localize "BOL.ui.biosigns"}} </div>
<div class="item-field flex2 left"><input type="text" name="data.details.signs" value="{{data.details.signs}}"></div> <div class="item-field flex2 left"><input type="text" name="system.details.signs" value="{{details.signs}}"></div>
</li> </li>
{{else}} {{else}}
<li class="item flexrow item-header"> <li class="item flexrow item-header">
<div class="item-name left">Taille </div> <div class="item-name left">Taille </div>
<div class="form-fields center"> <div class="form-fields center">
<select class="field-value size" name="data.details.size" data-dtype="String"> <select class="field-value size" name="system.details.size" data-dtype="String">
{{#select data.details.size}} {{#select details.size}}
{{#each config.creatureSize as |value id|}} {{#each config.creatureSize as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -35,18 +35,18 @@
</ol> </ol>
<ol class="items-list"> <ol class="items-list">
<li class="item flexrow item-header"> <li class="item flexrow item-header">
<div class="item-name flex4 left">Description</div> <div class="item-name flex4 left">{{localize "BOL.ui.biodescription"}}</div>
<div class="item-field flex1 right"></div> <div class="item-field flex1 right"></div>
</li> </li>
</ol> </ol>
{{editor content=data.details.biography target="data.details.biography" button=true owner=owner {{editor biography target="system.details.biography" button=true owner=owner
editable=editable}} editable=editable}}
<ol class="items-list"> <ol class="items-list">
<li class="item flexrow item-header"> <li class="item flexrow item-header">
<div class="item-name flex4 left">Notes</div> <div class="item-name flex4 left">{{localize "BOL.ui.bionotes"}}</div>
<div class="item-field flex1 right"></div> <div class="item-field flex1 right"></div>
</li> </li>
</ol> </ol>
{{editor content=data.details.notes target="data.details.notes" button=true owner=owner editable=editable}} {{editor notes target="system.details.notes" button=true owner=owner editable=editable}}

View File

@ -21,10 +21,10 @@
<li class="item flexrow" data-item-id="{{item._id}}"> <li class="item flexrow" data-item-id="{{item._id}}">
<div class="item-image {{#if ../weapon}}roll-weapon{{/if}}"><img src="{{item.img}}" title="{{item.name}}"/></div> <div class="item-image {{#if ../weapon}}roll-weapon{{/if}}"><img src="{{item.img}}" title="{{item.name}}"/></div>
<h4 class="item-name flex2"><a class="item-edit">{{item.name}}</a></h4> <h4 class="item-name flex2"><a class="item-edit">{{item.name}}</a></h4>
{{#if ../protection}}<div class="item-field">{{item.data.properties.soak.value}}</div>{{/if}} {{#if ../protection}}<div class="item-field">{{item.system.properties.soak.value}}</div>{{/if}}
{{#if ../blocking}}<div class="item-field">{{item.data.properties.blocking.malus}}</div>{{/if}} {{#if ../blocking}}<div class="item-field">{{item.system.properties.blocking.malus}}</div>{{/if}}
{{#if ../weapon}}<div class="item-field">{{item.data.properties.damage}}</div>{{/if}} {{#if ../weapon}}<div class="item-field">{{item.system.properties.damage}}</div>{{/if}}
{{#if ../ranged}}<div class="item-field">{{item.data.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}} {{#if ../ranged}}<div class="item-field">{{item.system.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}}
</li> </li>
{{/each}} {{/each}}
</ol> </ol>

View File

@ -12,8 +12,8 @@
<div class="item-image"><img src="icons/containers/bags/coinpouch-simple-leather-brown.webp" title="{{localize "BOL.ui.money"}}" /></div> <div class="item-image"><img src="icons/containers/bags/coinpouch-simple-leather-brown.webp" title="{{localize "BOL.ui.money"}}" /></div>
{{localize "BOL.ui.money"}} {{localize "BOL.ui.money"}}
</h4> </h4>
<select class="field-value" name="data.bougette.state" data-dtype="String"> <select class="field-value" name="system.bougette.state" data-dtype="String">
{{#select data.bougette.state}} {{#select system.bougette.state}}
{{#each config.bougetteState as |value id|}} {{#each config.bougetteState as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -39,26 +39,26 @@
<a class="item-edit">{{item.name}}</a> <a class="item-edit">{{item.name}}</a>
</h4> </h4>
<div class="item-field flex2 center"> <div class="item-field flex2 center">
{{#if item.data.properties.equipable}} {{#if item.system.properties.equipable}}
<span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat <span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat
"BOL.equipmentSlots." item.data.properties.slot)}}</span> "BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}} {{/if}}
</div> </div>
<div class="item-field group-btns flex1 center"> <div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}} {{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp; data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp; <span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a> data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}} {{/if}}
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span> <span class="item-field">{{item.system.price}}</span>
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
{{#if data.properties.equipable}} {{#if system.properties.equipable}}
{{#if data.worn}} {{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i <span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span> class="fas fa-shield-alt"></i></a></span>
{{else}} {{else}}
@ -92,32 +92,32 @@
<a class="item-edit">{{item.name}}</a> <a class="item-edit">{{item.name}}</a>
</h4> </h4>
<div class="item-field flex2 center"> <div class="item-field flex2 center">
{{#if item.data.properties.equipable}} {{#if item.system.properties.equipable}}
<span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat <span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat
"BOL.equipmentSlots." item.data.properties.slot)}}</span> "BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}} {{/if}}
</div> </div>
<div class="item-field flex2 center"> <div class="item-field flex2 center">
{{#if item.data.properties.equipable}} {{#if item.system.properties.equipable}}
<span class="item-field" <span class="item-field"
style="font-size: smaller; font-style: italic; color:#4b4a44">{{data.properties.soak.formula}}</span> style="font-size: smaller; font-style: italic; color:#4b4a44">{{system.properties.soak.formula}}</span>
{{/if}} {{/if}}
</div> </div>
<div class="item-field group-btns flex1 center"> <div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}} {{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp; data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp; <span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a> data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}} {{/if}}
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span> <span class="item-field">{{item.system.price}}</span>
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
{{#if data.properties.equipable}} {{#if system.properties.equipable}}
{{#if data.worn}} {{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i <span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span> class="fas fa-shield-alt"></i></a></span>
{{else}} {{else}}
@ -150,26 +150,26 @@
<a class="item-edit">{{item.name}}</a> <a class="item-edit">{{item.name}}</a>
</h4> </h4>
<div class="item-field flex2 center"> <div class="item-field flex2 center">
{{#if item.data.properties.equipable}} {{#if item.system.properties.equipable}}
<span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat <span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat
"BOL.equipmentSlots." item.data.properties.slot)}}</span> "BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}} {{/if}}
</div> </div>
<div class="item-field group-btns flex1 center"> <div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}} {{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp; data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp; <span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a> data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}} {{/if}}
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span> <span class="item-field">{{item.system.price}}</span>
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
{{#if data.properties.equipable}} {{#if system.properties.equipable}}
{{#if data.worn}} {{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i <span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span> class="fas fa-shield-alt"></i></a></span>
{{else}} {{else}}
@ -202,26 +202,26 @@
<a class="item-edit">{{item.name}}</a> <a class="item-edit">{{item.name}}</a>
</h4> </h4>
<div class="item-field flex2 center"> <div class="item-field flex2 center">
{{#if item.data.properties.equipable}} {{#if item.system.properties.equipable}}
<span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat <span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat
"BOL.equipmentSlots." item.data.properties.slot)}}</span> "BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}} {{/if}}
</div> </div>
<div class="item-field group-btns flex1 center"> <div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}} {{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0" <a class="system-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp; data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp; <span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a> data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}} {{/if}}
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span> <span class="item-field">{{item.system.price}}</span>
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
{{#if data.properties.equipable}} {{#if system.properties.equipable}}
{{#if data.worn}} {{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i <span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span> class="fas fa-shield-alt"></i></a></span>
{{else}} {{else}}
@ -254,26 +254,26 @@
<a class="item-edit">{{item.name}}</a> <a class="item-edit">{{item.name}}</a>
</h4> </h4>
<div class="item-field flex2 center"> <div class="item-field flex2 center">
{{#if item.data.properties.equipable}} {{#if item.system.properties.equipable}}
<span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat <span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat
"BOL.equipmentSlots." item.data.properties.slot)}}</span> "BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}} {{/if}}
</div> </div>
<div class="item-field group-btns flex1 center"> <div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}} {{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp; data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp; <span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a> data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}} {{/if}}
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span> <span class="item-field">{{item.system.price}}</span>
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
{{#if data.properties.equipable}} {{#if system.properties.equipable}}
{{#if data.worn}} {{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i <span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span> class="fas fa-shield-alt"></i></a></span>
{{else}} {{else}}
@ -306,26 +306,26 @@
<a class="item-edit">{{item.name}}</a> <a class="item-edit">{{item.name}}</a>
</h4> </h4>
<div class="item-field flex2 center"> <div class="item-field flex2 center">
{{#if item.data.properties.equipable}} {{#if item.system.properties.equipable}}
<span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat <span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat
"BOL.equipmentSlots." item.data.properties.slot)}}</span> "BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}} {{/if}}
</div> </div>
<div class="item-field group-btns flex1 center"> <div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}} {{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp; data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp; <span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a> data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}} {{/if}}
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span> <span class="item-field">{{item.system.price}}</span>
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
{{#if data.properties.equipable}} {{#if system.properties.equipable}}
{{#if data.worn}} {{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i <span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span> class="fas fa-shield-alt"></i></a></span>
{{else}} {{else}}
@ -358,26 +358,26 @@
<a class="item-edit">{{item.name}}</a> <a class="item-edit">{{item.name}}</a>
</h4> </h4>
<div class="item-field flex2 center"> <div class="item-field flex2 center">
{{#if item.data.properties.equipable}} {{#if item.system.properties.equipable}}
<span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat <span class="item-field" style="font-size: smaller; font-style: italic; color:#4b4a44">{{localize (concat
"BOL.equipmentSlots." item.data.properties.slot)}}</span> "BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}} {{/if}}
</div> </div>
<div class="item-field group-btns flex1 center"> <div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}} {{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp; data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp; <span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0" <a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a> data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}} {{/if}}
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span> <span class="item-field">{{item.system.price}}</span>
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
{{#if data.properties.equipable}} {{#if system.properties.equipable}}
{{#if data.worn}} {{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i <span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span> class="fas fa-shield-alt"></i></a></span>
{{else}} {{else}}

View File

@ -16,18 +16,18 @@
</h4> </h4>
<div class="item-field group-btns center flex2"> <div class="item-field group-btns center flex2">
{{#if (equals key "careers")}} {{#if (equals key "careers")}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.rank" data-incr="1" data-min="0" data-max="5"><i class="fas fa-minus-square"></i></a>&nbsp; <a class="inc-dec-btns" data-operator="minus" data-target="system.rank" data-incr="1" data-min="0" data-max="5"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.rank}}</span>&nbsp; <span class="item-field">{{item.system.rank}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.rank" data-incr="1" data-min="0" data-max="5"><i class="fas fa-plus-square"></i></a> <a class="inc-dec-btns" data-operator="plus" data-target="system.rank" data-incr="1" data-min="0" data-max="5"><i class="fas fa-plus-square"></i></a>
<span class="item-field">&nbsp;&nbsp;</span>&nbsp; <span class="item-field">&nbsp;&nbsp;</span>&nbsp;
<span class="tooltip-container"> <span class="tooltip-container">
<span class="stat-roll rollable" title="XP" data-roll-type="careerxp" data-key="{{key}}"> <span class="stat-roll rollable" title="XP" data-roll-type="careerxp" data-key="{{key}}">
<i class="xp-next fas fa-arrow-up"></i></span> <i class="xp-next fas fa-arrow-up"></i></span>
<span class="tooltiptext"> <span class="tooltiptext">
{{#if (eq data.rank 0)}} {{#if (eq system.rank 0)}}
1 XP 1 XP
{{else}} {{else}}
{{add data.rank 1}} XP {{add system.rank 1}} XP
{{/if}} {{/if}}
</span> </span>
</span> </span>

View File

@ -14,10 +14,10 @@
<a class="rollable" data-roll-type="spell">{{item.name}}</a> <a class="rollable" data-roll-type="spell">{{item.name}}</a>
</h4> </h4>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{item.data.properties.circle}}</span> <span class="item-field">{{item.system.properties.circle}}</span>
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{item.data.properties.difficulty}}</span> <span class="item-field">{{item.system.properties.difficulty}}</span>
</div> </div>
<div class="item-field flex1 right"> <div class="item-field flex1 right">
<a class="item-control item-edit" title="{{localize "BOL.ui.edit"}}"><i class="fas fa-square"></i></a> <a class="item-control item-edit" title="{{localize "BOL.ui.edit"}}"><i class="fas fa-square"></i></a>
@ -44,13 +44,13 @@
<a class="rollable" data-roll-type="alchemy">{{item.name}}</a> <a class="rollable" data-roll-type="alchemy">{{item.name}}</a>
</h4> </h4>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{localize (concat "BOL.alchemyItem." item.data.properties.alchemytype)}}</span> <span class="item-field">{{localize (concat "BOL.alchemyItem." item.system.properties.alchemytype)}}</span>
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{item.data.properties.difficulty}}</span> <span class="item-field">{{item.system.properties.difficulty}}</span>
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<span class="item-field">{{item.data.properties.pccurrent}} / {{item.data.properties.pccost}}</span> <span class="item-field">{{item.system.properties.pccurrent}} / {{item.system.properties.pccost}}</span>
</div> </div>
<div class="item-field flex1 center"> <div class="item-field flex1 center">
<a class="inc-dec-btns-alchemy"><i class="fas fa-plus-square"></i></a> <a class="inc-dec-btns-alchemy"><i class="fas fa-plus-square"></i></a>

View File

@ -1,8 +1,8 @@
<div class="attributes flexrow"> <div class="attributes flexrow">
{{#each data.attributes as |attribute id|}} {{#each attributes as |attribute id|}}
<div class="attribute stat flex1 flex-group-center {{key}}"> <div class="attribute stat flex1 flex-group-center {{key}}">
<label class="stat-label"><a class="rollable" data-roll-type="attribute" data-roll="2d6+@attributes.{{key}}.value" data-adv="0" data-key="{{key}}">{{localize label}}</a></label><br/> <label class="stat-label"><a class="rollable" data-roll-type="attribute" data-roll="2d6+@attributes.{{key}}.value" data-adv="0" data-key="{{key}}">{{localize label}}</a></label><br/>
<input class="stat-value rounded" type="text" name="data.attributes.{{key}}.value" value="{{numberFormat value decimals=0 sign=true}}" data-dtype="Number"/><br/> <input class="stat-value rounded" type="text" name="system.attributes.{{key}}.value" value="{{numberFormat value decimals=0 sign=true}}" data-dtype="Number"/><br/>
<span class="stat-roll rollable" title="2d6" data-roll-type="attribute" data-roll="2d6+@attributes.{{key}}.value" data-adv="0" data-key="{{key}}"> <span class="stat-roll rollable" title="2d6" data-roll-type="attribute" data-roll="2d6+@attributes.{{key}}.value" data-adv="0" data-key="{{key}}">
<i class="darkgreen fas fa-dice"></i> <i class="darkgreen fas fa-dice"></i>
</span> </span>
@ -22,10 +22,10 @@
</div> </div>
<hr/> <hr/>
<div class="aptitudes flexrow"> <div class="aptitudes flexrow">
{{#each data.aptitudes as |aptitude id|}} {{#each aptitudes as |aptitude id|}}
<div class="aptitude stat flex1 flex-group-center"> <div class="aptitude stat flex1 flex-group-center">
<label class="stat-label"><a class="rollable" data-roll-type="aptitude" data-roll="2d6+@aptitudes.{{key}}.value" data-adv="0" data-key="{{key}}">{{localize label}}</a></label><br/> <label class="stat-label"><a class="rollable" data-roll-type="aptitude" data-roll="2d6+@aptitudes.{{key}}.value" data-adv="0" data-key="{{key}}">{{localize label}}</a></label><br/>
<input class="stat-value rounded-border" type="text" name="data.aptitudes.{{key}}.value" value="{{numberFormat value decimals=0 sign=true}}" data-dtype="Number"/><br/> <input class="stat-value rounded-border" type="text" name="system.aptitudes.{{key}}.value" value="{{numberFormat value decimals=0 sign=true}}" data-dtype="Number"/><br/>
<span class="stat-roll rollable" title="2d6" data-roll-type="aptitude" data-roll="2d6+@aptitudes.{{key}}.value" data-adv="0" data-key="{{key}}"> <span class="stat-roll rollable" title="2d6" data-roll-type="aptitude" data-roll="2d6+@aptitudes.{{key}}.value" data-adv="0" data-key="{{key}}">
<i class="darkgreen fas fa-dice"></i> <i class="darkgreen fas fa-dice"></i>
</span> </span>
@ -50,25 +50,29 @@
{{#if @root.isAlchemist}} {{#if @root.isAlchemist}}
<div class="resource stat flex1 flex-group-center"> <div class="resource stat flex1 flex-group-center">
<label class="stat-label">{{localize label}}</label><br/> <label class="stat-label">{{localize label}}</label><br/>
<input class="stat-value" type="text" name="data.resources.{{key}}.value" value="{{numberFormat value decimals=0 sign=false}}" data-dtype="Number"/> <input class="stat-value resources-value" type="text" name="system.resources.{{key}}.value" value="{{numberFormat value decimals=0 sign=false}}" data-dtype="Number"/>
{{#if (eq @root.data.type 'player')}} {{#if (eq @root.chartype 'player')}}
{{#if (exists bonus)}} {{#if (exists bonus)}}
<span class="flexrow"><label class="stat-max">Bonus:</label><input class="stat-max" type="text" name="data.resources.{{key}}.bonus" value="{{numberFormat bonus decimals=0 sign=false}}" data-dtype="Number"/></span> <span class="flexrow"><label class="stat-max bonus-text">Bonus</label><input class="resource-bonus resources-value" type="text" name="system.resources.{{key}}.bonus" value="{{numberFormat bonus decimals=0 sign=false}}" data-dtype="Number"/></span>
{{else}}
<span class="flexrow"><label class="stat-max resources-value">&nbsp;</label><input class="resource-bonus resources-novalue" type="text" value="" disabled></span>
{{/if}}
{{/if}} {{/if}}
{{/if}} <input class="resources-value" type="text" name="system.resources.{{key}}.max" value="{{numberFormat max decimals=0 sign=false}}" data-dtype="Number"/>
<input class="stat-max" type="text" name="data.resources.{{key}}.max" value="{{numberFormat max decimals=0 sign=false}}" data-dtype="Number"/>
</div> </div>
{{/if}} {{/if}}
{{else}} {{else}}
<div class="resource stat flex1 flex-group-center"> <div class="resource stat flex1 flex-group-center">
<label class="stat-label">{{localize label}}</label><br/> <label class="stat-label">{{localize label}}</label><br/>
<input class="stat-value" type="text" name="data.resources.{{key}}.value" value="{{numberFormat value decimals=0 sign=false}}" data-dtype="Number"/> <input class="stat-value resources-value" type="text" name="system.resources.{{key}}.value" value="{{numberFormat value decimals=0 sign=false}}" data-dtype="Number"/>
{{#if (eq @root.data.type 'player')}} {{#if (eq @root.chartype 'player')}}
{{#if (exists bonus)}} {{#if (exists bonus)}}
<span class="flexrow"><label class="stat-max">Bonus:</label><input class="stat-max" type="text" name="data.resources.{{key}}.bonus" value="{{numberFormat bonus decimals=0 sign=false}}" data-dtype="Number"/></span> <span class="flexrow"><label class="stat-max bonus-text">Bonus</label><input class="resource-bonus resources-value" type="text" name="system.resources.{{key}}.bonus" value="{{numberFormat bonus decimals=0 sign=false}}" data-dtype="Number"/></span>
{{else}}
<span class="flexrow"><label class="stat-max">&nbsp;</label><input class="resource-bonus resources-novalue" type="text" value="" disabled></span>
{{/if}}
{{/if}} {{/if}}
{{/if}} <input class="resources-value" type="text" name="system.resources.{{key}}.max" value="{{numberFormat max decimals=0 sign=false}}" data-dtype="Number"/>
<input class="stat-max" type="text" name="data.resources.{{key}}.max" value="{{numberFormat max decimals=0 sign=false}}" data-dtype="Number"/>
</div> </div>
{{/if}} {{/if}}
{{/each}} {{/each}}

View File

@ -12,12 +12,12 @@
<li class="item flexrow" data-item-id="{{item._id}}"> <li class="item flexrow" data-item-id="{{item._id}}">
<div class="item-image" ><img src="{{item.img}}" title="{{item.name}}"/></div> <div class="item-image" ><img src="{{item.img}}" title="{{item.name}}"/></div>
<h4 class="item-name flex2">{{#if ../weapon}}<a class="rollable" data-roll-type="weapon">{{/if}}{{item.name}}{{#if ../weapon}}</a>{{/if}}</h4> <h4 class="item-name flex2">{{#if ../weapon}}<a class="rollable" data-roll-type="weapon">{{/if}}{{item.name}}{{#if ../weapon}}</a>{{/if}}</h4>
{{#if ../protection}}<div class="item-field"><a class="rollable" data-roll-type="protection">{{item.data.properties.soak.formula}}</a> / {{item.data.properties.soak.value}}</div>{{/if}} {{#if ../protection}}<div class="item-field"><a class="rollable" data-roll-type="protection">{{item.system.properties.soak.formula}}</a> / {{item.system.properties.soak.value}}</div>{{/if}}
{{#if ../blocking}}<div class="item-field">{{item.data.properties.blocking.malus}}</div>{{/if}} {{#if ../blocking}}<div class="item-field">{{item.system.properties.blocking.malus}}</div>{{/if}}
{{#if ../weapon}}<div class="item-field"><a class="rollable" data-roll-type="damage">{{item.data.properties.damage}}+{{item.data.properties.damageModifiers}} x{{item.data.properties.damageMultiplier}}</a></div>{{/if}} {{#if ../weapon}}<div class="item-field"><a class="rollable" data-roll-type="damage">{{item.system.properties.damage}}+{{item.system.properties.damageModifiers}} x{{item.system.properties.damageMultiplier}}</a></div>{{/if}}
{{#if ../ranged}}<div class="item-field">{{item.data.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}} {{#if ../ranged}}<div class="item-field">{{item.system.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}}
{{#if ../options}}<div class="item-field"> {{#if ../options}}<div class="item-field">
{{#if item.data.properties.activated}} {{#if item.system.properties.activated}}
<a class="toggle-fight-option">{{localize "BOL.ui.toactivated"}}</a> <a class="toggle-fight-option">{{localize "BOL.ui.toactivated"}}</a>
{{else}} {{else}}
<a class="toggle-fight-option">{{localize "BOL.ui.todeactivated"}}</a> <a class="toggle-fight-option">{{localize "BOL.ui.todeactivated"}}</a>

View File

@ -1,9 +1,9 @@
<div class="attributes flexrow"> <div class="attributes flexrow">
{{#each data.attributes as |attribute id|}} {{#each attributes as |attribute id|}}
{{#if (ne id "appeal")}} {{#if (ne id "appeal")}}
<div class="attribute stat flex1 flex-group-center {{key}}"> <div class="attribute stat flex1 flex-group-center {{key}}">
<label class="stat-label"><a class="rollable" data-roll-type="attribute" data-roll="2d6+@attributes.{{key}}.value" data-adv="0" data-key="{{key}}">{{localize label}}</a></label><br/> <label class="stat-label"><a class="rollable" data-roll-type="attribute" data-roll="2d6+@attributes.{{key}}.value" data-adv="0" data-key="{{key}}">{{localize label}}</a></label><br/>
<input class="stat-value rounded" type="text" name="data.attributes.{{key}}.value" value="{{numberFormat value decimals=0 sign=true}}" data-dtype="Number"/><br/> <input class="stat-value rounded" type="text" name="system.attributes.{{key}}.value" value="{{numberFormat value decimals=0 sign=true}}" data-dtype="Number"/><br/>
<span class="stat-roll rollable" title="2d6" data-roll-type="attribute" data-roll="2d6+@attributes.{{key}}.value" data-adv="0" data-key="{{key}}"> <span class="stat-roll rollable" title="2d6" data-roll-type="attribute" data-roll="2d6+@attributes.{{key}}.value" data-adv="0" data-key="{{key}}">
<i class="darkgreen fas fa-dice"></i> <i class="darkgreen fas fa-dice"></i>
</span> </span>
@ -15,7 +15,7 @@
<div class="aptitudes flexrow"> <div class="aptitudes flexrow">
<div class="aptitude stat flex1 flex-group-center"> <div class="aptitude stat flex1 flex-group-center">
<div class="stat-label"><a class="rollable" data-roll-type="aptitude" data-roll="2d6+@aptitudes.def.value" data-adv="0" data-key="def">{{localize "BOL.aptitudes.def"}}</a></label><br/> <div class="stat-label"><a class="rollable" data-roll-type="aptitude" data-roll="2d6+@aptitudes.def.value" data-adv="0" data-key="def">{{localize "BOL.aptitudes.def"}}</a></label><br/>
<input class="stat-value rounded-border" type="text" name="data.aptitudes.def.value" value="{{numberFormat aptitudes.3.value decimals=0 sign=true}}" data-dtype="Number"/><br/> <input class="stat-value rounded-border" type="text" name="system.aptitudes.def.value" value="{{numberFormat aptitudes.3.value decimals=0 sign=true}}" data-dtype="Number"/><br/>
<span class="stat-roll rollable" title="2d6" data-roll-type="aptitude" data-roll="2d6+@aptitudes.def.value" data-adv="0" data-key="def"> <span class="stat-roll rollable" title="2d6" data-roll-type="aptitude" data-roll="2d6+@aptitudes.def.value" data-adv="0" data-key="def">
<i class="darkgreen fas fa-dice"></i> <i class="darkgreen fas fa-dice"></i>
</span> </span>
@ -26,7 +26,7 @@
<div class="resources flexrow"> <div class="resources flexrow">
<div class="resource stat flex1 flex-group-center"> <div class="resource stat flex1 flex-group-center">
<label class="stat-label">{{localize "BOL.resources.hp"}}</label><br/> <label class="stat-label">{{localize "BOL.resources.hp"}}</label><br/>
<input class="stat-value" type="text" name="data.resources.hp.value" value="{{numberFormat resources.hp.value decimals=0 sign=false}}" data-dtype="Number"/> <input class="stat-value" type="text" name="system.resources.hp.value" value="{{numberFormat resources.hp.value decimals=0 sign=false}}" data-dtype="Number"/>
<input class="stat-max" type="text" name="data.resources.hp.max" value="{{numberFormat resources.hp.max decimals=0 sign=false}}" data-dtype="Number"/> <input class="stat-max" type="text" name="system.resources.hp.max" value="{{numberFormat resources.hp.max decimals=0 sign=false}}" data-dtype="Number"/>
</div> </div>
</div> </div>

View File

@ -5,10 +5,9 @@
<div class="flexrow"> <div class="flexrow">
{{#if state}} {{#if state}}
{{name}} active son option de combat {{foName}} pour ce round ! {{localize "BOL.chat.fightactive" name=name foName=foName}}
{{else}} {{else}}
{{name}} désactive son option de combat {{foName}} pour ce round ! {{localize "BOL.chat.fightunactive" name=name foName=foName}}
{{/if}} {{/if}}
</div> </div>

View File

@ -0,0 +1,33 @@
<div>
<img class="chat-icon" src="{{img}}" alt="{{name}}"/>
<h2 class="bad"><strong>{{story.title}}</strong></h2>
</div>
<div class="flexrow">
<br>{{story.mission}}
{{#if story.carriere}}
<br>{{story.carriere}}
{{/if}}
{{#if story.lieu}}
<br>{{story.lieu}}
{{/if}}
{{#if story.objet}}
<br>{{story.objet}}
{{/if}}
<br>{{story.motivation}}
{{#if story.rival}}
<br>{{story.rival}}
{{/if}}
{{#if story.dieu}}
<br>{{story.dieu}}
{{/if}}
{{#if story.complication}}
<br>{{story.complication}}
{{/if}}
{{#if story.retournement}}
<br>{{story.retournement}}
{{/if}}
<br>{{story.recompense}}
</div>

View File

@ -6,17 +6,17 @@
<div class="flexrow"> <div class="flexrow">
{{#if (eq hp 0)}} {{#if (eq hp 0)}}
La Vitalité de {{name}} est {{hp}} : il va s'écrouler au sol et sombrer dans l'inconscience ! {{localize "BOL.chat.vitalityzero" name=name hp=hp}}
<br>Vous pouvez dépenser 1 Point d'Héroisme pour reprendre vos esprits pendant 1 round. <br>{{localize "BOL.chat.vitalityheroism"}}
<br>Dans ce cas votre vitalité remonte à son maximum divisé par 2 (arrondi au supérieur). <br>{{localize "BOL.chat.vitalityheroismhint"}}
{{else}} {{else}}
La Vitalité de {{name}} est de {{hp}} ! Il est mourant ... {{localize "BOL.chat.vitalitydying" name=name hp=hp}}
<br>Vous pouvez cependant dépenser 1 Point d'Héroisme pour Défier la Mort (cf. page 58). <br>{{localize "BOL.chat.vitalitydyingheroism"}}
{{/if}} {{/if}}
{{#if (lt hp -5)}} {{#if (lt hp -5)}}
<br><strong>{{name}} est mort ! </strong> <br><strong>{{localize "BOL.chat.isdead" name=name}}</strong>
<br>Que son nom soit honoré sur les champs de batailles de Lémurie ! <br>{{localize "BOL.chat.epitaph"}}
{{/if}} {{/if}}
</div> </div>

View File

@ -1,11 +1,8 @@
<h4><strong>Préparation Alchimique : {{alchemy.name}}</strong></h4> <h4><strong>{{localize "BOL.chat.alchemytitle" name=alchemy.name}}</strong></h4>
<h4><strong>Points de Création Investis : {{pcCostCurrent}}</strong></h4> <h4><strong>{{localize "BOL.chat.alchemypoints" pcCostCurrent=pcCostCurrent}}</strong></h4>
{{#if isSuccess}} {{#if isSuccess}}
La préparation alchimique a été réalisée avec succès ! {{localize "BOL.chat.alchemysuccess"}}
<br>Créez l'item ou l'effet correspondant dans votre Inventaire.
<br>L'avancement dans la préparation a été remis à 0.
{{else}} {{else}}
La préparation alchimique a échouée ! {{localize "BOL.chat.alchemyfailure"}}
<br>L'avancement dans la préparation a été remis à 0.
{{/if}} {{/if}}

View File

@ -1,7 +1,7 @@
<button class="chat-damage-roll" data-damage-mode="normal-damage" data-attack-id="{{id}}">Lancer les dommages</button> <button class="chat-damage-roll bol-margin-tb-2" data-damage-mode="normal-damage" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage"}}</button>
{{#if isCritical}} {{#if isCritical}}
<button class="chat-damage-roll" data-damage-mode="damage-plus-6" data-attack-id="{{id}}">Lancer les dommages +6</button> <button class="chat-damage-roll bol-margin-tb-2 " data-damage-mode="damage-plus-6" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage6"}}</button>
<button class="chat-damage-roll" data-damage-mode="damage-plus-12" data-attack-id="{{id}}">Dommages +12 (1 Pt. d'Heroisme)</button> <button class="chat-damage-roll bol-margin-tb-2" data-damage-mode="damage-plus-12" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage12"}}</button>
{{/if}} {{/if}}

View File

@ -1,13 +1,13 @@
<img class="chat-icon" src="{{weapon.img}}" alt="{{weapon.name}}"/> <img class="chat-icon" src="{{weapon.img}}" alt="{{weapon.name}}"/>
<h3><strong>Dommages de {{weapon.name}} : {{damageRoll.total}}</strong></h3> <h3><strong>{{localize "BOL.chat.damageresult" name=weapon.name total=damageRoll.total}}</strong></h3>
{{#if defender}} {{#if defender}}
<h3><strong>Cible : {{defender.name}}</strong></h3> <h3><strong>{{localize "BOL.chat.damagetarget" target=defender.name}}</strong></h3>
{{/if}} {{/if}}
<div class="actions-section"> <div class="actions-section">
{{#if targetId}} {{#if targetId}}
<div id="{{applyId}}"> <div id="{{applyId}}">
<button class="chat-damage-apply" data-attack-id="{{id}}">Appliquer les dommages à la cible</button> <button class="chat-damage-apply" data-attack-id="{{id}}">{{localize "BOL.chat.applydamagetotarget"}}</button>
</div> </div>
<br> <br>
{{/if}} {{/if}}

View File

@ -1,9 +1,13 @@
<div> <div>
{{#if isSuccess}} {{#if isSuccess}}
{{#if isCritical}} {{#if isLegendary}}
<h2 class="success critical"><i class="fas fa-check-double"></i>&nbsp;{{localize "BOL.ui.critical"}}... <h2 class="success critical"><i class="fas fa-check-double"></i>&nbsp;{{localize "BOL.ui.criticallegend"}}...
{{else}} {{else}}
<h2 class="success"><i class="fas fa-check"></i>&nbsp;{{localize "BOL.ui.success"}}... {{#if isCritical}}
<h2 class="success critical"><i class="fas fa-check-double"></i>&nbsp;{{localize "BOL.ui.critical"}}...
{{else}}
<h2 class="success"><i class="fas fa-check"></i>&nbsp;{{localize "BOL.ui.success"}}...
{{/if}}
{{/if}} {{/if}}
{{/if}} {{/if}}
{{#if isFailure}} {{#if isFailure}}
@ -13,20 +17,31 @@
<h2 class="failure"><i class="fas fa-times"></i>&nbsp;{{localize "BOL.ui.failure"}}... <h2 class="failure"><i class="fas fa-times"></i>&nbsp;{{localize "BOL.ui.failure"}}...
{{/if}} {{/if}}
{{/if}} {{/if}}
<img class="chat-icon" src="{{actor.img}}" alt="{{actor.name}}"/> <img class="chat-icon" src="{{img}}" alt="{{actor.name}}"/>
</h2> </h2>
</div> </div>
<h3><strong>{{description}}</strong></h3> <h3><strong>{{description}}</strong></h3>
<div class="actions-section"> <div class="actions-section">
{{#if isFumble}}
{{localize "BOL.chat.fumblemessage"}}
{{/if}}
{{#if fightOption}} {{#if fightOption}}
<div> <div>
Option de combat : {{fightOption.name}} {{localize "BOL.chat.fightoption"}} : {{fightOption.name}}
</div> </div>
{{/if}} {{/if}}
<div id="{{optionsId}}"> <div id="{{optionsId}}">
{{#if isRealCritical}}
<div class="bol-margin-tb-2">
<a class="content-link" draggable="true" data-uuid="Compendium.bol.aides-de-jeu.Yl1RKQb0BjVUtilk" data-id="Yl1RKQb0BjVUtilk" data-type="JournalEntry" data-pack="bol.aides-de-jeu" data-tooltip="un journal"><i class="fas fa-book-open"></i>Succès Héroïque</a>
</div>
{{/if}}
{{#if (and isSuccess weapon)}} {{#if (and isSuccess weapon)}}
{{> "systems/bol/templates/chat/rolls/attack-damage-card.hbs"}} {{> "systems/bol/templates/chat/rolls/attack-damage-card.hbs"}}
{{/if}} {{/if}}
@ -36,18 +51,20 @@
{{#if alchemy}} {{#if alchemy}}
{{> "systems/bol/templates/chat/rolls/alchemy-roll-card.hbs"}} {{> "systems/bol/templates/chat/rolls/alchemy-roll-card.hbs"}}
{{/if}} {{/if}}
{{#if reroll}} {{#if reroll}}
<button class="chat-button button hero-reroll" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">Relancer (1 P. Heroisme)</button> <button class="chat-button button hero-reroll bol-margin-tb-2" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">{{localize "BOL.chat.reroll"}}</button>
{{/if}} {{/if}}
{{#if (and isSuccess (not isCritical))}} {{#if (and isSuccess (not isCritical))}}
<button class="chat-button button transform-heroic-roll" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">Transformer en succés Héroïque (1 P. Héroisme)</button> <button class="chat-button button transform-heroic-roll bol-margin-tb-2" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">{{localize "BOL.chat.toheroic"}}</button>
{{/if}} {{/if}}
{{#if isRealCritical}} {{#if isRealCritical}}
<button class="chat-button button transform-legendary-roll" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">Transformer en succes Légendaire (1 P. Heroisme)</button> <button class="chat-button button transform-legendary-roll bol-margin-tb-2" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">{{localize "BOL.chat.tolegend"}}</button>
{{/if}} {{/if}}
<br> <br>
</div> </div>
</div> </div>

View File

@ -1,18 +1,18 @@
<img class="chat-icon" src="{{defender.img}}" alt="{{defender.name}}"/> <img class="chat-icon" src="{{defender.img}}" alt="{{defender.name}}"/>
{{defender.name}} va encaisser {{damageTotal}} dégats ! {{localize "BOL.chat.hurttitle" name=defender.name damageTotal=damageTotal}}
{{#if damagesIgnoresArmor}} {{#if damagesIgnoresArmor}}
<br>C'est une attaque au défaut de l'armure : vous devez encaisser SANS la protection de l'armure ! <br>{{localize "BOL.chat.armordefault"}}
{{/if}} {{/if}}
<button class="damage-handling" data-defense-mode="damage-with-armor" data-attack-id="{{attackId}}">Encaisser avec la protection de l'armure</button> <button class="damage-handling" data-defense-mode="damage-with-armor" data-attack-id="{{attackId}}">{{localize "BOL.chat.witharmor"}}</button>
<button class="damage-handling" data-defense-mode="damage-without-armor" data-attack-id="{{attackId}}">Encaisser sans la protection de l'armure</button> <button class="damage-handling" data-defense-mode="damage-without-armor" data-attack-id="{{attackId}}">{{localize "BOL.chat.withoutarmor"}}</button>
{{#if defender.data.data.resources.hero.value}} {{#if defender.system.resources.hero.value}}
<button class="damage-handling" data-defense-mode="hero-reduce-damage" data-attack-id="{{attackId}}">Juste une égratignure (1 Point d'Héroisme)</button> <button class="damage-handling" data-defense-mode="hero-reduce-damage" data-attack-id="{{attackId}}">{{localize "BOL.chat.shakeoff"}}</button>
{{#each defenderWeapons as |weapon idx|}} {{#each defenderWeapons as |weapon idx|}}
<button class="damage-handling" data-defense-mode="hero-in-extremis" data-attack-id="{{@root.attackId}}" data-weapon-id="{{weapon._id}}">Parade in Extremis avec {{weapon.name}} (1 Point d'Héroisme)</button> <button class="damage-handling" data-defense-mode="hero-in-extremis" data-attack-id="{{@root.attackId}}" data-weapon-id="{{weapon._id}}">{{localize "BOL.chat.splinteredshield" name=weapon.name}}</button>
{{/each}} {{/each}}
{{/if}} {{/if}}

View File

@ -1,23 +1,22 @@
<img class="chat-icon" src="{{defender.img}}" alt="{{defender.name}}"/> <img class="chat-icon" src="{{defender.img}}" alt="{{defender.name}}"/>
<h3>Dégats subis par {{defender.name}}</h3> <h3>{{localize "BOL.chat.damagesummary" name=name}}</h3>
<ul> <ul>
<li> <li>
{{#if (eq defenseMode "damage-with-armor")}} {{#if (eq defenseMode "damage-with-armor")}}
Protection de l'armure : {{armorProtect}}. {{localize "BOL.chat.protectvalue"}} : {{armorProtect}}.
{{/if}} {{/if}}
{{#if (eq defenseMode "damage-without-armor")}} {{#if (eq defenseMode "damage-without-armor")}}
Aucune protection d'armure ! {{localize "BOL.chat.noprotectvalue"}}
{{/if}} {{/if}}
{{#if (eq defenseMode "hero-reduce-damage")}} {{#if (eq defenseMode "hero-reduce-damage")}}
Protection de l'armure : {{armorProtect}}. {{localize "BOL.chat.protectvalue"}} : {{armorProtect}}.
Un point d'héroisme dépensé, pour une réduction des dommages supplémentaire de {{rollHero.total}}. {{localize "BOL.chat.heroreducedamage" total=rollHero.total}}
{{/if}} {{/if}}
{{#if (eq defenseMode "hero-in-extremis")}} {{#if (eq defenseMode "hero-in-extremis")}}
Aucun dommage encaissé, grâce à la parade in-extremis avec {{weaponHero.name}}. L'arme a été détruite pendant cette parade ! {{localize "BOL.chat.herosplintered" name=weaponHero.name}}
Un point d'héroisme a également été dépensé.
{{/if}} {{/if}}
</li> </li>
<li> <li>
Encaissement final : {{finalDamage}} dégats ! {{localize "BOL.chat.finaldamage" finalDamage=finalDamage}}
</li> </li>
</ul> </ul>

View File

@ -0,0 +1,11 @@
<img class="chat-icon" src="{{defender.img}}" alt="{{defender.name}}"/>
<h3>{{localize "BOL.chat.damagesummary" name=name}}</h3>
<ul>
<li>
{{#if (eq finalDamage 0)}}
{{localize "BOL.chat.nodamagesummary"}}
{{else}}
{{localize "BOL.chat.damageresume" name=name}}
{{/if}}
</li>
</ul>

View File

@ -1,4 +1,4 @@
<h4><strong>Sort : {{spell.name}}</strong></h4> <h4><strong>{{localize "BOL.chat.spell"}} : {{spell.name}}</strong></h4>
<h4><strong>Cout en Points de Pouvoir : {{ppCost}}</strong></h4> <h4><strong>{{localize "BOL.chat.spellcost"}} : {{ppCost}}</strong></h4>
<h4><strong>Points de Pouvoir restants : {{sub ppCurrent ppCost}}</strong></h4> <h4><strong>{{localize "BOL.chat.spellremaining"}} : {{remainingPP}}</strong></h4>

View File

@ -1,5 +1,5 @@
<div class="flexrow box-roll"> <div class="flexrow box-roll">
<div class="flex1 center bg-darkred"> <div class="flex1 center bg-darkred" >
<label for="attr">{{localize 'BOL.ui.attribute'}}</label> <label for="attr">{{localize 'BOL.ui.attribute'}}</label>
</div> </div>
<div class="flex1 center cell"> <div class="flex1 center cell">

View File

@ -1,6 +1,6 @@
{{#if (count boons)}} {{#if (count boons)}}
<div class="flexrow roll-box" > <div class="flexrow roll-box" >
<div class="flex1 center bg-darkred"> <div class="flex1 center bg-darkred" data-tooltip-direction="LEFT" data-tooltip="Click-gauche pour sélectionner, CTRL+Click gauche pour déselectionner">
<label for="mod">{{localize 'BOL.ui.boons'}}</label> <label for="mod">{{localize 'BOL.ui.boons'}}</label>
</div> </div>
<div class="flex1 center cell"> <div class="flex1 center cell">

View File

@ -1,12 +1,12 @@
{{#if careers}} {{#if careers}}
<div class="flexrow roll-box"> <div class="flexrow roll-box">
<div class="flex1 center bg-darkred"> <div class="flex1 center bg-darkred" data-tooltip-direction="LEFT" data-tooltip="Click-gauche pour selectionner, CTRL+Click gauche pour déselectionner">
<label for="mod">{{localize 'BOL.ui.careers'}}</label> <label for="mod">{{localize 'BOL.ui.careers'}}</label>
</div> </div>
<div class="flex1 center cell"> <div class="flex1 center cell">
<select class="flex1" name="career" id="career" data-type="String" multiple> <select class="flex1" name="career" id="career" data-type="String" multiple>
{{#each careers as | career id|}} {{#each careers as | career id|}}
<option value="{{career.data.rank}}">{{career.name}} ({{numberFormat career.data.rank decimals=0 sign=true}})</option> <option value="{{career.system.rank}}">{{career.name}} ({{numberFormat career.system.rank decimals=0 sign=true}})</option>
{{/each}} {{/each}}
</select> </select>
</div> </div>

View File

@ -1,6 +1,6 @@
{{#if (count flaws)}} {{#if (count flaws)}}
<div class="flexrow roll-box"> <div class="flexrow roll-box">
<div class="flex1 center bg-darkred"> <div class="flex1 center bg-darkred" data-tooltip-direction="LEFT" data-tooltip="Click-gauche pour selectionner, CTRL+Click gauche pour déselectionner">
<label for="mod">{{localize 'BOL.ui.flaws'}}</label> <label for="mod">{{localize 'BOL.ui.flaws'}}</label>
</div> </div>
<div class="flex1 center cell"> <div class="flex1 center cell">

View File

@ -6,13 +6,13 @@
<div class="flex1 center cell"> <div class="flex1 center cell">
<select name="modRanged" id="modRanged" value="{{mod}}"> <select name="modRanged" id="modRanged" value="{{mod}}">
{{#select modRanged}} {{#select modRanged}}
<option value="1">Bout portant (+1)</option> <option value="1">{{localize "BOL.dialog.pointblank"}}</option>
<option value="0">Courte (0)</option> <option value="0">{{localize "BOL.dialog.close"}}</option>
<option value="-1">Moyenne (-1)</option> <option value="-1">{{localize "BOL.dialog.medium"}}</option>
<option value="-2">Longue (-2)</option> <option value="-2">{{localize "BOL.dialog.long"}}</option>
<option value="-4">Très longue (-4)</option> <option value="-4">{{localize "BOL.dialog.distant"}}</option>
<option value="-6">Extrême (-6)</option> <option value="-6">{{localize "BOL.dialog.extreme"}}</option>
<option value="-8">Maximale (-8)</option> <option value="-8">{{localize "BOL.dialog.utmost"}}</option>
{{/select}} {{/select}}
</select> </select>
</div> </div>
@ -44,17 +44,17 @@
<div class="flex1 center cell"> <div class="flex1 center cell">
<select name="mod" id="mod" value="{{mod}}"> <select name="mod" id="mod" value="{{mod}}">
{{#select mod}} {{#select mod}}
<option value="4">Inmanquable (+4)</option> <option value="4">{{localize "BOL.dialog.soeasy"}}</option>
<option value="2">Trés Facile (+2)</option> <option value="2">{{localize "BOL.dialog.veryeasy"}}</option>
<option value="1">Facile (+1)</option> <option value="1">{{localize "BOL.dialog.easy"}}</option>
<option value="0">Moyenne (0)</option> <option value="0">{{localize "BOL.dialog.moderate"}}</option>
<option value="-1">Ardue (-1)</option> <option value="-1">{{localize "BOL.dialog.hard"}}</option>
<option value="-2">Difficile (-2)</option> <option value="-2">{{localize "BOL.dialog.tough"}}</option>
<option value="-4">Très Difficile (-4)</option> <option value="-4">{{localize "BOL.dialog.demanding"}}</option>
<option value="-6">Impossible (-6)</option> <option value="-6">{{localize "BOL.dialog.formidable"}}</option>
<option value="-8">Héroïque (-8)</option> <option value="-8">{{localize "BOL.dialog.heroic"}}</option>
<option value="-10">Mythique (-10)</option> <option value="-10">{{localize "BOL.dialog.mythic"}}</option>
<option value="-12">Divine (-12)</option> <option value="-12">{{localize "BOL.dialog.divine"}}</option>
{{/select}} {{/select}}
</select> </select>
</div> </div>

View File

@ -8,7 +8,7 @@
</div> </div>
</header> </header>
{{#if weapon.data.data.properties.onlymodifier}} {{#if weapon.system.properties.onlymodifier}}
{{else}} {{else}}
{{> "systems/bol/templates/dialogs/attribute-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/attribute-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/aptitude-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/aptitude-roll-part.hbs"}}
@ -18,7 +18,7 @@
<div class="flex1 center bg-darkred"> <div class="flex1 center bg-darkred">
<label for="mod">{{localize 'BOL.ui.attackValue'}}</label> <label for="mod">{{localize 'BOL.ui.attackValue'}}</label>
</div> </div>
<div class="flex1 center cell">{{weapon.data.data.properties.attackModifiers}}</div> <div class="flex1 center cell">{{weapon.system.properties.attackModifiers}}</div>
</div> </div>
<div class="flexrow roll-box" > <div class="flexrow roll-box" >

View File

@ -20,7 +20,7 @@
</div> </div>
{{/if}} {{/if}}
{{editor content=data.description target="data.description" button=true owner=owner editable=editable}} {{editor description target="system.description" button=true owner=owner editable=editable}}
</div> </div>
<div class="tab properties" data-group="primary" data-tab="properties"> <div class="tab properties" data-group="primary" data-tab="properties">
{{#if (eq item.type "item")}} {{#if (eq item.type "item")}}

View File

@ -1,7 +1,7 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.subtype"}}</label> <label class="property-label">{{localize "BOL.ui.subtype"}}</label>
<select name="data.subtype" value="{{data.subtype}}" data-dtype="String"> <select name="system.subtype" value="{{item.system.subtype}}" data-dtype="String">
{{#select data.subtype}} {{#select item.system.subtype}}
{{#each config.featureSubtypes as |item id|}} {{#each config.featureSubtypes as |item id|}}
<option value="{{id}}">{{localize item}}</option> <option value="{{id}}">{{localize item}}</option>
{{/each}} {{/each}}
@ -9,18 +9,18 @@
</select> </select>
</div> </div>
{{#if (equals data.subtype "career")}} {{#if (equals item.system.subtype "career")}}
{{> "systems/bol/templates/item/parts/properties/feature/career-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/feature/career-properties.hbs"}}
{{/if}} {{/if}}
{{#if (equals data.subtype "fightoption")}} {{#if (equals item.system.subtype "fightoption")}}
{{> "systems/bol/templates/item/parts/properties/feature/fightoption-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/feature/fightoption-properties.hbs"}}
{{/if}} {{/if}}
{{!#if (equals data.subtype "race")}} {{!#if (equals data.subtype "race")}}
{{!> "systems/bol/templates/item/parts/properties/feature/race-properties.hbs"}} {{!> "systems/bol/templates/item/parts/properties/feature/race-properties.hbs"}}
{{!/if}} {{!/if}}
{{#if (equals data.subtype "boon")}} {{#if (equals item.system.subtype "boon")}}
{{> "systems/bol/templates/item/parts/properties/feature/boon-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/feature/boon-properties.hbs"}}
{{/if}} {{/if}}
{{#if (equals data.subtype "flaw")}} {{#if (equals item.system.subtype "flaw")}}
{{> "systems/bol/templates/item/parts/properties/feature/flaw-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/feature/flaw-properties.hbs"}}
{{/if}} {{/if}}

View File

@ -1,5 +1,5 @@
<h3 class="form-header">{{localize 'BOL.featureSubtypes.boon'}}</h3> <h3 class="form-header">{{localize 'BOL.featureSubtypes.boon'}}</h3>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.isbonusdice"}}</label> <label class="property-label">{{localize "BOL.ui.isbonusdice"}}</label>
<input class="field-value" type="checkbox" name="data.properties.isbonusdice" {{checked data.properties.isbonusdice}}> <input class="field-value" type="checkbox" name="system.properties.isbonusdice" {{checked item.system.properties.isbonusdice}}>
</div> </div>

View File

@ -1,17 +1,17 @@
<h3 class="form-header">{{localize 'BOL.featureSubtypes.career'}}</h3> <h3 class="form-header">{{localize 'BOL.featureSubtypes.career'}}</h3>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.rank"}}</label> <label class="property-label">{{localize "BOL.ui.rank"}}</label>
<input type="text" name="data.rank" value="{{data.rank}}" data-dtype="Number"/> <input type="text" name="system.rank" value="{{item.system.rank}}" data-dtype="Number"/>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.isSorcerer"}}</label> <label class="property-label">{{localize "BOL.ui.isSorcerer"}}</label>
<input class="field-value" type="checkbox" name="data.properties.sorcerer" {{checked data.properties.sorcerer}}> <input class="field-value" type="checkbox" name="system.properties.sorcerer" {{checked item.system.properties.sorcerer}}>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.isAlchemist"}}</label> <label class="property-label">{{localize "BOL.ui.isAlchemist"}}</label>
<input class="field-value" type="checkbox" name="data.properties.alchemist" {{checked data.properties.alchemist}}> <input class="field-value" type="checkbox" name="system.properties.alchemist" {{checked item.system.properties.alchemist}}>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.isPriest"}}</label> <label class="property-label">{{localize "BOL.ui.isPriest"}}</label>
<input class="field-value" type="checkbox" name="data.properties.priest" {{checked data.properties.priest}}> <input class="field-value" type="checkbox" name="system.properties.priest" {{checked item.system.properties.priest}}>
</div> </div>

View File

@ -3,8 +3,8 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.ui.fightOptionType"}}</label> <label class="property-label">{{localize "BOL.ui.fightOptionType"}}</label>
<div class="form-fields"> <div class="form-fields">
<select name="data.properties.fightoptiontype" data-dtype="String"> <select name="system.properties.fightoptiontype" data-dtype="String">
{{#select data.properties.fightoptiontype}} {{#select item.system.properties.fightoptiontype}}
{{#each config.fightOptionTypes as |item id|}} {{#each config.fightOptionTypes as |item id|}}
<option value="{{id}}">{{localize item}}</option> <option value="{{id}}">{{localize item}}</option>
{{/each}} {{/each}}
@ -14,6 +14,6 @@
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.activated"}}</label> <label class="property-label">{{localize "BOL.ui.activated"}}</label>
<input class="field-value" type="checkbox" name="data.properties.activated" {{checked data.properties.activated}}> <input class="field-value" type="checkbox" name="system.properties.activated" {{checked item.system.properties.activated}}>
</div> </div>

View File

@ -1,5 +1,5 @@
<h3 class="form-header">{{localize 'BOL.featureSubtypes.flaw'}}</h3> <h3 class="form-header">{{localize 'BOL.featureSubtypes.flaw'}}</h3>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.ismalusdice"}}</label> <label class="property-label">{{localize "BOL.ui.ismalusdice"}}</label>
<input class="field-value" type="checkbox" name="data.properties.ismalusdice" {{checked data.properties.ismalusdice}}> <input class="field-value" type="checkbox" name="system.properties.ismalusdice" {{checked item.system.properties.ismalusdice}}>
</div> </div>

View File

@ -1,8 +1,8 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.ui.category"}}</label> <label class="property-label">{{localize "BOL.ui.category"}}</label>
<div class="form-fields"> <div class="form-fields">
<select class="field-value" name="data.category" value="{{data.category}}" data-dtype="String"> <select class="field-value" name="system.category" value="{{item.system.category}}" data-dtype="String">
{{#select data.category}} {{#select item.system.category}}
{{#each config.itemCategories as |item id|}} {{#each config.itemCategories as |item id|}}
<option value="{{id}}">{{localize item}}</option> <option value="{{id}}">{{localize item}}</option>
{{/each}} {{/each}}
@ -11,18 +11,18 @@
</div> </div>
</div> </div>
{{#if (eq data.category "equipment")}} {{#if (eq item.system.category "equipment")}}
{{> "systems/bol/templates/item/parts/properties/item/equipment-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item/equipment-properties.hbs"}}
{{/if}} {{/if}}
{{#if (eq data.category "capacity")}} {{#if (eq item.system.category "capacity")}}
{{> "systems/bol/templates/item/parts/properties/item/capacity-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item/capacity-properties.hbs"}}
{{/if}} {{/if}}
{{#if (eq data.category "vehicle")}} {{#if (eq item.system.category "vehicle")}}
{{> "systems/bol/templates/item/parts/properties/item/vehicle-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item/vehicle-properties.hbs"}}
{{/if}} {{/if}}
{{#if (eq data.category "spell")}} {{#if (eq item.system.category "spell")}}
{{> "systems/bol/templates/item/parts/properties/item/spell-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item/spell-properties.hbs"}}
{{/if}} {{/if}}
{{#if (eq data.category "alchemy")}} {{#if (eq item.system.category "alchemy")}}
{{> "systems/bol/templates/item/parts/properties/item/alchemy-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item/alchemy-properties.hbs"}}
{{/if}} {{/if}}

View File

@ -2,8 +2,8 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.alchemyType"}}</label> <label class="property-label">{{localize "BOL.ui.alchemyType"}}</label>
<select class="field-value" name="data.properties.alchemytype" data-dtype="String"> <select class="field-value" name="system.properties.alchemytype" data-dtype="String">
{{#select data.properties.alchemytype}} {{#select item.system.properties.alchemytype}}
{{#each config.alchemyType as |value id|}} {{#each config.alchemyType as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -13,27 +13,27 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.difficulty"}}</label> <label class="property-label">{{localize "BOL.ui.difficulty"}}</label>
<select name="data.properties.difficulty" value="{{data.properties.difficulty}}"> <select name="system.properties.difficulty" value="{{item.system.properties.difficulty}}">
{{#select data.properties.difficulty}} {{#select item.system.properties.difficulty}}
<option value="2">Trés Facile (+2)</option> <option value="2">{{localize "BOL.dialog.veryeasy"}}</option>
<option value="1">Facile (+1)</option> <option value="1">{{localize "BOL.dialog.easy"}}</option>
<option value="0">Moyenne (0)</option> <option value="0">{{localize "BOL.dialog.moderate"}}</option>
<option value="-1">Ardue (-1)</option> <option value="-1">{{localize "BOL.dialog.hard"}}</option>
<option value="-2">Difficile (-2)</option> <option value="-2">{{localize "BOL.dialog.tough"}}</option>
<option value="-4">Très Difficile (-4)</option> <option value="-4">{{localize "BOL.dialog.demanding"}}</option>
<option value="-6">Impossible (-6)</option> <option value="-6">{{localize "BOL.dialog.formidable"}}</option>
<option value="-8">Héroïque (-8)</option> <option value="-8">{{localize "BOL.dialog.heroic"}}</option>
{{/select}} {{/select}}
</select> </select>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.pccost"}}</label> <label class="property-label">{{localize "BOL.ui.pccost"}}</label>
<input class="field-value" type="text" name="data.properties.pccost" value="{{data.properties.pccost}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.pccost" value="{{item.system.properties.pccost}}" data-dtype="Number"/>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.pcnow"}}</label> <label class="property-label">{{localize "BOL.ui.pcnow"}}</label>
<input class="field-value" type="text" name="data.properties.pccurrent" value="{{data.properties.pccurrent}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.pccurrent" value="{{item.system.properties.pccurrent}}" data-dtype="Number"/>
</div> </div>

View File

@ -3,23 +3,23 @@
<label class="property-label">{{localize "BOL.ui.type"}}</label> <label class="property-label">{{localize "BOL.ui.type"}}</label>
<div class="form-fields"> <div class="form-fields">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.weapon" {{checked data.properties.weapon}}> {{localize "BOL.itemProperty.weapon"}} <input class="field-value" type="checkbox" name="system.properties.weapon" {{checked item.system.properties.weapon}}> {{localize "BOL.itemProperty.weapon"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.protection" {{checked data.properties.protection}}> {{localize "BOL.itemProperty.protection"}} <input class="field-value" type="checkbox" name="system.properties.protection" {{checked item.system.properties.protection}}> {{localize "BOL.itemProperty.protection"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.magical" {{checked data.properties.magical}}> {{localize "BOL.itemProperty.magical"}} <input class="field-value" type="checkbox" name="system.properties.magical" {{checked item.system.properties.magical}}> {{localize "BOL.itemProperty.magical"}}
</label> </label>
</div> </div>
</div> </div>
{{#if data.properties.weapon}} {{#if item.system.properties.weapon}}
{{> "systems/bol/templates/item/parts/properties/item/weapon-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item/weapon-properties.hbs"}}
{{/if}} {{/if}}
{{#if data.properties.protection}} {{#if item.system.properties.protection}}
{{> "systems/bol/templates/item/parts/properties/item/protection-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item/protection-properties.hbs"}}
{{/if}} {{/if}}
{{#if data.properties.magical}} {{#if item.system.properties.magical}}
{{> "systems/bol/templates/item/parts/properties/item/magical-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item/magical-properties.hbs"}}
{{/if}} {{/if}}

View File

@ -3,8 +3,8 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.ui.subtype"}}</label> <label class="property-label">{{localize "BOL.ui.subtype"}}</label>
<div class="form-fields"> <div class="form-fields">
<select name="data.subtype" data-dtype="String"> <select name="system.subtype" data-dtype="String">
{{#select data.subtype}} {{#select item.system.subtype}}
{{#each config.itemSubtypes as |item id|}} {{#each config.itemSubtypes as |item id|}}
<option value="{{id}}">{{localize item}}</option> <option value="{{id}}">{{localize item}}</option>
{{/each}} {{/each}}
@ -17,13 +17,13 @@
<label class="property-label">{{localize "BOL.ui.capacities"}}</label> <label class="property-label">{{localize "BOL.ui.capacities"}}</label>
<div class="form-fields"> <div class="form-fields">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.weapon" {{checked data.properties.weapon}}> {{localize "BOL.itemProperty.weapon"}} <input class="field-value" type="checkbox" name="system.properties.weapon" {{checked item.system.properties.weapon}}> {{localize "BOL.itemProperty.weapon"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.protection" {{checked data.properties.protection}}> {{localize "BOL.itemProperty.protection"}} <input class="field-value" type="checkbox" name="system.properties.protection" {{checked item.system.properties.protection}}> {{localize "BOL.itemProperty.protection"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.magical" {{checked data.properties.magical}}> {{localize "BOL.itemProperty.magical"}} <input class="field-value" type="checkbox" name="system.properties.magical" {{checked item.system.properties.magical}}> {{localize "BOL.itemProperty.magical"}}
</label> </label>
</div> </div>
</div> </div>
@ -32,31 +32,31 @@
<label class="property-label">{{localize "BOL.ui.properties"}}</label> <label class="property-label">{{localize "BOL.ui.properties"}}</label>
<div class="form-fields"> <div class="form-fields">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.equipable" {{checked data.properties.equipable}}> {{localize "BOL.itemProperty.equipable"}} <input class="field-value" type="checkbox" name="system.properties.equipable" {{checked item.system.properties.equipable}}> {{localize "BOL.itemProperty.equipable"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.stackable" {{checked data.properties.stackable}}> {{localize "BOL.itemProperty.stackable"}} <input class="field-value" type="checkbox" name="system.properties.stackable" {{checked item.system.properties.stackable}}> {{localize "BOL.itemProperty.stackable"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.consumable" {{checked data.properties.consumable}}> {{localize "BOL.itemProperty.consumable"}} <input class="field-value" type="checkbox" name="system.properties.consumable" {{checked item.system.properties.consumable}}> {{localize "BOL.itemProperty.consumable"}}
</label> </label>
</div> </div>
</div> </div>
<hr/> <hr/>
{{#if data.properties.equipable}} {{#if item.system.properties.equipable}}
<div class="form-group"> <div class="form-group">
<label>{{localize "BOL.itemProperty.worn"}}</label> <label>{{localize "BOL.itemProperty.worn"}}</label>
<div class="form-fields"> <div class="form-fields">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.worn" {{checked data.worn}}> {{localize "BOL.itemProperty.worn"}} <input class="field-value" type="checkbox" name="system.worn" {{checked item.system.worn}}> {{localize "BOL.itemProperty.worn"}}
</label> </label>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label>{{localize "BOL.itemProperty.slot"}}</label> <label>{{localize "BOL.itemProperty.slot"}}</label>
<div class="form-fields center"> <div class="form-fields center">
<select class="field-value" name="data.properties.slot" data-dtype="String"> <select class="field-value" name="system.properties.slot" data-dtype="String">
{{#select data.properties.slot}} {{#select item.system.properties.slot}}
{{#each config.equipmentSlots as |value id|}} {{#each config.equipmentSlots as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -66,41 +66,35 @@
</div> </div>
{{/if}} {{/if}}
{{#if data.properties.stackable}} {{#if item.system.properties.stackable}}
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.ui.quantity"}}</label> <label class="property-label">{{localize "BOL.ui.quantity"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value" type="text" name="data.quantity" value="{{data.quantity}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.quantity" value="{{item.system.quantity}}" data-dtype="Number"/>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.ui.stacksize"}}</label> <label class="property-label">{{localize "BOL.ui.stacksize"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value" type="text" name="data.properties.stacksize" value="{{data.properties.stacksize}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.stacksize" value="{{item.system.properties.stacksize}}" data-dtype="Number"/>
</div> </div>
</div> </div>
{{/if}} {{/if}}
<!--<div class="form-group">-->
<!-- <label class="property-label">{{!localize "BOL.ui.weight"}}</label>-->
<!-- <div class="form-fields">-->
<!-- <input class="field-value" type="text" name="data.weight" value="{{!data.weight}}" data-dtype="Number"/>-->
<!-- </div>-->
<!--</div>-->
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.ui.price"}}</label> <label class="property-label">{{localize "BOL.ui.price"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value" type="text" name="data.price" value="{{data.price}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.price" value="{{item.system.price}}" data-dtype="Number"/>
</div> </div>
</div> </div>
{{#if data.properties.weapon}} {{#if item.system.properties.weapon}}
{{> "systems/bol/templates/item/parts/properties/item/weapon-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item/weapon-properties.hbs"}}
{{/if}} {{/if}}
{{#if data.properties.protection}} {{#if item.system.properties.protection}}
{{> "systems/bol/templates/item/parts/properties/item/protection-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item/protection-properties.hbs"}}
{{/if}} {{/if}}
{{#if data.properties.magical}} {{#if item.system.properties.magical}}
{{> "systems/bol/templates/item/parts/properties/item/magical-properties.hbs"}} {{> "systems/bol/templates/item/parts/properties/item/magical-properties.hbs"}}
{{/if}} {{/if}}

View File

@ -3,31 +3,24 @@
<label>{{localize "BOL.ui.subtype"}}</label> <label>{{localize "BOL.ui.subtype"}}</label>
<div class="form-fields"> <div class="form-fields">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.armor" {{checked data.properties.armor}}> {{localize "BOL.itemProperty.armor"}} <input class="field-value" type="checkbox" name="system.properties.armor" {{checked item.system.properties.armor}}> {{localize "BOL.itemProperty.armor"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.shield" {{checked data.properties.shield}}> {{localize "BOL.itemProperty.shield"}} <input class="field-value" type="checkbox" name="system.properties.shield" {{checked item.system.properties.shield}}> {{localize "BOL.itemProperty.shield"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.helm" {{checked data.properties.helm}}> {{localize "BOL.itemProperty.helm"}} <input class="field-value" type="checkbox" name="system.properties.helm" {{checked item.system.properties.helm}}> {{localize "BOL.itemProperty.helm"}}
</label> </label>
</div> </div>
</div> </div>
<hr/> <hr/>
<!--<div class="form-group">-->
<!-- <label>{{!localize "BOL.ui.properties"}}</label>--> {{#if item.system.properties.armor}}
<!-- <div class="form-fields">-->
<!-- <label class="checkbox">-->
<!-- <input class="field-value" type="checkbox" name="data.properties.throwable" {{!checked data.properties.throwable}}> {{!localize "BOL.itemProperty.throwable"}}-->
<!-- </label>-->
<!-- </div>-->
<!--</div>-->
{{#if data.properties.armor}}
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.armorQuality"}}</label> <label class="property-label">{{localize "BOL.itemProperty.armorQuality"}}</label>
<div class="form-fields center"> <div class="form-fields center">
<select class="field-value armorQuality" name="data.properties.armorQuality" data-dtype="String"> <select class="field-value armorQuality" name="system.properties.armorQuality" data-dtype="String">
{{#select data.properties.armorQuality}} {{#select item.system.properties.armorQuality}}
{{#each config.armorQualities as |value id|}} {{#each config.armorQualities as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -38,41 +31,41 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.soakFormula"}}</label> <label class="property-label">{{localize "BOL.itemProperty.soakFormula"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value soakFormula" type="text" name="data.properties.soak.formula" value="{{data.properties.soak.formula}}" data-dtype="String"/> <input class="field-value soakFormula" type="text" name="system.properties.soak.formula" value="{{item.system.properties.soak.formula}}" data-dtype="String"/>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.soakValue"}}</label> <label class="property-label">{{localize "BOL.itemProperty.soakValue"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value" type="text" name="data.properties.soak.value" value="{{data.properties.soak.value}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.soak.value" value="{{item.system.properties.soak.value}}" data-dtype="Number"/>
</div> </div>
</div> </div>
{{/if}} {{/if}}
{{#if data.properties.helm}} {{#if item.system.properties.helm}}
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.soakModifiers"}}</label> <label class="property-label">{{localize "BOL.itemProperty.soakModifiers"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value" type="text" name="data.properties.soak.modifier" value="{{data.properties.soak.modifier}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.soak.modifier" value="{{item.system.properties.soak.modifier}}" data-dtype="Number"/>
</div> </div>
</div> </div>
{{/if}} {{/if}}
{{#if data.properties.shield}} {{#if item.system.properties.shield}}
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.blockingMalus"}}</label> <label class="property-label">{{localize "BOL.itemProperty.blockingMalus"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value" type="text" name="data.properties.blocking.malus" value="{{data.properties.blocking.malus}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.blocking.malus" value="{{item.system.properties.blocking.malus}}" data-dtype="Number"/>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.blockingAttacksBlocked"}}</label> <label class="property-label">{{localize "BOL.itemProperty.blockingAttacksBlocked"}}</label>
<div class="form-fields"> <div class="form-fields">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.blocking.blocking1" {{checked data.properties.blocking.blocking1}}> {{localize "BOL.itemProperty.blocking1Attack"}} <input class="field-value" type="checkbox" name="system.properties.blocking.blocking1" {{checked item.system.properties.blocking.blocking1}}> {{localize "BOL.itemProperty.blocking1Attack"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.blocking.blockingAll" {{checked data.properties.blocking.blockingAll}}> {{localize "BOL.itemProperty.blockingAllAttacks"}} <input class="field-value" type="checkbox" name="system.properties.blocking.blockingAll" {{checked item.system.properties.blocking.blockingAll}}> {{localize "BOL.itemProperty.blockingAllAttacks"}}
</label> </label>
</div> </div>
</div> </div>
@ -83,26 +76,26 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemModifiers.init"}}</label> <label class="property-label">{{localize "BOL.itemModifiers.init"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value" type="text" name="data.properties.modifiers.init" value="{{data.properties.modifiers.c}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.modifiers.init" value="{{item.system.properties.modifiers.c}}" data-dtype="Number"/>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemModifiers.agility"}}</label> <label class="property-label">{{localize "BOL.itemModifiers.agility"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value" type="text" name="data.properties.modifiers.agility" value="{{data.properties.modifiers.agility}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.modifiers.agility" value="{{item.system.properties.modifiers.agility}}" data-dtype="Number"/>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemModifiers.powercost"}}</label> <label class="property-label">{{localize "BOL.itemModifiers.powercost"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value" type="text" name="data.properties.modifiers.powercost" value="{{data.properties.modifiers.powercost}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.modifiers.powercost" value="{{item.system.properties.modifiers.powercost}}" data-dtype="Number"/>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemModifiers.social"}}</label> <label class="property-label">{{localize "BOL.itemModifiers.social"}}</label>
<div class="form-fields"> <div class="form-fields">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.modifiers.social" {{checked data.properties.modifiers.social}}> <input class="field-value" type="checkbox" name="system.properties.modifiers.social" {{checked item.system.properties.modifiers.social}}>
</label> </label>
</div> </div>
</div> </div>

View File

@ -2,8 +2,8 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.circle"}}</label> <label class="property-label">{{localize "BOL.ui.circle"}}</label>
<select class="field-value" name="data.properties.circle" data-dtype="Number"> <select class="field-value" name="system.properties.circle" data-dtype="Number">
{{#select data.properties.circle}} {{#select item.system.properties.circle}}
{{#each config.spellType as |value id|}} {{#each config.spellType as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -13,34 +13,34 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.difficulty"}}</label> <label class="property-label">{{localize "BOL.ui.difficulty"}}</label>
<select name="data.properties.difficulty" value="{{data.properties.difficulty}}"> <select name="system.properties.difficulty" value="{{item.system.properties.difficulty}}">
{{#select data.properties.difficulty}} {{#select item.system.properties.difficulty}}
<option value="2">Trés Facile (+2)</option> <option value="2">{{localize "BOL.dialog.veryeasy"}}</option>
<option value="1">Facile (+1)</option> <option value="1">{{localize "BOL.dialog.easy"}}</option>
<option value="0">Moyenne (0)</option> <option value="0">{{localize "BOL.dialog.moderate"}}</option>
<option value="-1">Ardue (-1)</option> <option value="-1">{{localize "BOL.dialog.hard"}}</option>
<option value="-2">Difficile (-2)</option> <option value="-2">{{localize "BOL.dialog.tough"}}</option>
<option value="-4">Très Difficile (-4)</option> <option value="-4">{{localize "BOL.dialog.demanding"}}</option>
<option value="-6">Impossible (-6)</option> <option value="-6">{{localize "BOL.dialog.formidable"}}</option>
<option value="-8">Héroïque (-8)</option> <option value="-8">{{localize "BOL.dialog.heroic"}}</option>
{{/select}} {{/select}}
</select> </select>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.ppcost"}}</label> <label class="property-label">{{localize "BOL.ui.ppcost"}}</label>
<input class="field-value" type="text" name="data.properties.ppcost" value="{{data.properties.ppcost}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.ppcost" value="{{item.system.properties.ppcost}}" data-dtype="Number"/>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.duration"}}</label> <label class="property-label">{{localize "BOL.ui.duration"}}</label>
<input class="field-value" type="text" name="data.properties.duration" value="{{data.properties.duration}}" data-dtype="String"/> <input class="field-value" type="text" name="system.properties.duration" value="{{item.system.properties.duration}}" data-dtype="String"/>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.mandatoryconditions"}}</label> <label class="property-label">{{localize "BOL.ui.mandatoryconditions"}}</label>
<select class="field-value" name="data.properties.nbmandatoryconditions" data-dtype="Number"> <select class="field-value" name="system.properties.nbmandatoryconditions" data-dtype="Number">
{{#select data.properties.nbmandatoryconditions}} {{#select item.system.properties.nbmandatoryconditions}}
<option value="1">1</option> <option value="1">1</option>
<option value="2">2</option> <option value="2">2</option>
<option value="3">3</option> <option value="3">3</option>
@ -49,19 +49,19 @@
</select> </select>
</div> </div>
{{#each data.properties.mandatoryconditions as |cond idx|}} {{#each item.system.properties.mandatoryconditions as |cond idx|}}
{{#if (lt idx @root.data.properties.nbmandatoryconditions)}} {{#if (lt idx @root.item.system.properties.nbmandatoryconditions)}}
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.mandatoryconditions"}} {{add idx 1}}</label> <label class="property-label">{{localize "BOL.ui.mandatoryconditions"}} {{add idx 1}}</label>
<input class="field-value" type="text" name="data.properties.mandatoryconditions.{{idx}}" value="{{cond}}" data-dtype="String"/> <input class="field-value" type="text" name="system.properties.mandatoryconditions.{{idx}}" value="{{cond}}" data-dtype="String"/>
</div> </div>
{{/if}} {{/if}}
{{/each}} {{/each}}
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.optionnalconditions"}}</label> <label class="property-label">{{localize "BOL.ui.optionnalconditions"}}</label>
<select class="field-value" name="data.properties.nboptionnalconditions" data-dtype="Number"> <select class="field-value" name="system.properties.nboptionnalconditions" data-dtype="Number">
{{#select data.properties.nboptionnalconditions}} {{#select item.system.properties.nboptionnalconditions}}
<option value="1">1</option> <option value="1">1</option>
<option value="2">2</option> <option value="2">2</option>
<option value="3">3</option> <option value="3">3</option>
@ -74,11 +74,11 @@
</select> </select>
</div> </div>
{{#each data.properties.optionnalconditions as |cond idx|}} {{#each item.system.optionnalconditions as |cond idx|}}
{{#if (lt idx @root.data.properties.nboptionnalconditions)}} {{#if (lt idx @root.item.system.properties.nboptionnalconditions)}}
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.optionnalconditions"}} {{add idx 1}}</label> <label class="property-label">{{localize "BOL.ui.optionnalconditions"}} {{add idx 1}}</label>
<input class="field-value" type="text" name="data.properties.optionnalconditions.{{idx}}" value="{{cond}}" data-dtype="String"/> <input class="field-value" type="text" name="system.properties.optionnalconditions.{{idx}}" value="{{cond}}" data-dtype="String"/>
</div> </div>
{{/if}} {{/if}}
{{/each}} {{/each}}
@ -86,12 +86,12 @@
<div class="property flexrow"> <div class="property flexrow">
<div class="form-fields center"> <div class="form-fields center">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.spellkeep" {{checked data.properties.spellkeep}}> {{localize "BOL.ui.spellkeep"}} <input class="field-value" type="checkbox" name="system.properties.spellkeep" {{checked item.system.properties.spellkeep}}> {{localize "BOL.ui.spellkeep"}}
</label> </label>
</div> </div>
<div class="form-fields center"> <div class="form-fields center">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.concentrate" {{checked data.properties.concentrate}}> {{localize "BOL.ui.concentrate"}} <input class="field-value" type="checkbox" name="system.properties.concentrate" {{checked item.system.properties.concentrate}}> {{localize "BOL.ui.concentrate"}}
</label> </label>
</div> </div>
</div> </div>

View File

@ -3,8 +3,8 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.ui.subtype"}}</label> <label class="property-label">{{localize "BOL.ui.subtype"}}</label>
<div class="form-fields"> <div class="form-fields">
<select name="data.subtype" data-dtype="String"> <select name="system.subtype" data-dtype="String">
{{#select data.subtype}} {{#select item.system.subtype}}
{{#each config.vehicleSubtypes as |item id|}} {{#each config.vehicleSubtypes as |item id|}}
<option value="{{id}}">{{localize item}}</option> <option value="{{id}}">{{localize item}}</option>
{{/each}} {{/each}}
@ -16,13 +16,13 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.ui.speed"}}</label> <label class="property-label">{{localize "BOL.ui.speed"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value" type="text" name="data.properties.speed" value="{{data.properties.speed}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.speed" value="{{item.system.properties.speed}}" data-dtype="Number"/>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.ui.price"}}</label> <label class="property-label">{{localize "BOL.ui.price"}}</label>
<div class="form-fields"> <div class="form-fields">
<input class="field-value" type="text" name="data.price" value="{{data.price}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.price" value="{{item.system.price}}" data-dtype="Number"/>
</div> </div>
</div> </div>

View File

@ -3,16 +3,16 @@
<label>{{localize "BOL.ui.reach"}}</label> <label>{{localize "BOL.ui.reach"}}</label>
<div class="form-fields"> <div class="form-fields">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.melee" {{checked data.properties.melee}}> {{localize "BOL.itemProperty.melee"}} <input class="field-value" type="checkbox" name="system.properties.melee" {{checked item.system.properties.melee}}> {{localize "BOL.itemProperty.melee"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.ranged" {{checked data.properties.ranged}}> {{localize "BOL.itemProperty.ranged"}} <input class="field-value" type="checkbox" name="system.properties.ranged" {{checked item.system.properties.ranged}}> {{localize "BOL.itemProperty.ranged"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.throwing" {{checked data.properties.throwing}}> {{localize "BOL.itemProperty.throwing"}} <input class="field-value" type="checkbox" name="system.properties.throwing" {{checked item.system.properties.throwing}}> {{localize "BOL.itemProperty.throwing"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.natural" {{checked data.properties.natural}}> {{localize "BOL.itemProperty.natural"}} <input class="field-value" type="checkbox" name="system.properties.natural" {{checked item.system.properties.natural}}> {{localize "BOL.itemProperty.natural"}}
</label> </label>
</div> </div>
</div> </div>
@ -21,44 +21,44 @@
<label>{{localize "BOL.ui.properties"}}</label> <label>{{localize "BOL.ui.properties"}}</label>
<div class="form-fields"> <div class="form-fields">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.2H" {{checked data.properties.2H}}> {{localize "BOL.itemProperty.2H"}} <input class="field-value" type="checkbox" name="system.properties.2H" {{checked item.system.properties.2H}}> {{localize "BOL.itemProperty.2H"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.concealable" {{checked data.properties.concealable}}> {{localize "BOL.itemProperty.concealable"}} <input class="field-value" type="checkbox" name="system.properties.concealable" {{checked item.system.properties.concealable}}> {{localize "BOL.itemProperty.concealable"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.ignoreshield" {{checked data.properties.ignoreshield}}> {{localize "BOL.itemProperty.ignoreshield"}} <input class="field-value" type="checkbox" name="system.properties.ignoreshield" {{checked item.system.properties.ignoreshield}}> {{localize "BOL.itemProperty.ignoreshield"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.attackBonusDice" {{checked data.properties.attackBonusDice}}> {{localize "BOL.itemProperty.attackBonusDice"}} <input class="field-value" type="checkbox" name="system.properties.attackBonusDice" {{checked item.system.properties.attackBonusDice}}> {{localize "BOL.itemProperty.attackBonusDice"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.onlymodifier" {{checked data.properties.onlymodifier}}> {{localize "BOL.itemProperty.onlymodifier"}} <input class="field-value" type="checkbox" name="system.properties.onlymodifier" {{checked item.system.properties.onlymodifier}}> {{localize "BOL.itemProperty.onlymodifier"}}
</label> </label>
{{#if data.properties.ranged}} {{#if item.system.properties.ranged}}
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.reloadable" {{checked data.properties.reloadable}}> {{localize "BOL.itemProperty.reloadable"}} <input class="field-value" type="checkbox" name="system.properties.reloadable" {{checked item.system.properties.reloadable}}> {{localize "BOL.itemProperty.reloadable"}}
</label> </label>
{{/if}} {{/if}}
{{#if data.properties.melee}} {{#if item.system.properties.melee}}
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.bashing" {{checked data.properties.bashing}}> {{localize "BOL.itemProperty.bashing"}} <input class="field-value" type="checkbox" name="system.properties.bashing" {{checked item.system.properties.bashing}}> {{localize "BOL.itemProperty.bashing"}}
</label> </label>
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.throwable" {{checked data.properties.throwable}}> {{localize "BOL.itemProperty.throwable"}} <input class="field-value" type="checkbox" name="system.properties.throwable" {{checked item.system.properties.throwable}}> {{localize "BOL.itemProperty.throwable"}}
</label> </label>
{{/if}} {{/if}}
</div> </div>
</div> </div>
<hr/> <hr/>
{{#if (not data.properties.onlymodifier)}} {{#if (not item.system.properties.onlymodifier)}}
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.attackAttribute"}}</label> <label class="property-label">{{localize "BOL.itemProperty.attackAttribute"}}</label>
<div class="form-fields center"> <div class="form-fields center">
<select class="field-value" name="data.properties.attackAttribute" data-dtype="String"> <select class="field-value" name="system.properties.attackAttribute" data-dtype="String">
{{#select data.properties.attackAttribute}} {{#select item.system.properties.attackAttribute}}
{{#each config.attackAttributes as |value id|}} {{#each config.attackAttributes as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -69,8 +69,8 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.attackAptitude"}}</label> <label class="property-label">{{localize "BOL.itemProperty.attackAptitude"}}</label>
<div class="form-fields center"> <div class="form-fields center">
<select class="field-value" name="data.properties.attackAptitude" data-dtype="String"> <select class="field-value" name="system.properties.attackAptitude" data-dtype="String">
{{#select data.properties.attackAptitude}} {{#select item.system.properties.attackAptitude}}
{{#each config.attackAptitudes as |value id|}} {{#each config.attackAptitudes as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -82,15 +82,15 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.attackModifiers"}}</label> <label class="property-label">{{localize "BOL.itemProperty.attackModifiers"}}</label>
<div class="form-fields center"> <div class="form-fields center">
<input class="field-value" type="text" name="data.properties.attackModifiers" value="{{data.properties.attackModifiers}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.attackModifiers" value="{{item.system.properties.attackModifiers}}" data-dtype="Number"/>
</div> </div>
</div> </div>
<hr/> <hr/>
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.weaponSize"}}</label> <label class="property-label">{{localize "BOL.itemProperty.weaponSize"}}</label>
<div class="form-fields"> <div class="form-fields">
<select class="field-value" name="data.properties.weaponSize" data-dtype="String"> <select class="field-value" name="system.properties.weaponSize" data-dtype="String">
{{#select data.properties.weaponSize}} {{#select item.system.properties.weaponSize}}
{{#each config.weaponSizes as |value id|}} {{#each config.weaponSizes as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -101,8 +101,8 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.damage"}}</label> <label class="property-label">{{localize "BOL.itemProperty.damage"}}</label>
<div class="form-fields"> <div class="form-fields">
<select class="field-value" name="data.properties.damage" data-dtype="String"> <select class="field-value" name="system.properties.damage" data-dtype="String">
{{#select data.properties.damage}} {{#select item.system.properties.damage}}
{{#each config.damageValues as |value id|}} {{#each config.damageValues as |value id|}}
<option value="{{id}}">{{value}}</option> <option value="{{id}}">{{value}}</option>
{{/each}} {{/each}}
@ -113,8 +113,8 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.damageAttribute"}}</label> <label class="property-label">{{localize "BOL.itemProperty.damageAttribute"}}</label>
<div class="form-fields center"> <div class="form-fields center">
<select class="field-value" name="data.properties.damageAttribute" data-dtype="String"> <select class="field-value" name="system.properties.damageAttribute" data-dtype="String">
{{#select data.properties.damageAttribute}} {{#select item.system.properties.damageAttribute}}
{{#each config.damageAttributes as |value id|}} {{#each config.damageAttributes as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -125,14 +125,14 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.damageModifiers"}}</label> <label class="property-label">{{localize "BOL.itemProperty.damageModifiers"}}</label>
<div class="form-fields center"> <div class="form-fields center">
<input class="field-value" type="text" name="data.properties.damageModifiers" value="{{data.properties.damageModifiers}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.damageModifiers" value="{{item.system.properties.damageModifiers}}" data-dtype="Number"/>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.damageMultiplier"}}</label> <label class="property-label">{{localize "BOL.itemProperty.damageMultiplier"}}</label>
<div class="form-fields center"> <div class="form-fields center">
<select class="field-value" name="data.properties.damageMultiplier" data-dtype="String"> <select class="field-value" name="system.properties.damageMultiplier" data-dtype="String">
{{#select data.properties.damageMultiplier}} {{#select item.system.properties.damageMultiplier}}
{{#each config.damageMultiplier as |value id|}} {{#each config.damageMultiplier as |value id|}}
<option value="{{id}}">{{value}}</option> <option value="{{id}}">{{value}}</option>
{{/each}} {{/each}}
@ -144,17 +144,17 @@
<label class="property-label">{{localize "BOL.itemProperty.damageSpecial"}}</label> <label class="property-label">{{localize "BOL.itemProperty.damageSpecial"}}</label>
<div class="form-fields center"> <div class="form-fields center">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.damageReroll1" {{checked data.properties.damageReroll1}}> {{localize "BOL.itemProperty.damageReroll1"}} <input class="field-value" type="checkbox" name="system.properties.damageReroll1" {{checked item.system.properties.damageReroll1}}> {{localize "BOL.itemProperty.damageReroll1"}}
</label> </label>
</div> </div>
</div> </div>
{{#if (or data.properties.throwing (or data.properties.ranged data.properties.throwable))}} {{#if (or item.system.properties.throwing (or item.system.properties.ranged item.system.properties.throwable))}}
<hr/> <hr/>
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.range"}}</label> <label class="property-label">{{localize "BOL.itemProperty.range"}}</label>
<div class="form-fields center"> <div class="form-fields center">
<input class="field-value" type="text" name="data.properties.range" value="{{data.properties.range}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.range" value="{{item.system.properties.range}}" data-dtype="Number"/>
</div> </div>
</div> </div>
{{/if}} {{/if}}
@ -162,7 +162,7 @@
<div class="form-group"> <div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.reload"}}</label> <label class="property-label">{{localize "BOL.itemProperty.reload"}}</label>
<div class="form-fields center"> <div class="form-fields center">
<input class="field-value" type="text" name="data.properties.reload" value="{{data.properties.reload}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.reload" value="{{item.system.properties.reload}}" data-dtype="Number"/>
</div> </div>
</div> </div>
{{/if}} {{/if}}