Compare commits

...

53 Commits

Author SHA1 Message Date
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
64 changed files with 2833 additions and 1101 deletions

View File

@ -769,7 +769,7 @@ body.system-bol img#logo {
min-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-repeat: no-repeat;
background-size: 190px 115px;
@ -855,11 +855,30 @@ body.system-bol img#logo {
font-weight: bold;
color: #4b4a44;
}
.bol.sheet.actor .bonus-text {
margin-top: 7px;
}
.bol.sheet.actor .stat-value {
font-size: 1.5rem;
font-weight: bold;
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 {
font-size: 1.5rem;
color: #4b4a44;
@ -1032,3 +1051,7 @@ body.system-bol img#logo {
.bol-hud-menu label {
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.TypeEncounter": "Rencontre",
"ITEM.TypeItem": "Objet",
"ITEM.TypeFeature": "Trait",
"ITEM.TypeWeapon": "Arme",
"ITEM.TypeArmor": "Armure",
"ACTOR.TypeCharacter": "Character",
"ACTOR.TypeEncounter": "Encounter",
"ITEM.TypeItem": "Item",
"ITEM.TypeFeature": "Feature",
"ITEM.TypeWeapon": "Weapon",
"ITEM.TypeArmor": "Armor",
"BOL.attributes.vigor": "Vigueur",
"BOL.attributes.halfvigor" : "Demi-vigueur",
"BOL.attributes.agility": "Agilité",
"BOL.attributes.mind": "Esprit",
"BOL.attributes.appeal": "Aura",
"BOL.attributes.vigor": "Vigor",
"BOL.attributes.halfvigor" : "Half-Vigor",
"BOL.attributes.agility": "Agility",
"BOL.attributes.mind": "Mind",
"BOL.attributes.appeal": "Appeal",
"BOL.aptitudes.init": "Initiative",
"BOL.aptitudes.melee": "Mêlée",
"BOL.aptitudes.ranged": "Tir",
"BOL.aptitudes.def": "Défense",
"BOL.aptitudes.melee": "Melee",
"BOL.aptitudes.ranged": "Ranged",
"BOL.aptitudes.def": "Defense",
"BOL.aptitudes.prot": "Protection",
"BOL.resources.hp": "Vitalité",
"BOL.resources.hero": "Héroïsme",
"BOL.resources.faith": "Foi",
"BOL.resources.creation": "Création",
"BOL.resources.power": "Pouvoir",
"BOL.resources.villainy": "Vilénie",
"BOL.resources.hp": "Vitality",
"BOL.resources.hero": "Hero",
"BOL.resources.faith": "Faith",
"BOL.resources.creation": "Creation",
"BOL.resources.power": "Power",
"BOL.resources.villainy": "Villany",
"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.actions": "Actions",
"BOL.ui.tab.features": "Traits",
"BOL.ui.tab.equipment": "Equipement",
"BOL.ui.tab.equipment": "Equipment",
"BOL.ui.tab.description": "Description",
"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.actions": "Actions",
"BOL.ui.capacities": "Capacités",
"BOL.ui.damages": "Dommages",
"BOL.ui.details": "Détails",
"BOL.ui.category": "Catégorie",
"BOL.ui.subcategory": "Sous-catégorie",
"BOL.ui.capacities": "Capacity",
"BOL.ui.damages": "Damage",
"BOL.ui.details": "Details",
"BOL.ui.category": "Category",
"BOL.ui.subcategory": "Sub-Category",
"BOL.ui.type": "Type",
"BOL.ui.subtype": "Sous-type",
"BOL.ui.attribute" : "Attribut",
"BOL.ui.subtype": "Subtype",
"BOL.ui.attribute" : "Attribute",
"BOL.ui.aptitude" : "Aptitude",
"BOL.ui.advantages" : "Avantages/Désavantages",
"BOL.ui.modifiers": "Modificateurs",
"BOL.ui.item": "Objet",
"BOL.ui.edit": "Editer",
"BOL.ui.unequip": "Déséquiper",
"BOL.ui.equip": "Équiper",
"BOL.ui.delete": "Supprimer",
"BOL.ui.roll" : "Utiliser",
"BOL.ui.equipment" : "Équipement",
"BOL.ui.equipmentProperties" : "Propiétés d'équipement",
"BOL.ui.advantages" : "Boons/Flaws",
"BOL.ui.modifiers": "Modifiers",
"BOL.ui.item": "Item",
"BOL.ui.edit": "Edit",
"BOL.ui.unequip": "Unequip",
"BOL.ui.equip": "Equip",
"BOL.ui.delete": "Delete",
"BOL.ui.roll" : "Roll",
"BOL.ui.equipment" : "Equipment",
"BOL.ui.equipmentProperties" : "Equipment properties",
"BOL.ui.weaponAttack" : "Weapon attack",
"BOL.ui.weaponProperties" : "Propiétés offensives",
"BOL.ui.protectionProperties" : "Protection",
"BOL.ui.magicalProperties" : "Propriétés magiques",
"BOL.ui.weaponProperties" : "Weapon properties",
"BOL.ui.protectionProperties" : "Protection properties",
"BOL.ui.magicalProperties" : "Magical properties",
"BOL.ui.alchemyProperties": "Alchemy properties",
"BOL.ui.armor" : "Armure",
"BOL.ui.reach" : "Allonge",
"BOL.ui.weapon" : "Arme",
"BOL.ui.melee" : "Arme de contact",
"BOL.ui.ranged" : "Arme à distance",
"BOL.ui.armor" : "Armor",
"BOL.ui.reach" : "Reach",
"BOL.ui.weapon" : "Weapon",
"BOL.ui.melee" : "Melee",
"BOL.ui.ranged" : "Ranged",
"BOL.ui.protection" : "Protection",
"BOL.ui.shield" : "Bouclier",
"BOL.ui.blocking" : "Blocage",
"BOL.ui.range" : "Portée",
"BOL.ui.quantity" : "Quantité",
"BOL.ui.qty" : "Qté",
"BOL.ui.slot" : "Empl.",
"BOL.ui.weight" : "Poids",
"BOL.ui.price": "Prix",
"BOL.ui.cancel": "Annuler",
"BOL.ui.shield" : "Shield",
"BOL.ui.blocking" : "Blocking",
"BOL.ui.range" : "Range",
"BOL.ui.quantity" : "Quantity",
"BOL.ui.qty" : "Qty",
"BOL.ui.slot" : "Slot",
"BOL.ui.weight" : "Weight",
"BOL.ui.price": "Price",
"BOL.ui.cancel": "Cancel",
"BOL.ui.submit": "OK",
"BOL.ui.attributeCheck" : "Test d'attribut",
"BOL.ui.aptitudeCheck" : "Test d'aptitude",
"BOL.ui.weaponCheck" : "Jet d'attaque",
"BOL.ui.spellCheck" : "Jet de sort",
"BOL.ui.careers" : "Carrières",
"BOL.ui.boons" : "Avantages",
"BOL.ui.flaws" : "Désavantages",
"BOL.ui.rank" : "Rang",
"BOL.ui.success" : "Succès",
"BOL.ui.failure" : "Échec",
"BOL.ui.fumble" : "Échec critique",
"BOL.ui.critical" : "Succès critique",
"BOL.ui.maneuvers" : "Actions de combat",
"BOL.ui.stacksize" : "Taille de pile (max)",
"BOL.ui.weapons" : "Armes",
"BOL.ui.protections" : "Protections",
"BOL.ui.ammos" : "Munitions",
"BOL.ui.containers" : "Conteneurs",
"BOL.ui.treasure" : "Trésor",
"BOL.ui.vehicles" : "Véhicules/Montures",
"BOL.ui.misc" : "Divers",
"BOL.ui.vehicleProperties" : " Propriétés de véhicule",
"BOL.ui.speed" : "Vitesse",
"BOL.ui.noWeaponName" : "Arme Inconnue",
"BOL.ui.targetDefence": "Défense",
"BOL.ui.applyShieldMalus": "Appliquer le Malus de Petit Bouclier",
"BOL.ui.shieldMalus": "Malus de Bouclier",
"BOL.ui.defenseScore": "Score de Defense",
"BOL.ui.defender": "Défenseur",
"BOL.ui.attributeCheck" : "Attribute Check",
"BOL.ui.aptitudeCheck" : "Aptitude Check",
"BOL.ui.weaponCheck" : "Weapon Check",
"BOL.ui.spellCheck" : "Spell Check",
"BOL.ui.careers" : "Careers",
"BOL.ui.boons" : "Boons",
"BOL.ui.flaws" : "Flaws",
"BOL.ui.rank" : "Rank",
"BOL.ui.success" : "Success",
"BOL.ui.failure" : "Failure",
"BOL.ui.fumble" : "Fumble",
"BOL.ui.critical" : "Critical Success",
"BOL.ui.maneuvers" : "Maneuvers",
"BOL.ui.stacksize" : "Stack Size (max)",
"BOL.ui.weapons" : "Weapons",
"BOL.ui.protections" : "Protection",
"BOL.ui.ammos" : "Ammo",
"BOL.ui.containers" : "Container",
"BOL.ui.treasure" : "Treasure",
"BOL.ui.vehicles" : "Vehicles/Mounts",
"BOL.ui.misc" : "Misc",
"BOL.ui.vehicleProperties" : "Vehicle properties",
"BOL.ui.speed" : "Speed",
"BOL.ui.noWeaponName" : "Weapon Name",
"BOL.ui.targetDefence": "Defense",
"BOL.ui.applyShieldMalus": "Apply Shield Modifier",
"BOL.ui.shieldMalus": "Shield Modifier",
"BOL.ui.defenseScore": "Defense Score",
"BOL.ui.defender": "Defender",
"BOL.ui.difficulty": "Difficulty",
"BOL.ui.spellProperties": "Spell Properties",
"BOL.ui.duration": "Duration",
@ -121,7 +121,7 @@
"BOL.ui.sorcererRank" : "Sorcerer Rank",
"BOL.ui.alchemistRank": "Alchemist Rank",
"BOL.ui.mandatoryconditions": "Mandatory conditions",
"BOL.ui.optionnalconditions": "Optionnal conditions",
"BOL.ui.optionnalconditions": "Optional conditions",
"BOL.ui.ppcost": "Power Points cost",
"BOL.ui.ppAvailable": "Available Power Points",
"BOL.ui.pccost": "Creation Points cost",
@ -134,38 +134,38 @@
"BOL.ui.alchemyCurrent": "Current Alchemy Points in Object",
"BOL.ui.advance": "Status",
"BOL.ui.isadvantage": "Provides a bonus dice?",
"BOL.ui.bonusmalus": "Additionnal bonus/malus",
"BOL.ui.nbdices": "Number of Dices",
"BOL.ui.bonusmalus": "Additional bonus/penalty",
"BOL.ui.nbdices": "Number of Dice",
"BOL.ui.totalmod": "Total Mod.",
"BOL.ui.rangeModifiers": "Range modifier",
"BOL.ui.money": "Bougette",
"BOL.ui.money": "Money",
"BOL.ui.moneyTitle": "Gold & Treasure",
"BOL.ui.fightOption": "Fight Options",
"BOL.ui.none": "None",
"BOL.ui.fightOptionType": "Fight Options types",
"BOL.ui.fightOptionType": "Fight Option types",
"BOL.ui.activated": "Activated",
"BOL.ui.deactivated": "Deactivated",
"BOL.ui.status": "Status",
"BOL.ui.toactivated": "Active (>Désactiver)",
"BOL.ui.todeactivated": "Inactive (>Activer)",
"BOL.ui.armorAgiMalus": "Armor+Shield Malus (Agi)",
"BOL.ui.armorInitMalus": "Armor Malus (Init)",
"BOL.ui.attackValue": "Attack value",
"BOL.ui.toactivated": "Active (>Deactivated)",
"BOL.ui.todeactivated": "Inactive (>Active)",
"BOL.ui.armorAgiMalus": "Armor+Shield Modifier (Agi)",
"BOL.ui.armorInitMalus": "Armor Modifier (Init)",
"BOL.ui.attackValue": "Attack Value",
"BOL.featureCategory.origins": "Origines",
"BOL.featureCategory.origins": "Origins",
"BOL.featureCategory.races": "Races",
"BOL.featureCategory.careers": "Carrières",
"BOL.featureCategory.boons": "Avantages",
"BOL.featureCategory.flaws": "Désavantages",
"BOL.featureCategory.languages": "Langages",
"BOL.featureCategory.careers": "Careers",
"BOL.featureCategory.boons": "Boons",
"BOL.featureCategory.flaws": "Flaws",
"BOL.featureCategory.languages": "Languages",
"BOL.featureCategory.fightoptions": "Fight Options",
"BOL.featureSubtypes.origin": "Origine",
"BOL.featureSubtypes.origin": "Origin",
"BOL.featureSubtypes.race": "Race",
"BOL.featureSubtypes.career": "Carrière",
"BOL.featureSubtypes.boon": "Avantage",
"BOL.featureSubtypes.flaw": "Désavantage",
"BOL.featureSubtypes.language": "Langage",
"BOL.featureSubtypes.career": "Career",
"BOL.featureSubtypes.boon": "Boon",
"BOL.featureSubtypes.flaw": "Flaw",
"BOL.featureSubtypes.language": "Language",
"BOL.featureSubtypes.gods": "Faith & Gods",
"BOL.featureSubtypes.fightOption": "Combat Option",
@ -175,46 +175,46 @@
"BOL.bougette.luxury" : "Luxury life",
"BOL.bougette.rich": "Rich!",
"BOL.fightOptionTypes.armor": "Attaque au défaut d'armure",
"BOL.fightOptionTypes.intrepid": "Attaque intrépide",
"BOL.fightOptionTypes.twoweaponsdef": "Combat à 2 armes (Défense)",
"BOL.fightOptionTypes.twoweaponsatt": "Combat à 2 armes (Attaque)",
"BOL.fightOptionTypes.fulldefense": "Défense totale",
"BOL.fightOptionTypes.defense": "Posture défensive",
"BOL.fightOptionTypes.attack": "Posture offensive",
"BOL.fightOptionTypes.armor": "Armor Attack Option",
"BOL.fightOptionTypes.intrepid": "Fearless Attack",
"BOL.fightOptionTypes.twoweaponsdef": "Two Weapon (Defense)",
"BOL.fightOptionTypes.twoweaponsatt": "Two Weapon (Attack)",
"BOL.fightOptionTypes.fulldefense": "Full Defense",
"BOL.fightOptionTypes.defense": "Defensive Posture",
"BOL.fightOptionTypes.attack": "Offensive Posture",
"BOL.itemCategory.object": "Objet",
"BOL.itemCategory.equipment": "Équipement",
"BOL.itemCategory.consumable": "Consommable",
"BOL.itemCategory.spell": "Sort",
"BOL.itemCategory.vehicle": "Monture/Véhicule",
"BOL.itemCategory.other": "Autre",
"BOL.itemCategory.capacity" : "Capacité",
"BOL.itemCategory.object": "Object",
"BOL.itemCategory.equipment": "Equipment",
"BOL.itemCategory.consumable": "Consumable",
"BOL.itemCategory.spell": "Spell",
"BOL.itemCategory.vehicle": "Mount/Vehicle",
"BOL.itemCategory.other": "Other",
"BOL.itemCategory.capacity" : "Capacity",
"BOL.itemCategory.alchemy": "Alchemy",
"BOL.combatCategory.protections": "Protections",
"BOL.combatCategory.shields": "Boucliers",
"BOL.combatCategory.melee": "Armes de contact",
"BOL.combatCategory.ranged": "Armes à distance",
"BOL.combatCategory.shields": "Shields",
"BOL.combatCategory.melee": "Melee",
"BOL.combatCategory.ranged": "Ranged",
"BOL.combatCategory.fightOptions": "Fight options",
"BOL.combatCategory.natural": "Natural Weapons",
"BOL.equipmentCategory.weapon": "Arme",
"BOL.equipmentCategory.armor": "Armure",
"BOL.equipmentCategory.weapon": "Weapon",
"BOL.equipmentCategory.armor": "Armor",
"BOL.equipmentCategory.protection": "Protection",
"BOL.equipmentCategory.shield": "Bouclier",
"BOL.equipmentCategory.helm": "Casque",
"BOL.equipmentCategory.jewel": "Bijou",
"BOL.equipmentCategory.scroll": "Parchemin",
"BOL.equipmentCategory.ammunition": "Munition",
"BOL.equipmentCategory.container": "Conteneur",
"BOL.equipmentCategory.currency": "Monnaie",
"BOL.equipmentCategory.other": "Autre",
"BOL.equipmentCategory.shield": "Shield",
"BOL.equipmentCategory.helm": "Helm",
"BOL.equipmentCategory.jewel": "Jewel",
"BOL.equipmentCategory.scroll": "Scroll",
"BOL.equipmentCategory.ammunition": "Ammunition",
"BOL.equipmentCategory.container": "Container",
"BOL.equipmentCategory.currency": "Money",
"BOL.equipmentCategory.other": "Other",
"BOL.protectionCategory.armor": "Armure",
"BOL.protectionCategory.shield": "Bouclier",
"BOL.protectionCategory.helm": "Casque",
"BOL.protectionCategory.other": "Autre",
"BOL.protectionCategory.armor": "Armor",
"BOL.protectionCategory.shield": "Shield",
"BOL.protectionCategory.helm": "Helm",
"BOL.protectionCategory.other": "Other",
"BOL.spellItem.charm": "Charm",
"BOL.spellItem.circle1": "First Circle",
@ -226,140 +226,140 @@
"BOL.alchemyItem.legend": "Legendary",
"BOL.alchemyItem.mythic": "Mythic",
"BOL.weaponCategory.melee": "Arme de mêlée",
"BOL.weaponCategory.ranged": "Arme de tir",
"BOL.weaponCategory.other": "Autre",
"BOL.weaponCategory.melee": "Melee",
"BOL.weaponCategory.ranged": "Ranged",
"BOL.weaponCategory.other": "Other",
"BOL.itemProperty.damageMultiplier": "Damages Multiplier",
"BOL.itemProperty.damageMultiplier": "Damage Multiplier",
"BOL.itemProperty.attackBonusDice": "Attack Bonus Dice",
"BOL.itemProperty.equipable": "Équipable",
"BOL.itemProperty.equipable": "Equipable",
"BOL.itemProperty.protection": "Protection",
"BOL.itemProperty.blocking": "Blocage",
"BOL.itemProperty.magical": "Magique",
"BOL.itemProperty.concealable": "Dissimulable",
"BOL.itemProperty.2H": "Arme à 2 mains",
"BOL.itemProperty.helm": "Casque",
"BOL.itemProperty.improvised": "Improvisée",
"BOL.itemProperty.shield": "Bouclier",
"BOL.itemProperty.melee": "Arme de contact",
"BOL.itemProperty.throwable": "Peut être lancée",
"BOL.itemProperty.ignoreshield": "Ignore les boucliers",
"BOL.itemProperty.bashing": "Dégâts non létaux",
"BOL.itemProperty.stackable": "Empilable",
"BOL.itemProperty.ranged": "A distance",
"BOL.itemProperty.weapon": "Offensive",
"BOL.itemProperty.reloadable": "Rechargeable",
"BOL.itemProperty.worn": "Équipé",
"BOL.itemProperty.spell" : "Sort",
"BOL.itemProperty.armor" : "Armure",
"BOL.itemProperty.consumable" : "Consommable",
"BOL.itemProperty.bow" : "Arc",
"BOL.itemProperty.crossbow" : "Arbalète",
"BOL.itemProperty.throwing" : "Arme de jet",
"BOL.itemProperty.blocking": "Blocking",
"BOL.itemProperty.magical": "Magical",
"BOL.itemProperty.concealable": "Concealable",
"BOL.itemProperty.2H": "2H Weapon",
"BOL.itemProperty.helm": "Helm",
"BOL.itemProperty.improvised": "Improvised",
"BOL.itemProperty.shield": "Shield",
"BOL.itemProperty.melee": "Melee",
"BOL.itemProperty.throwable": "Throwable",
"BOL.itemProperty.ignoreshield": "Ignore Shield",
"BOL.itemProperty.bashing": "Bashing",
"BOL.itemProperty.stackable": "Stackable",
"BOL.itemProperty.ranged": "Ranged",
"BOL.itemProperty.weapon": "Weapon",
"BOL.itemProperty.reloadable": "Reloadable",
"BOL.itemProperty.worn": "Equipped",
"BOL.itemProperty.spell" : "Spell",
"BOL.itemProperty.armor" : "Armor",
"BOL.itemProperty.consumable" : "Consumable",
"BOL.itemProperty.bow" : "Bow",
"BOL.itemProperty.crossbow" : "Crossbow",
"BOL.itemProperty.throwing" : "Throwing",
"BOL.itemProperty.activable" : "Activable",
"BOL.itemProperty.powder" : "Arme à poudre",
"BOL.itemProperty.attackAttribute" : "Attaque (Attribut)",
"BOL.itemProperty.attackAptitude" : "Attaque (Aptitude)",
"BOL.itemProperty.attackModifiers" : "Attaque (Modificateurs)",
"BOL.itemProperty.attackReroll1" : "Attaque (Relancer les 1)",
"BOL.itemProperty.damage" : "Dommages (Dés)",
"BOL.itemProperty.damageModifiers" : "Dommages (Modificateurs)",
"BOL.itemProperty.damageAttribute" : "Dommages (Attribut)",
"BOL.itemProperty.damageSpecial" : "Dommages (Spécial)",
"BOL.itemProperty.damageReroll1" : "Relancer les 1",
"BOL.itemProperty.range" : "Portée (en m)",
"BOL.itemProperty.soakFormula": "Encaissement (Formule)",
"BOL.itemProperty.soakModifiers": "Encaissement (Modificateur)",
"BOL.itemProperty.soakValue": "Encaissement (Valeur par défaut)",
"BOL.itemProperty.armorQuality": "Qualité d'armure",
"BOL.itemProperty.blockingMalus" : "Malus de blocage",
"BOL.itemProperty.blockingAttacksBlocked" : "Attaques bloquée",
"BOL.itemProperty.blocking1Attack" : "Bloque 1 attaque",
"BOL.itemProperty.blockingAllAttacks" : "Bloque toutes les attaques",
"BOL.itemProperty.slot" : "Emplacement utilisé",
"BOL.itemProperty.reload": "Rechargement (Actions)",
"BOL.itemProperty.weaponSize" : "Classe d'arme",
"BOL.itemProperty.powder" : "Powder",
"BOL.itemProperty.attackAttribute" : "Attack (Attribute)",
"BOL.itemProperty.attackAptitude" : "Attack (Aptitude)",
"BOL.itemProperty.attackModifiers" : "Attack (Modifiers)",
"BOL.itemProperty.attackReroll1" : "Attack (Reroll 1's)",
"BOL.itemProperty.damage" : "Damage (Dmg)",
"BOL.itemProperty.damageModifiers" : "Damage (Modifiers)",
"BOL.itemProperty.damageAttribute" : "Damage (Attribute)",
"BOL.itemProperty.damageSpecial" : "Damage (Special)",
"BOL.itemProperty.damageReroll1" : "Reroll 1's",
"BOL.itemProperty.range" : "Range (in m)",
"BOL.itemProperty.soakFormula": "Soak (Formula)",
"BOL.itemProperty.soakModifiers": "Soak (Modifiers)",
"BOL.itemProperty.soakValue": "Soak (Default Value)",
"BOL.itemProperty.armorQuality": "Armor Quality",
"BOL.itemProperty.blockingMalus" : "Blocking Modifier",
"BOL.itemProperty.blockingAttacksBlocked" : "Attacks blocked",
"BOL.itemProperty.blocking1Attack" : "Block 1 attack",
"BOL.itemProperty.blockingAllAttacks" : "Block all attacks",
"BOL.itemProperty.slot" : "Slot",
"BOL.itemProperty.reload": "Reload (Actions)",
"BOL.itemProperty.weaponSize" : "Weapon Size",
"BOL.itemProperty.difficulty": "Difficulty",
"BOL.itemProperty.natural": "Natural weapon",
"BOL.itemProperty.onlymodifier": "Modifier only (ie creatures attacks)",
"BOL.itemStat.quantity": "Quantité",
"BOL.itemStat.weight": "Poids",
"BOL.itemStat.price": "Prix",
"BOL.itemStat.range": "Portée",
"BOL.itemStat.damage": "Dommages",
"BOL.itemStat.reload": "Rechargement (Actions)",
"BOL.itemStat.soak": "Valeur de protection",
"BOL.itemStat.blocking": "Bloquage",
"BOL.itemStat.modifiers": "Modificateurs",
"BOL.itemStat.quantity": "Quantity",
"BOL.itemStat.weight": "Weight",
"BOL.itemStat.price": "Price",
"BOL.itemStat.range": "Range",
"BOL.itemStat.damage": "Damage",
"BOL.itemStat.reload": "Reload (Actions)",
"BOL.itemStat.soak": "Soak",
"BOL.itemStat.blocking": "Blocking",
"BOL.itemStat.modifiers": "Modifiers",
"BOL.weaponSize.unarmed" : "Mains nues",
"BOL.weaponSize.improvised" : "Arme improvisée",
"BOL.weaponSize.light" : "Légère",
"BOL.weaponSize.medium" : "Moyenne",
"BOL.weaponSize.heavy" : "Lourde",
"BOL.weaponSize.unarmed" : "Unarmed",
"BOL.weaponSize.improvised" : "Improvised",
"BOL.weaponSize.light" : "Light",
"BOL.weaponSize.medium" : "Medium",
"BOL.weaponSize.heavy" : "heavy",
"BOL.itemModifiers.init": "Malus (Initiative)",
"BOL.itemModifiers.social": "Malus (Social)",
"BOL.itemModifiers.agility": "Malus (Agilité)",
"BOL.itemModifiers.powercost": "Malus (Coût supplémentaire en PP)",
"BOL.itemModifiers.init": "Modifier (Initiative)",
"BOL.itemModifiers.social": "Modifier (Social)",
"BOL.itemModifiers.agility": "Modifier (Agility)",
"BOL.itemModifiers.powercost": "Modifier (Additional Cost in PP)",
"BOL.itemBlocking.malus": "Social",
"BOL.itemBlocking.nbAttacksPerRound": "Agilité",
"BOL.itemBlocking.malus": "Modifier",
"BOL.itemBlocking.nbAttacksPerRound": "Agility",
"BOL.soakFormula.none" : "-",
"BOL.soakFormula.light" : "Légère (Annule d6-3 dégâts subis)",
"BOL.soakFormula.medium" : "Moyenne (Annule d6-2 dégâts subis)",
"BOL.soakFormula.heavy" : "Lourde (Annule d6-1 dégâts subis)",
"BOL.soakFormula.light" : "Light (Cancels d6-3 damage)",
"BOL.soakFormula.medium" : "Medium (Cancels d6-2 damage)",
"BOL.soakFormula.heavy" : "Heavy (Cancels d6-1 damage)",
"BOL.armorQuality.none" : "-",
"BOL.armorQuality.light" : "Légère",
"BOL.armorQuality.lightQ" : "Légère de qualité",
"BOL.armorQuality.lightSup" : "Légère Supérieure",
"BOL.armorQuality.lightLeg" : "Légère Légendaire",
"BOL.armorQuality.medium" : "Moyenne",
"BOL.armorQuality.mediumQ" : "Moyenne de qualité",
"BOL.armorQuality.mediumSup" : "Moyenne Supérieure",
"BOL.armorQuality.mediumLeg" : "Moyenne Légendaire",
"BOL.armorQuality.heavy" : "Lourde",
"BOL.armorQuality.heavyQ" : "Lourde de qualité",
"BOL.armorQuality.heavySup" : "Lourde Supérieure",
"BOL.armorQuality.heavyLeg" : "Lourde Légendaire",
"BOL.armorQuality.light" : "Light",
"BOL.armorQuality.lightQ" : "Light Quality",
"BOL.armorQuality.lightSup" : "Light Superior",
"BOL.armorQuality.lightLeg" : "Light Legendary",
"BOL.armorQuality.medium" : "Medium",
"BOL.armorQuality.mediumQ" : "Medium Quality",
"BOL.armorQuality.mediumSup" : "Medium Superior",
"BOL.armorQuality.mediumLeg" : "Medium Legendary",
"BOL.armorQuality.heavy" : "Heavy",
"BOL.armorQuality.heavyQ" : "Heavy Quality",
"BOL.armorQuality.heavySup" : "Heavy Superior",
"BOL.armorQuality.heavyLeg" : "Heavy Legendary",
"BOL.equipmentSlots.none" : "-",
"BOL.equipmentSlots.head" : "Tête",
"BOL.equipmentSlots.neck" : "Cou",
"BOL.equipmentSlots.shoulders" : "Épaules",
"BOL.equipmentSlots.body" : "Corps",
"BOL.equipmentSlots.rhand" : "Main droite",
"BOL.equipmentSlots.lhand" : "Main gauche",
"BOL.equipmentSlots.2hands" : "2 mains",
"BOL.equipmentSlots.rarm" : "Bras droit",
"BOL.equipmentSlots.larm" : "Bras gauche",
"BOL.equipmentSlots.chest" : "Torse",
"BOL.equipmentSlots.belt" : "Ceinture",
"BOL.equipmentSlots.legs" : "Jambes",
"BOL.equipmentSlots.feet" : "Pieds",
"BOL.equipmentSlots.finder" : "Doigt",
"BOL.equipmentSlots.ear" : "Oreille",
"BOL.equipmentSlots.head" : "Head",
"BOL.equipmentSlots.neck" : "Neck",
"BOL.equipmentSlots.shoulders" : "Shoulders",
"BOL.equipmentSlots.body" : "Body",
"BOL.equipmentSlots.rhand" : "Right hand",
"BOL.equipmentSlots.lhand" : "Left hand",
"BOL.equipmentSlots.2hands" : "2 hands",
"BOL.equipmentSlots.rarm" : "Right arm",
"BOL.equipmentSlots.larm" : "Left arm",
"BOL.equipmentSlots.chest" : "Chest",
"BOL.equipmentSlots.belt" : "Belt",
"BOL.equipmentSlots.legs" : "Legs",
"BOL.equipmentSlots.feet" : "Feet",
"BOL.equipmentSlots.finder" : "Finger",
"BOL.equipmentSlots.ear" : "Ear",
"BOL.vehicleCategory.mount" : "Monture terrestre",
"BOL.vehicleCategory.flying" : "Monture volante",
"BOL.vehicleCategory.boat" : "Bateau",
"BOL.vehicleCategory.other" : "Autre",
"BOL.vehicleCategory.mount" : "Ground Mount",
"BOL.vehicleCategory.flying" : "Flying Mount",
"BOL.vehicleCategory.boat" : "Boat",
"BOL.vehicleCategory.other" : "Other",
"BOL.range.PointBlank": "Bout portant",
"BOL.range.Short": "Courte",
"BOL.range.Medium": "Moyenne",
"BOL.range.PointBlank": "Point Blank",
"BOL.range.Short": "Short",
"BOL.range.Medium": "Medium",
"BOL.range.Long": "Long",
"BOL.range.VeryLong": "Très longue",
"BOL.range.Extreme": "Extrême",
"BOL.range.Maximum": "Maximale",
"BOL.range.VeryLong": "Very Long",
"BOL.range.Extreme": "Extreme",
"BOL.range.Maximum": "Maximum",
"BOL.notification.MacroMultipleTokensSelected": "Vous avez sélectionné plusieurs tokens",
"BOL.notification.MacroNoActorAvailable": "Aucun acteur n'a pu être ciblé",
"BOL.notification.MacroNoTokenSelected": "Vous devez sélectionner un token",
"BOL.notification.MacroMultipleTokensSelected": "You have selected several tokens!",
"BOL.notification.MacroNoActorAvailable": "No actor could be targeted!",
"BOL.notification.MacroNoTokenSelected": "You must select a token!",
"BOL.size.tiny": "Tiny",
"BOL.size.verysmall": "Very Small",
@ -372,6 +372,84 @@
"BOL.size.enormous": "Enormous",
"BOL.size.gigantic": "Gigantic",
"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.fumble": "Échec critique",
"BOL.ui.critical": "Succès critique",
"BOL.ui.criticallegend": "Succès légendaire !",
"BOL.ui.maneuvers": "Actions de combat",
"BOL.ui.stacksize": "Taille de pile (max)",
"BOL.ui.weapons": "Armes",
@ -348,5 +349,87 @@
"BOL.size.enormous": "Colossale",
"BOL.size.gigantic": "Gigantesque",
"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

@ -25,6 +25,13 @@ export class BoLActorSheet extends ActorSheet {
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
if (!this.options.editable) return;
@ -66,10 +73,9 @@ export class BoLActorSheet extends ActorSheet {
const incr = parseInt(dataset.incr)
const min = parseInt(dataset.min)
const max = parseInt(dataset.max) || 10000
const itemData = item.data;
let value = eval("itemData." + target)
let value = eval("item." + target)
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 (value >= min + incr) value -= incr;
else value = min;
@ -109,16 +115,17 @@ export class BoLActorSheet extends ActorSheet {
/** @override */
getData(options) {
const data = super.getData(options);
const actorData = duplicate(data.data);
const data = super.getData(options)
const actorData = duplicate(data)
let formData = duplicate(data)
formData.config = game.bol.config
formData.data = actorData.data
formData.data = actorData
formData.details = this.actor.details
formData.attributes = this.actor.attributes
formData.aptitudes = this.actor.aptitudes
formData.resources = this.actor.getResourcesFromType()
formData.xp = this.actor.system.xp
formData.equipment = this.actor.equipment
formData.equipmentCreature = this.actor.equipmentCreature
formData.weapons = this.actor.weapons
@ -133,13 +140,15 @@ export class BoLActorSheet extends ActorSheet {
formData.ammos = this.actor.ammos
formData.misc = this.actor.misc
formData.combat = this.actor.buildCombat()
formData.combatCreature = this.actor.buildCombatCreature()
//formData.combatCreature = this.actor.buildCombatCreature()
formData.features = this.actor.buildFeatures()
formData.isGM = game.user.isGM
formData.options = this.options
formData.owner = this.document.isOwner
formData.editScore = this.options.editScore
formData.useBougette = BoLUtility.getUseBougette()
formData.charType = this.actor.getCharType()
formData.villainy = this.actor.getVillainy()
formData.isSorcerer = this.actor.isSorcerer()
formData.isAlchemist = this.actor.isAlchemist()

View File

@ -9,29 +9,43 @@ export class BoLActor extends Actor {
/** @override */
prepareData() {
const actorData = this.data;
if (actorData.type === 'character') {
actorData.type = 'player';
actorData.villainy = false;
if (this.type === 'character') {
this.chartype = 'player'
this.villainy = false
}
if (actorData.type === 'encounter') {
actorData.type = 'tough';
actorData.villainy = true;
if (this.type === 'encounter') {
this.chartype = 'tough'
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() {
if (this.type == 'character') {
let newVitality = 10 + this.data.data.attributes.vigor.value + this.data.data.resources.hp.bonus
if (this.data.data.resources.hp.max != newVitality) {
this.update({ 'data.resources.hp.max': newVitality });
let newVitality = 10 + this.system.attributes.vigor.value + this.system.resources.hp.bonus
if (this.system.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
if (this.data.data.resources.power.max != newPower) {
this.update({ 'data.resources.power.max': newPower });
let newPower = 10 + this.system.attributes.mind.value + this.system.resources.power.bonus
if (this.system.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() {
return this.data.data.details
return this.system.details
}
get attributes() {
return Object.values(this.data.data.attributes)
return Object.values(this.system.attributes)
}
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
let foList = this.fightoptions
for (let fo of foList) {
if (fo.data.properties.used) {
this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'data.properties.used': false }])
if (fo.system.properties.used) {
this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'system.properties.used': false }])
}
}
}
@ -71,28 +82,28 @@ export class BoLActor extends Actor {
get defenseValue() {
let defMod = 0
let fo = this.getActiveFightOption()
if (fo && fo.data.properties.fightoptiontype == "intrepid") {
if (fo && fo.system.properties.fightoptiontype == "intrepid") {
defMod += -2
}
if (fo && fo.data.properties.fightoptiontype == "fulldefense") {
if (fo && fo.system.properties.fightoptiontype == "fulldefense") {
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
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
}
if (fo && fo.data.properties.fightoptiontype == "attack") {
if (fo && fo.system.properties.fightoptiontype == "attack") {
defMod += -1
}
return this.data.data.aptitudes.def.value + defMod
return this.system.aptitudes.def.value + defMod
}
/* -------------------------------------------- */
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) {
return duplicate(it)
}
@ -101,14 +112,14 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
incAttributeXP(key) {
let attr = duplicate(this.data.data.attributes[key])
let attr = duplicate(this.system.attributes[key])
if (attr) {
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) {
attr.value += 1
xp.spent += nextXP
this.update({ [`data.attributes.${key}`]: attr, [`data.xp`]: xp })
this.update({ [`system.attributes.${key}`]: attr, [`system.xp`]: xp })
} else {
ui.notifications.warn("Pas assez de points d'expérience !")
}
@ -117,14 +128,14 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
incAptitudeXP(key) {
let apt = duplicate(this.data.data.aptitudes[key])
let apt = duplicate(this.system.aptitudes[key])
if (apt) {
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) {
apt.value += 1
xp.spent += nextXP
this.update({ [`data.aptitudes.${key}`]: apt, [`data.xp`]: xp })
this.update({ [`system.aptitudes.${key}`]: apt, [`system.xp`]: xp })
} else {
ui.notifications.warn("Pas assez de points d'expérience !")
}
@ -132,15 +143,15 @@ export class BoLActor extends Actor {
}
/* -------------------------------------------- */
incCareerXP(itemId) {
let career = this.data.items.get(itemId)
let career = this.items.get(itemId)
if (career) {
career = duplicate(career)
let nextXP = career.data.rank + 1
let xp = duplicate(this.data.data.xp)
let nextXP = career.system.rank + 1
let xp = duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) {
xp.spent += nextXP
this.update({ [`data.xp`]: xp })
this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'data.rank': career.data.rank + 1 }])
this.update({ [`system.xp`]: xp })
this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'system.rank': career.system.rank + 1 }])
} else {
ui.notifications.warn("Pas assez de points d'expérience !")
}
@ -149,18 +160,18 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
async toggleFightOption(itemId) {
let fightOption = this.data.items.get(itemId)
let fightOption = this.items.get(itemId)
let state
let updates = []
if (fightOption) {
fightOption = duplicate(fightOption)
if (fightOption.data.properties.activated) {
if (fightOption.system.properties.activated) {
state = false
} else {
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
// Then notify
ChatMessage.create({
@ -175,13 +186,13 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
get armorMalusValue() { // used for Fight Options
for (let armor of this.armors) {
if (armor.data.properties.armorQuality.includes("light")) {
if (armor.system.properties.armorQuality.includes("light")) {
return 1
}
if (armor.data.properties.armorQuality.includes("medium")) {
if (armor.system.properties.armorQuality.includes("medium")) {
return 2
}
if (armor.data.properties.armorQuality.includes("heavy")) {
if (armor.system.properties.armorQuality.includes("heavy")) {
return 3
}
}
@ -189,109 +200,113 @@ export class BoLActor extends Actor {
}
get resources() {
return Object.values(this.data.data.resources)
return Object.values(this.system.resources)
}
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() {
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() {
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() {
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() {
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() {
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() {
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() {
return this.itemData.filter(i => i.type === "feature")
return this.items.filter(i => i.type === "feature")
}
get equipment() {
return this.itemData.filter(i => i.type === "item")
return this.items.filter(i => i.type === "item")
}
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() {
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() {
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() {
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() {
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() {
return this.armors.concat(this.helms).concat(this.shields)
}
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() {
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() {
return this.weapons.filter(i => i.data.properties.melee === true);
return this.weapons.filter(i => i.system.properties.melee === true);
}
get natural() {
return this.weapons.filter(i => i.data.properties.natural === true);
return this.weapons.filter(i => i.system.properties.natural === true);
}
get ranged() {
return this.weapons.filter(i => i.data.properties.ranged === true);
return this.weapons.filter(i => i.system.properties.ranged === true);
}
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() {
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() {
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() {
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() {
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() {
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() {
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() {
if (this.careers.find(item => item.data.properties.sorcerer == true))
if (this.careers.find(item => item.system.properties.sorcerer == true))
return true
return false
}
isAlchemist() {
if (this.careers.find(item => item.data.properties.alchemist == true))
if (this.careers.find(item => item.system.properties.alchemist == true))
return true
return false
}
isPriest() {
if (this.careers.find(item => item.data.properties.priest == true))
if (this.careers.find(item => item.system.properties.priest == true))
return true
return false
}
@ -301,8 +316,8 @@ export class BoLActor extends Actor {
let armors = this.armors
let ppCostArmor = 0
for (let armor of armors) {
if (armor.data.worn) {
ppCostArmor += Number(armor.data.properties.modifiers.powercost) || 0
if (armor.system.worn) {
ppCostArmor += Number(armor.system.properties.modifiers.powercost) || 0
}
}
return ppCostArmor
@ -311,8 +326,8 @@ export class BoLActor extends Actor {
getArmorAgiMalus() {
let malusAgi = 0
for (let armor of this.protections) {
if (armor.data.worn) {
malusAgi += Number(armor.data.properties.modifiers.agility) || 0
if (armor.system.worn) {
malusAgi += Number(armor.system.properties.modifiers.agility) || 0
}
}
return malusAgi
@ -321,8 +336,8 @@ export class BoLActor extends Actor {
getArmorInitMalus() {
let malusInit = 0
for (let armor of this.protections) {
if (armor.data.worn) {
malusInit += Number(armor.data.properties.modifiers.init) || 0
if (armor.system.worn) {
malusInit += Number(armor.system.properties.modifiers.init) || 0
}
}
return malusInit
@ -330,57 +345,61 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
spendPowerPoint(ppCost) {
let newPP = this.data.data.resources.power.value - ppCost
let newPP = this.system.resources.power.value - ppCost
newPP = (newPP < 0) ? 0 : newPP
this.update({ 'data.resources.power.value': newPP })
this.update({ 'system.resources.power.value': newPP })
return newPP
}
/*-------------------------------------------- */
resetAlchemyStatus(alchemyId) {
let alchemy = this.data.items.get(alchemyId)
let alchemy = this.items.get(alchemyId)
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) {
let alchemy = this.data.items.get(alchemyId)
let alchemy = this.items.get(alchemyId)
if (alchemy) {
pcCost = Number(pcCost) ?? 0
if (this.data.data.resources.alchemypoints.value >= pcCost) {
let newPC = this.data.data.resources.alchemypoints.value - pcCost
if (this.system.resources.alchemypoints.value >= pcCost) {
let newPC = this.system.resources.alchemypoints.value - pcCost
newPC = (newPC < 0) ? 0 : newPC
this.update({ 'data.resources.alchemypoints.value': newPC })
newPC = alchemy.data.data.properties.pccurrent + pcCost
await this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'data.properties.pccurrent': newPC }])
newPC = alchemy.system.properties.pccurrent + pcCost
await this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'system.properties.pccurrent': newPC }])
} else {
ui.notifications.warn("Plus assez de Points de Création !")
}
}
}
/*-------------------------------------------- */
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) {
return sorcerer.data.rank
return sorcerer.system.rank
}
return 0;
}
/*-------------------------------------------- */
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) {
return sorcerer.data.rank
return sorcerer.system.rank
}
return 0;
}
/*-------------------------------------------- */
heroReroll() {
if (this.type == 'character') {
return this.data.data.resources.hero.value > 0;
return this.system.resources.hero.value > 0;
} else {
if (this.data.data.type == 'adversary') {
return this.data.data.resources.hero.value > 0;
if (this.system.type == 'adversary') {
return this.system.resources.hero.value > 0;
}
}
return false
@ -389,17 +408,17 @@ export class BoLActor extends Actor {
getResourcesFromType() {
let resources = {};
if (this.type == 'encounter') {
resources['hp'] = this.data.data.resources.hp;
if (this.data.data.type != 'base') {
resources['faith'] = this.data.data.resources.faith
resources['power'] = this.data.data.resources.power
resources['hp'] = this.system.resources.hp;
if (this.system.type != 'base') {
resources['faith'] = this.system.resources.faith
resources['power'] = this.system.resources.power
}
if (this.data.data.type == 'adversary') {
resources['hero'] = duplicate(this.data.data.resources.hero)
if (this.system.type == 'adversary') {
resources['hero'] = duplicate(this.system.resources.hero)
resources['hero'].label = "BOL.resources.villainy"
}
} else {
resources = this.data.data.resources;
resources = this.system.resources;
}
return resources
}
@ -440,6 +459,11 @@ export class BoLActor extends Actor {
"label": "BOL.featureCategory.fightoptions",
"ranked": false,
"items": this.fightoptions
},
"godsfaith": {
"label": "BOL.featureSubtypes.gods",
"ranked": false,
"items": this.godsfaith
}
}
}
@ -455,6 +479,15 @@ export class BoLActor extends Actor {
"options": false,
"items": this.melee
},
"natural": {
"label": "BOL.combatCategory.natural",
"weapon": true,
"protection": false,
"blocking": false,
"ranged": false,
"options": false,
"items": this.natural
},
"ranged": {
"label": "BOL.combatCategory.ranged",
"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() {
let rolls = []
for (let key in this.data.data.attributes) {
let attr = this.data.data.attributes[key]
for (let key in this.system.attributes) {
let attr = this.system.attributes[key]
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") {
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" })
}
}
@ -535,20 +546,20 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */
buildListeActions() {
return this.melee.concat(this.ranged)
return this.melee.concat(this.ranged).concat(this.natural)
}
/*-------------------------------------------- */
async manageHealthState() {
let hpID = "lastHP" + this.id
let lastHP = await this.getFlag("world", hpID)
if (lastHP != this.data.data.resources.hp.value && this.isOwner ) {
await this.setFlag("world", hpID, this.data.data.resources.hp.value)
if (this.data.data.resources.hp.value <= 0) {
if (lastHP != this.system.resources.hp.value && game.user.isGM ) { // Only GM sends this
await this.setFlag("world", hpID, this.system.resources.hp.value)
if (this.system.resources.hp.value <= 0) {
ChatMessage.create({
alias: 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) {
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() {
return this.data.data.combat
return this.system.combat
}
/*-------------------------------------------- */
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;
await this.update({ 'data.resources.hero.value': newHeroP });
await this.update({ 'system.resources.hero.value': newHeroP });
}
/*-------------------------------------------- */
async sufferDamage(damage) {
let newHP = this.data.data.resources.hp.value - damage;
await this.update({ 'data.resources.hp.value': newHP });
let newHP = this.system.resources.hp.value - damage
await this.update({ 'system.resources.hp.value': newHP })
}
/* -------------------------------------------- */
getArmorFormula() {
let protectWorn = this.protections.filter(item => item.data.worn)
let protectWorn = this.protections.filter(item => item.system.worn)
let formula = ""
for (let protect of protectWorn) {
if (protect.data.subtype == 'helm') {
if (protect.system.subtype == 'helm') {
formula += "+1"
} else if (protect.data.subtype == 'armor') {
} else if (protect.system.subtype == 'armor') {
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 !`)
} else {
formula += "+" + protect.data.properties.soak.formula
formula += "+" + " max(" + protect.system.properties.soak.formula +",0)"
}
} 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 !`)
} else {
formula += "+ " + protect.data.properties.soak.value
formula += "+ " + protect.system.properties.soak.value
}
}
}
@ -606,19 +617,19 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
rollProtection(itemId) {
let armor = this.data.items.get(itemId)
let armor = duplicate(this.items.get(itemId))
if (armor) {
let armorFormula = armor.data.data.properties.soak.formula;
let armorFormula = "max("+armor.system.properties.soak.formula + ", 0)"
let rollArmor = new Roll(armorFormula)
rollArmor.roll({ async: false }).toMessage();
rollArmor.roll({ async: false }).toMessage()
}
}
/* -------------------------------------------- */
rollWeaponDamage(itemId) {
let weapon = this.data.items.get(itemId)
let weapon = duplicate(this.items.get(itemId))
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.rollDamage()
}
@ -626,10 +637,10 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */
toggleEquipItem(item) {
const equipable = item.data.data.properties.equipable;
const equipable = item.system.properties.equipable;
if (equipable) {
let itemData = duplicate(item.data);
itemData.data.worn = !itemData.data.worn;
let itemData = duplicate(item);
itemData.system.worn = !itemData.system.worn;
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 { BoLTokenHud } from "./system/bol-action-hud.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 () {
@ -28,7 +30,7 @@ Hooks.once('init', async function () {
// Game socket
game.socket.on("system.bol", sockmsg => {
BoLUtility.onSocketMessage(sockmsg);
});
})
/**
@ -55,6 +57,8 @@ Hooks.once('init', async function () {
BoLUtility.init()
BoLTokenHud.init()
BoLHotbar.init()
BoLCommands.init()
BoLAdventureGenerator.init()
// Preload Handlebars Templates
await preloadHandlebarsTemplates();
@ -75,6 +79,7 @@ function registerUsageCount( registerKey ) {
name: "Unique world key",
scope: "world",
config: false,
default: "",
type: String
});
@ -84,7 +89,10 @@ function registerUsageCount( registerKey ) {
game.settings.set(registerKey, "world-key", worldKey )
}
// 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)
}
}
@ -95,19 +103,21 @@ function welcomeMessage() {
user: game.user.id,
whisper: [game.user.id],
content: `<div id="welcome-message-pegasus"><span class="rdd-roll-part">
<strong>Bienvenue dans Barbarians of Lemuria (Ludospherik version)</strong>
<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>
<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 !.
<p>Tout le support et le suivi de ce système es disponible via le Discord Foundry FR : https://discord.gg/pPSDNJk </p>
<p>Bon jeu en Lemurie !</p>
` });
<strong>` + game.i18n.localize("BOL.chat.welcome1") + `</strong><p>` +
game.i18n.localize("BOL.chat.welcome2") + "<p>" +
game.i18n.localize("BOL.chat.welcome3") + "<p>" +
game.i18n.localize("BOL.chat.welcome4") + "</p>" +
game.i18n.localize("BOL.chat.welcome5") + "</p>"
} )
}
/* -------------------------------------------- */
Hooks.once('ready', async function () {
BoLUtility.ready()
registerUsageCount('bol')
welcomeMessage()
});
})

View File

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

View File

@ -20,42 +20,41 @@ export class BoLItemSheet extends ItemSheet {
/* -------------------------------------------- */
/** @override */
getData(options) {
const data = super.getData(options);
const itemData = data.data;
data.config = game.bol.config;
data.item = itemData;
data.data = itemData.data;
data.category = itemData.category;
data.itemProperties = this.item.itemProperties;
const data = super.getData(options)
let itemData = duplicate(data.document)
data.config = game.bol.config
data.item = itemData
data.category = itemData.system.category
data.isGM = game.user.isGM;
data.itemProperties = this.item.itemProperties;
// Dynamic default data fix/adapt
if (itemData.type == "item") {
if (!itemData.data.category) {
itemData.data.category = "equipment"
if (!itemData.system.category) {
itemData.system.category = "equipment"
}
if ( itemData.data.category == "equipment" && itemData.data.properties.equipable) {
if (!itemData.data.properties.slot) {
itemData.data.properties.slot = "-"
if ( itemData.system.category == "equipment" && itemData.system.properties.equipable) {
if (!itemData.system.properties.slot) {
itemData.system.properties.slot = "-"
}
}
if (itemData.data.category == 'spell') {
if(!itemData.data.properties.mandatoryconditions) {
itemData.data.properties.mandatoryconditions = []
if (itemData.system.category == 'spell') {
if(!itemData.system.properties.mandatoryconditions) {
itemData.system.properties.mandatoryconditions = []
}
if(!itemData.data.properties.optionnalconditions) {
itemData.data.properties.optionnalconditions = []
if(!itemData.system.properties.optionnalconditions) {
itemData.system.properties.optionnalconditions = []
}
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++) {
itemData.data.properties.optionnalconditions[i] = itemData.data.properties.optionnalconditions[i] ?? ""
itemData.system.properties.optionnalconditions[i] = itemData.system.properties.optionnalconditions[i] ?? ""
}
}
} else {
if (!itemData.data.subtype) {
itemData.data.category = "origin"
if (!itemData.system.subtype) {
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.
*/
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;
}
super.prepareData()
get properties() {
return this.data.properties;
const actorData = this.actor ? this.actor.system : {}
}
/* -------------------------------------------- */
get properties() {
return this.system.properties
}
/* -------------------------------------------- */
/**
* Get the Array of item properties which are used in the small sidebar of the description tab
* @return {Array}
@ -29,11 +25,11 @@ export class BoLItem extends Item {
*/
get itemProperties() {
const props = [];
if ( this.data.type === "item" ) {
const entries = Object.entries(this.data.data.properties);
props.push(...entries.filter(e => e[1] === true).map(e => { return game.bol.config.itemProperties2[e[0]] }));
if ( this.type === "item" ) {
const entries = Object.entries(this.system.properties)
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 action = hudData.actionsList[actionIndex]
const weapon = actor.items.get( action._id )
BoLRoll.weaponCheckWithWeapon(hudData.actor, weapon)
BoLRoll.weaponCheckWithWeapon(hudData.actor, duplicate(weapon))
//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 = {}) {
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
ids = typeof ids === "string" ? [ids] : ids;
const currentId = this.combatant._id;

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

@ -18,7 +18,7 @@ export class BoLUtility {
default: true,
type: Boolean,
onChange: lang => window.location.reload()
});
})
game.settings.register("bol", "useBougette", {
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/)",
@ -27,14 +27,32 @@ export class BoLUtility {
default: false,
type: Boolean,
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.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() {
return this.rollArmor
@ -43,9 +61,19 @@ export class BoLUtility {
static getUseBougette() {
return this.useBougette
}
/* -------------------------------------------- */
static getLogoActorSheet() {
return this.actorSheetLogo
}
/* -------------------------------------------- */
static getLogoTopLeft() {
return this.logoTopLeft
}
/* -------------------------------------------- */
static async ready() {
//$("#logo").attr("src", this.getLogoTopLeft() )
$("#logo").css("content",`url(${this.getLogoTopLeft()})`)
}
/* -------------------------------------------- */
@ -63,12 +91,12 @@ export class BoLUtility {
/* -------------------------------------------- */
static storeRoll(roll) {
this.lastRoll = roll
this.rollTab[roll.id] = roll
}
/* -------------------------------------------- */
static getLastRoll() {
return this.lastRoll
static getRoll(rollId) {
return this.rollTab[roll.id]
}
/* -------------------------------------------- */
@ -127,16 +155,16 @@ export class BoLUtility {
return undefined;
}
/* -------------------------------------------- */
static getOtherWhisperRecipients( name) {
static getOtherWhisperRecipients(name) {
let users = []
for( let user of game.users) {
if ( !user.isGM && user.name != name) {
users.push( user.data._id)
for (let user of game.users) {
if (!user.isGM && user.name != name) {
users.push(user.id)
}
}
return users
}
/* -------------------------------------------- */
static getWhisperRecipientsAndGMs(name) {
let recep1 = ChatMessage.getWhisperRecipients(name) || [];
@ -173,35 +201,47 @@ export class BoLUtility {
//console.log("FOUND 1!!! ", actor)
if (actor && actor.isOwner) return
else if (game.user.isGM || data.author.id === game.user.id) return
const divButtons = chatCard.find('.actions-section')
console.log("FOUND 2!! ", divButtons)
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) {
// Damage handling
html.on("click", '.chat-damage-apply', event => {
let rollData = BoLUtility.getLastRoll()
$(`#${rollData.applyId}`).hide()
let rollData = BoLUtility.getRollDataFromMessage(event)
BoLUtility.cleanupButtons(rollData.applyId)
BoLUtility.sendAttackSuccess(rollData)
});
html.on("click", '.chat-damage-roll', event => {
event.preventDefault();
let rollData = BoLUtility.getLastRoll()
rollData.damageMode = event.currentTarget.attributes['data-damage-mode'].value;
event.preventDefault()
let rollData = BoLUtility.getRollDataFromMessage(event)
rollData.damageMode = event.currentTarget.attributes['data-damage-mode'].value
let bolRoll = new BoLDefaultRoll(rollData)
bolRoll.rollDamage()
});
html.on("click", '.transform-legendary-roll', event => {
event.preventDefault();
let rollData = BoLUtility.getLastRoll()
let actor = game.actors.get( rollData.actorId)
let rollData = BoLUtility.getRollDataFromMessage(event)
let actor = game.actors.get(rollData.actorId)
actor.subHeroPoints(1)
let r = new BoLDefaultRoll(rollData)
r.upgradeToLegendary()
@ -209,8 +249,8 @@ export class BoLUtility {
html.on("click", '.transform-heroic-roll', event => {
event.preventDefault();
let rollData = BoLUtility.getLastRoll()
let actor = game.actors.get( rollData.actorId)
let rollData = BoLUtility.getRollDataFromMessage(event)
let actor = game.actors.get(rollData.actorId)
actor.subHeroPoints(1)
let r = new BoLDefaultRoll(rollData)
r.upgradeToHeroic()
@ -218,8 +258,8 @@ export class BoLUtility {
html.on("click", '.hero-reroll', event => {
event.preventDefault();
let rollData = BoLUtility.getLastRoll()
let actor = game.actors.get( rollData.actorId)
let rollData = BoLUtility.getRollDataFromMessage(event)
let actor = game.actors.get(rollData.actorId)
actor.subHeroPoints(1)
rollData.reroll = false // Disable reroll option for second roll
let r = new BoLDefaultRoll(rollData)
@ -231,24 +271,24 @@ export class BoLUtility {
let attackId = event.currentTarget.attributes['data-attack-id'].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
// Remove message for all
let msgId = BoLUtility.findChatMessageId(event.currentTarget)
if (game.user.isGM) {
console.log("Process handling !!! -> GM direct damage handling")
BoLUtility.processDamageHandling(event, attackId, defenseMode, weaponId)
BoLUtility.processDamageHandling(attackId, defenseMode, weaponId, msgId)
} else {
console.log("Process handling !!! -> socket emit")
game.socket.emit("system.bol", { name: "msg_damage_handling", data: { event: event, attackId: attackId, defenseMode: defenseMode, weaponId: weaponId } });
game.socket.emit("system.bol", { name: "msg_damage_handling", data: { msgId: msgId, 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) {
return;
return
}
BoLUtility.removeChatMessageId(BoLUtility.findChatMessageId(event.currentTarget));
console.log("Damage Handling", event, attackId, defenseMode, weaponId)
BoLUtility.removeChatMessageId( msgId )
console.log("Damage Handling", attackId, defenseMode, weaponId)
// Only GM process this
let attackDef = this.attackStore[attackId]
if (attackDef && attackDef.defenderId) {
@ -256,54 +296,70 @@ export class BoLUtility {
return
} // ?? Why ???
attackDef.defenseDone = true
attackDef.defenseMode = defenseMode;
let defender = game.actors.get(attackDef.defenderId)
attackDef.defenseMode = defenseMode
let token = game.scenes.current.tokens.get(attackDef.targetId)
let defender = token.actor
if (defenseMode == 'damage-with-armor') {
let armorFormula = defender.getArmorFormula()
attackDef.rollArmor = new Roll(armorFormula)
attackDef.rollArmor.roll( { async: false } )
console.log("Armor roll ", attackDef.rollArmor)
attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total;
attackDef.finalDamage = attackDef.damageRoll.total - attackDef.armorProtect;
attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage;
defender.sufferDamage(attackDef.finalDamage);
attackDef.rollArmor.roll({ async: false })
attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total
attackDef.finalDamage = attackDef.damageTotal - attackDef.armorProtect
attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage
defender.sufferDamage(attackDef.finalDamage)
console.log("Armor roll -> result ", attackDef)
}
if (defenseMode == 'damage-without-armor') {
attackDef.finalDamage = attackDef.damageRoll.total;
defender.sufferDamage(attackDef.finalDamage);
attackDef.finalDamage = attackDef.damageTotal
defender.sufferDamage(attackDef.finalDamage)
}
if (defenseMode == 'hero-reduce-damage') {
let armorFormula = defender.getArmorFormula();
let armorFormula = defender.getArmorFormula()
attackDef.rollArmor = new Roll(armorFormula)
attackDef.rollArmor.roll({ async: false });
attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total;
attackDef.rollHero = new Roll("1d6");
attackDef.rollHero.roll({ async: false });
attackDef.finalDamage = attackDef.damageRoll.total - attackDef.rollHero.total - attackDef.armorProtect;
attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage;
defender.sufferDamage(attackDef.finalDamage);
defender.subHeroPoints(1);
attackDef.rollArmor.roll({ async: false })
attackDef.armorProtect = (attackDef.rollArmor.total < 0) ? 0 : attackDef.rollArmor.total
attackDef.rollHero = new Roll("1d6")
attackDef.rollHero.roll({ async: false })
attackDef.finalDamage = attackDef.damageTotal - attackDef.rollHero.total - attackDef.armorProtect
attackDef.finalDamage = (attackDef.finalDamage < 0) ? 0 : attackDef.finalDamage
defender.sufferDamage(attackDef.finalDamage)
defender.subHeroPoints(1)
}
if (defenseMode == 'hero-in-extremis') {
attackDef.finalDamage = 0;
attackDef.weaponHero = defender.weapons.find(item => item._id == 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({
alias: defender.name,
whisper: BoLUtility.getWhisperRecipientsAndGMs(defender.name),
content: await renderTemplate('systems/bol/templates/chat/rolls/defense-result-card.hbs', {
attackId: attackDef.id,
attacker: attackDef.attacker,
rollArmor: attackDef.rollArmor,
rollHero: attackDef.rollHero,
weaponHero: attackDef.weaponHero,
armorProtect: attackDef.armorProtect,
defender: defender,
defenseMode: attackDef.defenseMode,
finalDamage: attackDef.finalDamage
})
content: await renderTemplate('systems/bol/templates/chat/rolls/defense-result-card.hbs', damageResults)
})
console.log("Defender data : ", defenderUser)
ChatMessage.create({
alias: defender.name,
whisper: BoLUtility.getOtherWhisperRecipients(defenderUser?.name),
content: await renderTemplate('systems/bol/templates/chat/rolls/defense-summary-card.hbs', damageResults)
})
}
}
@ -386,8 +442,8 @@ export class BoLUtility {
}
// Build and send the defense message to the relevant people (ie GM + defender)
let defender = game.actors.get(attackDef.defenderId)
let defenderWeapons = defender.weapons
console.log("DEF WEP", attackDef)
console.log("DEF WEP", attackDef, defender)
let defenderWeapons = defender.weapons || []
this.attackStore[attackDef.id] = attackDef // Store !
ChatMessage.create({
alias: defender.name,
@ -408,15 +464,18 @@ export class BoLUtility {
if (sockmsg.name == "msg_attack_success") {
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") {
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) {
let pp = spell.data.data.properties.ppcost
let minpp = __circle2minpp[spell.data.data.properties.circle]
let pp = spell.data.properties.ppcost
let minpp = __circle2minpp[spell.data.properties.circle]
pp = (pp - nbOptCond < minpp) ? minpp : pp - nbOptCond
return pp
}
@ -441,11 +500,11 @@ export class BoLUtility {
let postForm = 'kh' + nbDice
let modIndex = 3
// Upgrade damage if needed
if ( upgradeDamage && ( !res[3] || res[3]=="") ) {
if (upgradeDamage && (!res[3] || res[3] == "")) {
res[3] = "B" // Upgrade to bonus
}
if (res[3]) {
if ( upgradeDamage && res[3] == 'M') {
if (upgradeDamage && res[3] == 'M') {
res[3] = "" // Disable lamlus for upgradeDamage
}
if (res[3] == 'M') {
@ -453,11 +512,21 @@ export class BoLUtility {
nbDice++
modIndex = 4
}
if (res[3] == 'MM') {
postForm = 'kl' + nbDice
nbDice += 2
modIndex = 4
}
if (res[3] == 'B') {
postForm = 'kh' + nbDice
nbDice++
modIndex = 4
}
if (res[3] == 'BB') {
postForm = 'kh' + nbDice
nbDice += 2
modIndex = 4
}
}
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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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"}
{"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":"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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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"}}}
{"_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",
"description": "The Barbarians of Lemuria system for FoundryVTT!",
"author": "Zigmund,LeRatierBretonnien",
"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",
"flags": {},
"version": "1.3.5",
"templateVersion": 10,
"minimumCoreVersion": "0.8.6",
"compatibleCoreVersion": "9",
"scripts": [],
"version": "10.1.1",
"compatibility": {
"minimum": "10"
},
"esmodules": [
"module/bol.js"
],
@ -29,12 +28,20 @@
{
"lang": "en",
"name": "English",
"path": "lang/en.json"
"path": "lang/en.json",
"flags": {}
},
{
"lang": "fr",
"name": "Français",
"path": "lang/fr.json"
"path": "lang/fr.json",
"flags": {}
},
{
"lang": "de",
"name": "Deutsch",
"path": "lang/de.json",
"flags": {}
}
],
"packs": [
@ -42,64 +49,64 @@
"name": "boons",
"label": "Avantages",
"system": "bol",
"path": "./packs/boons.db",
"tag": "boon",
"path": "packs/boons.db",
"type": "Item",
"private": false
"private": false,
"flags": {}
},
{
"name": "boons",
"name": "boonsflawscreatures",
"label": "Avantages/Désavantages de Créatures",
"system": "bol",
"path": "./packs/boonsflawscreatures.db",
"tag": "boon",
"path": "packs/boonsflawscreatures.db",
"type": "Item",
"private": false
"private": false,
"flags": {}
},
{
"name": "flaws",
"label": "Désavantages",
"system": "bol",
"path": "./packs/flaws.db",
"tag": "flaw",
"path": "packs/flaws.db",
"type": "Item",
"private": false
"private": false,
"flags": {}
},
{
"name": "careers",
"label": "Carrières héroïques",
"system": "bol",
"path": "./packs/careers.db",
"tag": "career",
"path": "packs/careers.db",
"type": "Item",
"private": false
"private": false,
"flags": {}
},
{
"name": "origins",
"label": "Origines",
"system": "bol",
"path": "./packs/origins.db",
"tag": "origin",
"path": "packs/origins.db",
"type": "Item",
"private": false
"private": false,
"flags": {}
},
{
"name": "races",
"label": "Races",
"system": "bol",
"path": "./packs/races.db",
"tag": "race",
"path": "packs/races.db",
"type": "Item",
"private": false
"private": false,
"flags": {}
},
{
"name": "equipment",
"label": "Equipement",
"system": "bol",
"path": "./packs/equipment.db",
"tag": "item",
"path": "packs/equipment.db",
"type": "Item",
"private": false
"private": false,
"flags": {}
},
{
"label": "Aides de Jeu",
@ -107,7 +114,8 @@
"name": "aides-de-jeu",
"path": "packs/aides-de-jeu.db",
"system": "bol",
"private": false
"private": false,
"flags": {}
},
{
"label": "Cartes",
@ -115,7 +123,8 @@
"name": "cartes",
"path": "packs/cartes.db",
"system": "bol",
"private": false
"private": false,
"flags": {}
},
{
"label": "Langues",
@ -123,7 +132,8 @@
"name": "languages",
"path": "packs/languages.db",
"system": "bol",
"private": false
"private": false,
"flags": {}
},
{
"label": "Sorts",
@ -131,7 +141,8 @@
"name": "spells",
"path": "packs/spells.db",
"system": "bol",
"private": false
"private": false,
"flags": {}
},
{
"label": "Dieux",
@ -139,7 +150,8 @@
"name": "godsfaith",
"path": "packs/godsfaith.db",
"system": "bol",
"private": false
"private": false,
"flags": {}
},
{
"label": "Options de Combat",
@ -147,7 +159,26 @@
"name": "fightoptions",
"path": "packs/fightoptions.db",
"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",
@ -155,18 +186,16 @@
"name": "creatures",
"path": "packs/creatures.db",
"system": "bol",
"private": false
"private": false,
"flags": {}
}
],
"system": [],
"dependencies": [],
"socket": true,
"manifest": "https://raw.githubusercontent.com/ZigmundKreud/bol/master/system.json",
"download": "https://github.com/ZigmundKreud/bol/archive/refs/heads/master.zip",
"protected": false,
"background": "images/map_lemurie.webp",
"manifest": "https://www.uberwald.me/gitea/public/bol/raw/v10/system.json",
"download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v10.1.1.zip",
"background": "systems/images/map_lemurie.webp",
"gridDistance": 1.5,
"gridUnits": "m",
"primaryTokenAttribute": "resources.hp",
"secondaryTokenAttribute": "resources.hero"
}
}

View File

@ -137,7 +137,7 @@
},
"character": {
"templates": [ "base" ],
"type": "player",
"chartype": "player",
"villainy": false,
"bougette": {
"state": "nomoney"
@ -157,7 +157,7 @@
},
"encounter": {
"templates": [ "base" ],
"type": "tough",
"chartype": "tough",
"villainy": false,
"size": "",
"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">
{{!-- 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"
style="border:1px outset lightgray; box-shadow: 5px 5px 5px gray" />
</div>

View File

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

View File

@ -12,14 +12,14 @@
<li class="item flexrow" data-item-id="{{item._id}}">
<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>
{{#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 ../blocking}}<div class="item-field">{{item.data.properties.blocking.malus}}</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.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}}
{{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 item.data.properties.activated}}
{{#if item.system.properties.activated}}
<a class="toggle-fight-option">{{localize "BOL.ui.toactivated"}}</a>
{{else}}
<a class="toggle-fight-option">{{localize "BOL.ui.todeactivated"}}</a>

View File

@ -1,29 +1,29 @@
<ol class="items-list">
{{#if (ne data.type "creature")}}
{{#if (ne actor.type "creature")}}
<li class="item flexrow item-header">
<div class="item-name left">Taille </div>
<div class="item-field flex2 left"><input type="text" name="data.details.height" value="{{data.details.height}}"></div>
<div class="item-name right">Poids </div>
<div class="item-field flex2 "><input type="text" name="data.details.weight" value="{{data.details.weight}}"></div>
<div class="item-name right">Age </div>
<div class="item-field flex2 "><input type="text" name="data.details.age" value="{{data.details.age}}"></div>
<div class="item-name left">{{localize "BOL.ui.biosize"}}</div>
<div class="item-field flex2 left"><input type="text" name="system.details.height" value="{{details.height}}"></div>
<div class="item-name right">{{localize "BOL.ui.bioweight"}}</div>
<div class="item-field flex2 "><input type="text" name="system.details.weight" value="{{details.weight}}"></div>
<div class="item-name right">{{localize "BOL.ui.bioage"}} </div>
<div class="item-field flex2 "><input type="text" name="system.details.age" value="{{details.age}}"></div>
</li>
<li class="item flexrow item-header">
<div class="item-name left">Cheveux </div>
<div class="item-field flex2 left"><input type="text" name="data.details.hait" value="{{data.details.hait}}"></div>
<div class="item-name right">Yeux </div>
<div class="item-field flex2 "><input type="text" name="data.details.eyes" value="{{data.details.eyes}}"></div>
<div class="item-name left">{{localize "BOL.ui.biohair"}} </div>
<div class="item-field flex2 left"><input type="text" name="system.details.hait" value="{{details.hait}}"></div>
<div class="item-name right">{{localize "BOL.ui.bioeyes"}} </div>
<div class="item-field flex2 "><input type="text" name="system.details.eyes" value="{{details.eyes}}"></div>
</li>
<li class="item flexrow item-header">
<div class="item-name left">Signes distinctifs </div>
<div class="item-field flex2 left"><input type="text" name="data.details.signs" value="{{data.details.signs}}"></div>
<div class="item-name left">{{localize "BOL.ui.biosigns"}} </div>
<div class="item-field flex2 left"><input type="text" name="system.details.signs" value="{{details.signs}}"></div>
</li>
{{else}}
<li class="item flexrow item-header">
<div class="item-name left">Taille </div>
<div class="form-fields center">
<select class="field-value size" name="data.details.size" data-dtype="String">
{{#select data.details.size}}
<select class="field-value size" name="system.details.size" data-dtype="String">
{{#select details.size}}
{{#each config.creatureSize as |value id|}}
<option value="{{id}}">{{localize value}}</option>
{{/each}}
@ -35,18 +35,18 @@
</ol>
<ol class="items-list">
<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>
</li>
</ol>
{{editor content=data.details.biography target="data.details.biography" button=true owner=owner
{{editor details.biography target="system.details.biography" button=true owner=owner
editable=editable}}
<ol class="items-list">
<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>
</li>
</ol>
{{editor content=data.details.notes target="data.details.notes" button=true owner=owner editable=editable}}
{{editor details.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}}">
<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>
{{#if ../protection}}<div class="item-field">{{item.data.properties.soak.value}}</div>{{/if}}
{{#if ../blocking}}<div class="item-field">{{item.data.properties.blocking.malus}}</div>{{/if}}
{{#if ../weapon}}<div class="item-field">{{item.data.properties.damage}}</div>{{/if}}
{{#if ../ranged}}<div class="item-field">{{item.data.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}}
{{#if ../protection}}<div class="item-field">{{item.system.properties.soak.value}}</div>{{/if}}
{{#if ../blocking}}<div class="item-field">{{item.system.properties.blocking.malus}}</div>{{/if}}
{{#if ../weapon}}<div class="item-field">{{item.system.properties.damage}}</div>{{/if}}
{{#if ../ranged}}<div class="item-field">{{item.system.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}}
</li>
{{/each}}
</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>
{{localize "BOL.ui.money"}}
</h4>
<select class="field-value" name="data.bougette.state" data-dtype="String">
{{#select data.bougette.state}}
<select class="field-value" name="system.bougette.state" data-dtype="String">
{{#select system.bougette.state}}
{{#each config.bougetteState as |value id|}}
<option value="{{id}}">{{localize value}}</option>
{{/each}}
@ -39,26 +39,26 @@
<a class="item-edit">{{item.name}}</a>
</h4>
<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
"BOL.equipmentSlots." item.data.properties.slot)}}</span>
"BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}}
</div>
<div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}}
</div>
<div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span>
<span class="item-field">{{item.system.price}}</span>
</div>
<div class="item-field flex1 center">
{{#if data.properties.equipable}}
{{#if data.worn}}
{{#if system.properties.equipable}}
{{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span>
{{else}}
@ -92,32 +92,32 @@
<a class="item-edit">{{item.name}}</a>
</h4>
<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
"BOL.equipmentSlots." item.data.properties.slot)}}</span>
"BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}}
</div>
<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">{{data.properties.soak.formula}}</span>
style="font-size: smaller; font-style: italic; color:#4b4a44">{{system.properties.soak.formula}}</span>
{{/if}}
</div>
<div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}}
</div>
<div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span>
<span class="item-field">{{item.system.price}}</span>
</div>
<div class="item-field flex1 center">
{{#if data.properties.equipable}}
{{#if data.worn}}
{{#if system.properties.equipable}}
{{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span>
{{else}}
@ -150,26 +150,26 @@
<a class="item-edit">{{item.name}}</a>
</h4>
<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
"BOL.equipmentSlots." item.data.properties.slot)}}</span>
"BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}}
</div>
<div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}}
</div>
<div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span>
<span class="item-field">{{item.system.price}}</span>
</div>
<div class="item-field flex1 center">
{{#if data.properties.equipable}}
{{#if data.worn}}
{{#if system.properties.equipable}}
{{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span>
{{else}}
@ -202,26 +202,26 @@
<a class="item-edit">{{item.name}}</a>
</h4>
<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
"BOL.equipmentSlots." item.data.properties.slot)}}</span>
"BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}}
</div>
<div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{#if item.system.properties.stackable}}
<a class="system-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}}
</div>
<div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span>
<span class="item-field">{{item.system.price}}</span>
</div>
<div class="item-field flex1 center">
{{#if data.properties.equipable}}
{{#if data.worn}}
{{#if system.properties.equipable}}
{{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span>
{{else}}
@ -254,26 +254,26 @@
<a class="item-edit">{{item.name}}</a>
</h4>
<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
"BOL.equipmentSlots." item.data.properties.slot)}}</span>
"BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}}
</div>
<div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}}
</div>
<div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span>
<span class="item-field">{{item.system.price}}</span>
</div>
<div class="item-field flex1 center">
{{#if data.properties.equipable}}
{{#if data.worn}}
{{#if system.properties.equipable}}
{{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span>
{{else}}
@ -306,26 +306,26 @@
<a class="item-edit">{{item.name}}</a>
</h4>
<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
"BOL.equipmentSlots." item.data.properties.slot)}}</span>
"BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}}
</div>
<div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}}
</div>
<div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span>
<span class="item-field">{{item.system.price}}</span>
</div>
<div class="item-field flex1 center">
{{#if data.properties.equipable}}
{{#if data.worn}}
{{#if system.properties.equipable}}
{{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span>
{{else}}
@ -358,26 +358,26 @@
<a class="item-edit">{{item.name}}</a>
</h4>
<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
"BOL.equipmentSlots." item.data.properties.slot)}}</span>
"BOL.equipmentSlots." item.system.properties.slot)}}</span>
{{/if}}
</div>
<div class="item-field group-btns flex1 center">
{{#if item.data.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.data.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="data.quantity" data-incr="1" data-min="0"
data-max="{{item.data.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{#if item.system.properties.stackable}}
<a class="inc-dec-btns" data-operator="minus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-minus-square"></i></a>&nbsp;
<span class="item-field">{{item.system.quantity}}</span>&nbsp;
<a class="inc-dec-btns" data-operator="plus" data-target="system.quantity" data-incr="1" data-min="0"
data-max="{{item.system.properties.stacksize}}"><i class="fas fa-plus-square"></i></a>
{{/if}}
</div>
<div class="item-field flex1 center">
<span class="item-field">{{item.data.price}}</span>
<span class="item-field">{{item.system.price}}</span>
</div>
<div class="item-field flex1 center">
{{#if data.properties.equipable}}
{{#if data.worn}}
{{#if system.properties.equipable}}
{{#if system.worn}}
<span class="item-field"><a class="item-control item-equip" title="{{localize " BOL.ui.unequip"}}"><i
class="fas fa-shield-alt"></i></a></span>
{{else}}

View File

@ -16,18 +16,18 @@
</h4>
<div class="item-field group-btns center flex2">
{{#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;
<span class="item-field">{{item.data.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="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.system.rank}}</span>&nbsp;
<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="tooltip-container">
<span class="stat-roll rollable" title="XP" data-roll-type="careerxp" data-key="{{key}}">
<i class="xp-next fas fa-arrow-up"></i></span>
<span class="tooltiptext">
{{#if (eq data.rank 0)}}
{{#if (eq system.rank 0)}}
1 XP
{{else}}
{{add data.rank 1}} XP
{{add system.rank 1}} XP
{{/if}}
</span>
</span>

View File

@ -14,10 +14,10 @@
<a class="rollable" data-roll-type="spell">{{item.name}}</a>
</h4>
<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 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 class="item-field flex1 right">
<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>
</h4>
<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 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 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 class="item-field flex1 center">
<a class="inc-dec-btns-alchemy"><i class="fas fa-plus-square"></i></a>

View File

@ -1,8 +1,8 @@
<div class="attributes flexrow">
{{#each data.attributes as |attribute id|}}
{{#each attributes as |attribute id|}}
<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/>
<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}}">
<i class="darkgreen fas fa-dice"></i>
</span>
@ -22,10 +22,10 @@
</div>
<hr/>
<div class="aptitudes flexrow">
{{#each data.aptitudes as |aptitude id|}}
{{#each aptitudes as |aptitude id|}}
<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/>
<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}}">
<i class="darkgreen fas fa-dice"></i>
</span>
@ -50,25 +50,29 @@
{{#if @root.isAlchemist}}
<div class="resource stat flex1 flex-group-center">
<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"/>
{{#if (eq @root.data.type 'player')}}
{{#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>
<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.chartype 'player')}}
{{#if (exists bonus)}}
<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}}
<input class="stat-max" type="text" name="data.resources.{{key}}.max" value="{{numberFormat max decimals=0 sign=false}}" data-dtype="Number"/>
<input class="resources-value" type="text" name="system.resources.{{key}}.max" value="{{numberFormat max decimals=0 sign=false}}" data-dtype="Number"/>
</div>
{{/if}}
{{else}}
<div class="resource stat flex1 flex-group-center">
<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"/>
{{#if (eq @root.data.type 'player')}}
{{#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>
<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.chartype 'player')}}
{{#if (exists bonus)}}
<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}}
<input class="stat-max" type="text" name="data.resources.{{key}}.max" value="{{numberFormat max decimals=0 sign=false}}" data-dtype="Number"/>
<input class="resources-value" type="text" name="system.resources.{{key}}.max" value="{{numberFormat max decimals=0 sign=false}}" data-dtype="Number"/>
</div>
{{/if}}
{{/each}}

View File

@ -12,12 +12,12 @@
<li class="item flexrow" data-item-id="{{item._id}}">
<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>
{{#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 ../blocking}}<div class="item-field">{{item.data.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 ../ranged}}<div class="item-field">{{item.data.properties.range}}</div>{{else}}<div class="item-field"></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.system.properties.blocking.malus}}</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.system.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}}
{{#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>
{{else}}
<a class="toggle-fight-option">{{localize "BOL.ui.todeactivated"}}</a>

View File

@ -1,9 +1,9 @@
<div class="attributes flexrow">
{{#each data.attributes as |attribute id|}}
{{#each attributes as |attribute id|}}
{{#if (ne id "appeal")}}
<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/>
<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}}">
<i class="darkgreen fas fa-dice"></i>
</span>
@ -15,7 +15,7 @@
<div class="aptitudes flexrow">
<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/>
<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">
<i class="darkgreen fas fa-dice"></i>
</span>
@ -26,7 +26,7 @@
<div class="resources flexrow">
<div class="resource stat flex1 flex-group-center">
<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-max" type="text" name="data.resources.hp.max" value="{{numberFormat resources.hp.max 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="system.resources.hp.max" value="{{numberFormat resources.hp.max decimals=0 sign=false}}" data-dtype="Number"/>
</div>
</div>

View File

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

View File

@ -1,11 +1,8 @@
<h4><strong>Préparation Alchimique : {{alchemy.name}}</strong></h4>
<h4><strong>Points de Création Investis : {{pcCostCurrent}}</strong></h4>
<h4><strong>{{localize "BOL.chat.alchemytitle" name=alchemy.name}}</strong></h4>
<h4><strong>{{localize "BOL.chat.alchemypoints" pcCostCurrent=pcCostCurrent}}</strong></h4>
{{#if isSuccess}}
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.
{{localize "BOL.chat.alchemysuccess"}}
{{else}}
La préparation alchimique a échouée !
<br>L'avancement dans la préparation a été remis à 0.
{{localize "BOL.chat.alchemyfailure"}}
{{/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}}
<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" 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-6" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage6"}}</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}}

View File

@ -1,13 +1,13 @@
<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}}
<h3><strong>Cible : {{defender.name}}</strong></h3>
<h3><strong>{{localize "BOL.chat.damagetarget" target=defender.name}}</strong></h3>
{{/if}}
<div class="actions-section">
{{#if targetId}}
<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>
<br>
{{/if}}

View File

@ -1,9 +1,13 @@
<div>
{{#if isSuccess}}
{{#if isCritical}}
<h2 class="success critical"><i class="fas fa-check-double"></i>&nbsp;{{localize "BOL.ui.critical"}}...
{{#if isLegendary}}
<h2 class="success critical"><i class="fas fa-check-double"></i>&nbsp;{{localize "BOL.ui.criticallegend"}}...
{{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 isFailure}}
@ -13,20 +17,31 @@
<h2 class="failure"><i class="fas fa-times"></i>&nbsp;{{localize "BOL.ui.failure"}}...
{{/if}}
{{/if}}
<img class="chat-icon" src="{{actor.img}}" alt="{{actor.name}}"/>
<img class="chat-icon" src="{{img}}" alt="{{actor.name}}"/>
</h2>
</div>
<h3><strong>{{description}}</strong></h3>
<div class="actions-section">
{{#if isFumble}}
{{localize "BOL.chat.fumblemessage"}}
{{/if}}
{{#if fightOption}}
<div>
Option de combat : {{fightOption.name}}
{{localize "BOL.chat.fightoption"}} : {{fightOption.name}}
</div>
{{/if}}
<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)}}
{{> "systems/bol/templates/chat/rolls/attack-damage-card.hbs"}}
{{/if}}
@ -36,18 +51,20 @@
{{#if alchemy}}
{{> "systems/bol/templates/chat/rolls/alchemy-roll-card.hbs"}}
{{/if}}
{{#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 (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 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}}
<br>
</div>
</div>

View File

@ -1,18 +1,18 @@
<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}}
<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}}
<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-without-armor" data-attack-id="{{attackId}}">Encaisser sans 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}}">{{localize "BOL.chat.withoutarmor"}}</button>
{{#if defender.data.data.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>
{{#if defender.system.resources.hero.value}}
<button class="damage-handling" data-defense-mode="hero-reduce-damage" data-attack-id="{{attackId}}">{{localize "BOL.chat.shakeoff"}}</button>
{{#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}}
{{/if}}

View File

@ -1,23 +1,22 @@
<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>
<li>
{{#if (eq defenseMode "damage-with-armor")}}
Protection de l'armure : {{armorProtect}}.
{{localize "BOL.chat.protectvalue"}} : {{armorProtect}}.
{{/if}}
{{#if (eq defenseMode "damage-without-armor")}}
Aucune protection d'armure !
{{localize "BOL.chat.noprotectvalue"}}
{{/if}}
{{#if (eq defenseMode "hero-reduce-damage")}}
Protection de l'armure : {{armorProtect}}.
Un point d'héroisme dépensé, pour une réduction des dommages supplémentaire de {{rollHero.total}}.
{{localize "BOL.chat.protectvalue"}} : {{armorProtect}}.
{{localize "BOL.chat.heroreducedamage" total=rollHero.total}}
{{/if}}
{{#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 !
Un point d'héroisme a également été dépensé.
{{localize "BOL.chat.herosplintered" name=weaponHero.name}}
{{/if}}
</li>
<li>
Encaissement final : {{finalDamage}} dégats !
{{localize "BOL.chat.finaldamage" finalDamage=finalDamage}}
</li>
</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>Cout en Points de Pouvoir : {{ppCost}}</strong></h4>
<h4><strong>Points de Pouvoir restants : {{sub ppCurrent ppCost}}</strong></h4>
<h4><strong>{{localize "BOL.chat.spell"}} : {{spell.name}}</strong></h4>
<h4><strong>{{localize "BOL.chat.spellcost"}} : {{ppCost}}</strong></h4>
<h4><strong>{{localize "BOL.chat.spellremaining"}} : {{remainingPP}}</strong></h4>

View File

@ -6,7 +6,7 @@
<div class="flex1 center cell">
<select class="flex1" name="career" id="career" data-type="String" multiple>
{{#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}}
</select>
</div>

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
<h3 class="form-header">{{localize 'BOL.featureSubtypes.boon'}}</h3>
<div class="property flexrow">
<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>

View File

@ -1,17 +1,17 @@
<h3 class="form-header">{{localize 'BOL.featureSubtypes.career'}}</h3>
<div class="property flexrow">
<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 class="property flexrow">
<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 class="property flexrow">
<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 class="property flexrow">
<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>

View File

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

View File

@ -1,5 +1,5 @@
<h3 class="form-header">{{localize 'BOL.featureSubtypes.flaw'}}</h3>
<div class="property flexrow">
<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>

View File

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

View File

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

View File

@ -3,23 +3,23 @@
<label class="property-label">{{localize "BOL.ui.type"}}</label>
<div class="form-fields">
<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 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 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>
</div>
</div>
{{#if data.properties.weapon}}
{{#if item.system.properties.weapon}}
{{> "systems/bol/templates/item/parts/properties/item/weapon-properties.hbs"}}
{{/if}}
{{#if data.properties.protection}}
{{#if item.system.properties.protection}}
{{> "systems/bol/templates/item/parts/properties/item/protection-properties.hbs"}}
{{/if}}
{{#if data.properties.magical}}
{{#if item.system.properties.magical}}
{{> "systems/bol/templates/item/parts/properties/item/magical-properties.hbs"}}
{{/if}}

View File

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

View File

@ -3,31 +3,24 @@
<label>{{localize "BOL.ui.subtype"}}</label>
<div class="form-fields">
<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 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 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>
</div>
</div>
<hr/>
<!--<div class="form-group">-->
<!-- <label>{{!localize "BOL.ui.properties"}}</label>-->
<!-- <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}}
{{#if item.system.properties.armor}}
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.armorQuality"}}</label>
<div class="form-fields center">
<select class="field-value armorQuality" name="data.properties.armorQuality" data-dtype="String">
{{#select data.properties.armorQuality}}
<select class="field-value armorQuality" name="system.properties.armorQuality" data-dtype="String">
{{#select item.system.properties.armorQuality}}
{{#each config.armorQualities as |value id|}}
<option value="{{id}}">{{localize value}}</option>
{{/each}}
@ -38,41 +31,41 @@
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.soakFormula"}}</label>
<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 class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.soakValue"}}</label>
<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>
{{/if}}
{{#if data.properties.helm}}
{{#if item.system.properties.helm}}
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.soakModifiers"}}</label>
<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>
{{/if}}
{{#if data.properties.shield}}
{{#if item.system.properties.shield}}
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.blockingMalus"}}</label>
<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 class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.blockingAttacksBlocked"}}</label>
<div class="form-fields">
<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 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>
</div>
</div>
@ -83,26 +76,26 @@
<div class="form-group">
<label class="property-label">{{localize "BOL.itemModifiers.init"}}</label>
<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 class="form-group">
<label class="property-label">{{localize "BOL.itemModifiers.agility"}}</label>
<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 class="form-group">
<label class="property-label">{{localize "BOL.itemModifiers.powercost"}}</label>
<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 class="form-group">
<label class="property-label">{{localize "BOL.itemModifiers.social"}}</label>
<div class="form-fields">
<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>
</div>
</div>

View File

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

View File

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

View File

@ -3,16 +3,16 @@
<label>{{localize "BOL.ui.reach"}}</label>
<div class="form-fields">
<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 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 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 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>
</div>
</div>
@ -21,44 +21,44 @@
<label>{{localize "BOL.ui.properties"}}</label>
<div class="form-fields">
<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 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 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 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 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>
{{#if data.properties.ranged}}
{{#if item.system.properties.ranged}}
<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>
{{/if}}
{{#if data.properties.melee}}
{{#if item.system.properties.melee}}
<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 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>
{{/if}}
</div>
</div>
<hr/>
{{#if (not data.properties.onlymodifier)}}
{{#if (not item.system.properties.onlymodifier)}}
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.attackAttribute"}}</label>
<div class="form-fields center">
<select class="field-value" name="data.properties.attackAttribute" data-dtype="String">
{{#select data.properties.attackAttribute}}
<select class="field-value" name="system.properties.attackAttribute" data-dtype="String">
{{#select item.system.properties.attackAttribute}}
{{#each config.attackAttributes as |value id|}}
<option value="{{id}}">{{localize value}}</option>
{{/each}}
@ -69,8 +69,8 @@
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.attackAptitude"}}</label>
<div class="form-fields center">
<select class="field-value" name="data.properties.attackAptitude" data-dtype="String">
{{#select data.properties.attackAptitude}}
<select class="field-value" name="system.properties.attackAptitude" data-dtype="String">
{{#select item.system.properties.attackAptitude}}
{{#each config.attackAptitudes as |value id|}}
<option value="{{id}}">{{localize value}}</option>
{{/each}}
@ -82,15 +82,15 @@
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.attackModifiers"}}</label>
<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>
<hr/>
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.weaponSize"}}</label>
<div class="form-fields">
<select class="field-value" name="data.properties.weaponSize" data-dtype="String">
{{#select data.properties.weaponSize}}
<select class="field-value" name="system.properties.weaponSize" data-dtype="String">
{{#select item.system.properties.weaponSize}}
{{#each config.weaponSizes as |value id|}}
<option value="{{id}}">{{localize value}}</option>
{{/each}}
@ -101,8 +101,8 @@
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.damage"}}</label>
<div class="form-fields">
<select class="field-value" name="data.properties.damage" data-dtype="String">
{{#select data.properties.damage}}
<select class="field-value" name="system.properties.damage" data-dtype="String">
{{#select item.system.properties.damage}}
{{#each config.damageValues as |value id|}}
<option value="{{id}}">{{value}}</option>
{{/each}}
@ -113,8 +113,8 @@
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.damageAttribute"}}</label>
<div class="form-fields center">
<select class="field-value" name="data.properties.damageAttribute" data-dtype="String">
{{#select data.properties.damageAttribute}}
<select class="field-value" name="system.properties.damageAttribute" data-dtype="String">
{{#select item.system.properties.damageAttribute}}
{{#each config.damageAttributes as |value id|}}
<option value="{{id}}">{{localize value}}</option>
{{/each}}
@ -125,14 +125,14 @@
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.damageModifiers"}}</label>
<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 class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.damageMultiplier"}}</label>
<div class="form-fields center">
<select class="field-value" name="data.properties.damageMultiplier" data-dtype="String">
{{#select data.properties.damageMultiplier}}
<select class="field-value" name="system.properties.damageMultiplier" data-dtype="String">
{{#select item.system.properties.damageMultiplier}}
{{#each config.damageMultiplier as |value id|}}
<option value="{{id}}">{{value}}</option>
{{/each}}
@ -144,17 +144,17 @@
<label class="property-label">{{localize "BOL.itemProperty.damageSpecial"}}</label>
<div class="form-fields center">
<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>
</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/>
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.range"}}</label>
<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>
{{/if}}
@ -162,7 +162,7 @@
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.reload"}}</label>
<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>
{{/if}}