Compare commits

..

49 Commits

Author SHA1 Message Date
884823a1bc Init again !!!! 2022-12-02 13:16:42 +01:00
399c22d623 Init again !!!! 2022-12-02 13:15:48 +01:00
085265df5d initiative bugfix 2022-12-01 23:57:33 +01:00
593db9ba5b initiative bugfix 2022-12-01 23:46:27 +01:00
ac96f3ca67 Enhance initiative + fix combat 2022-11-30 20:58:27 +01:00
b2fe67ab05 Enhance tokens/actor management + auto effects 2022-11-30 12:12:44 +01:00
47178d7359 Use bougette v1.2 2022-11-29 15:23:05 +01:00
e1c7304551 Add a PC list summary 2022-11-25 20:47:28 +01:00
7b4e5bcbfa Add a PC list summary 2022-11-25 15:50:12 +01:00
31bd83b0ab Add a PC list summary 2022-11-25 15:50:07 +01:00
e35187433e Fix malus dice (again) and scroll rendering 2022-11-25 14:24:03 +01:00
5e7dc3ad9d Display effects in main sheet (left) and manage it for defense and damages 2022-11-25 08:49:37 +01:00
add6893864 Logo is rotating again 2022-11-25 07:37:44 +01:00
3a591e750a Ajout aide + effets 2022-11-23 21:37:46 +01:00
fe1cda67c4 Ajout aide + effets 2022-11-23 21:34:51 +01:00
985aba0318 Various enhancements 2022-11-23 15:30:31 +01:00
5d8cc300e9 Various enhancements 2022-11-23 15:27:08 +01:00
aa27168c2b fix flaws usage 2022-11-19 22:00:14 +01:00
1135e3aff2 fix flaws usage 2022-11-19 21:56:51 +01:00
30e316d34e Remove to chat button 2022-11-19 19:22:16 +01:00
f3bd84c5c9 Corrections sur creatures/npc et armes de vehicules 2022-10-10 14:14:32 +02:00
985d393de5 Corrections sur creatures/npc et armes de vehicules 2022-10-10 08:46:41 +02:00
815b5ff2ac Ajout distance 2022-10-08 17:43:09 +02:00
edf8325109 Inc version 2022-09-28 23:26:41 +02:00
895aa01419 Enable links in editor 2022-09-27 20:47:30 +02:00
9631e5e72a Merge conteneur 2022-09-26 08:28:47 +02:00
716cc53b29 Merge conteneur 2022-09-26 08:24:39 +02:00
44952d4410 Fix hotbar + tooltip 2022-09-25 21:14:39 +02:00
a7991bce92 Fix hotbar + tooltip 2022-09-25 21:13:15 +02:00
a1c20019e8 v10 init fix 2022-09-19 23:23:54 +02:00
af8576a4a1 Fix initfor combat 2022-09-09 23:49:01 +02:00
6c35ddfb0b rework ID 2022-09-02 17:31:12 +02:00
0cbcaee45e rework ID 2022-09-02 16:21:18 +02:00
904ff821e1 rework ID 2022-09-02 16:19:16 +02:00
5c13cde07a rework ID 2022-09-02 16:08:56 +02:00
51c1e205e9 rework ID 2022-09-01 22:40:29 +02:00
90a83f4571 rework ID 2022-09-01 22:23:58 +02:00
3311bc091a rework ID 2022-09-01 21:26:10 +02:00
fa8f9869a6 v10 sync 2022-08-31 23:00:41 +02:00
36b905134e v10 sync 2022-08-31 22:46:19 +02:00
eeb0a906e7 v10 sync 2022-08-31 22:24:56 +02:00
c552411d61 Allow configurable logo 2022-07-17 18:24:29 +02:00
89ec404ca8 v10 branch - Update manifest 2022-07-16 11:05:15 +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
76 changed files with 2204 additions and 855 deletions

View File

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

BIN
assets/bol_monnaies_v1_2.pdf Executable file

Binary file not shown.

14
changelog.md Normal file
View File

@ -0,0 +1,14 @@
# v10.4.0
- Ajout de la gestion d'effets
- Aide intégré
- Intégration du PDF de la bougette
# v10.3.3
- Nouvelles clés de traduction
- Lorsqu'une arme a un dé bonus, prise en compte plus claire du dé bonus et affichage de l'information dans la fenêtre de jet
- Lorsqu'une arme relance les 1 sur ses dégats, l'information est affichée dans le tchat
- Termes corrects pour les PNJs (ie rival)
- Nouveaux équipements issus du Dieu Voilé

View File

@ -59,8 +59,6 @@ a:hover {
top: -50px; top: -50px;
left: calc(50% - 100px); left: calc(50% - 100px);
opacity: 0.7; opacity: 0.7;
-webkit-animation: rotation 10s infinite linear;
animation: rotation 10s infinite linear;
} }
#pause h3 { #pause h3 {
font-family: "IMFellDWPicaSC-Regular", serif; font-family: "IMFellDWPicaSC-Regular", serif;
@ -389,16 +387,16 @@ ul.no-bullets {
background-color: lightgray; background-color: lightgray;
} }
.bol h1.form-header { .bol h1.form-header {
font-size: 2.5em; font-size: 2.2em;
font-weight: 700; font-weight: 700;
} }
.bol h2.form-header { .bol h2.form-header {
font-size: 2em; font-size: 1.8em;
font-weight: 500; font-weight: 500;
border-bottom: 1px groove #eeede0; border-bottom: 1px groove #eeede0;
} }
.bol h3.form-header { .bol h3.form-header {
font-size: 1.5em; font-size: 1.2em;
font-weight: 500; font-weight: 500;
border-bottom: 1px groove #eeede0; border-bottom: 1px groove #eeede0;
} }
@ -444,12 +442,16 @@ ul.no-bullets {
.bol .inc-dec-btns { .bol .inc-dec-btns {
color: #4b4a44; color: #4b4a44;
} }
.summmary-number {
padding-left: 4rem;
}
/* Items List */ /* Items List */
.items-list { .items-list {
list-style: none; list-style: none;
margin: 7px 0; margin: 7px 0;
padding: 0; padding: 0;
overflow-y: auto; overflow-y:hidden;
/*overflow-y: auto;*/
} }
.items-list .item-header { .items-list .item-header {
font-family: 'Signika', sans-serif; font-family: 'Signika', sans-serif;
@ -520,6 +522,18 @@ ul.no-bullets {
.items-list .item .item-control { .items-list .item .item-control {
color: #4b4a44; color: #4b4a44;
} }
.items-list .item-name-fixed-medium {
min-width: 8rem;
width: 8rem;
}
.items-list .item-field-fixed-short {
max-width: 3rem;
min-width: 3rem;
width: 3rem;
}
.bougette-dice-img {
color:rgba(150, 44, 44, 0.70);
}
/* ----------------------------------------- */ /* ----------------------------------------- */
/* Premade colors */ /* Premade colors */
@ -1051,3 +1065,13 @@ body.system-bol img#logo {
.bol-hud-menu label { .bol-hud-menu label {
font-size: 0.75rem; font-size: 0.75rem;
} }
.bol-margin-tb-2 {
margin-top: 2px;
margin-bottom: 2px;
}
.character-summary-container {
  opacity: 0.95;
}
.character-summary-rollable {
text-decoration: underline;
}

View File

@ -151,6 +151,7 @@
"BOL.ui.armorAgiMalus": "Armor+Shield Modifier (Agi)", "BOL.ui.armorAgiMalus": "Armor+Shield Modifier (Agi)",
"BOL.ui.armorInitMalus": "Armor Modifier (Init)", "BOL.ui.armorInitMalus": "Armor Modifier (Init)",
"BOL.ui.attackValue": "Attack Value", "BOL.ui.attackValue": "Attack Value",
"BOL.ui.weaponbonus": "Cette arme bénéficie déja d'un Dé de Bonus (Arme Favorite prise en compte, par exemple)",
"BOL.featureCategory.origins": "Origins", "BOL.featureCategory.origins": "Origins",
"BOL.featureCategory.races": "Races", "BOL.featureCategory.races": "Races",

View File

@ -1,15 +1,21 @@
{ {
"ACTOR.TypeCharacter": "Personnage", "ACTOR.TypeCharacter": "Personnage",
"ACTOR.TypeEncounter": "Rencontre", "ACTOR.TypeEncounter": "Rencontre",
"ACTOR.TypeVehicle": "Véhicule",
"ITEM.TypeItem": "Objet", "ITEM.TypeItem": "Objet",
"ITEM.TypeFeature": "Trait", "ITEM.TypeFeature": "Trait",
"ITEM.TypeWeapon": "Arme", "ITEM.TypeWeapon": "Arme",
"ITEM.TypeArmor": "Armure", "ITEM.TypeArmor": "Armure",
"BOL.attributes.vigor": "Vigueur", "BOL.attributes.vigor": "Vigueur",
"BOL.attributes.halfvigor": "Demi-vigueur", "BOL.attributes.halfvigor": "Demi-vigueur",
"BOL.attributes.agility": "Agilité", "BOL.attributes.agility": "Agilité",
"BOL.attributes.mind": "Esprit", "BOL.attributes.mind": "Esprit",
"BOL.attributes.appeal": "Aura", "BOL.attributes.appeal": "Aura",
"BOL.attributes.hull": "Coque",
"BOL.attributes.crew": "Equipage",
"BOL.attributes.resources": "Resources",
"BOL.attributes.row": "Rames",
"BOL.aptitudes.init": "Initiative", "BOL.aptitudes.init": "Initiative",
"BOL.aptitudes.melee": "Mêlée", "BOL.aptitudes.melee": "Mêlée",
"BOL.aptitudes.ranged": "Tir", "BOL.aptitudes.ranged": "Tir",
@ -151,6 +157,33 @@
"BOL.ui.armorAgiMalus": "Malus d'Armure+Bouclier (Agi)", "BOL.ui.armorAgiMalus": "Malus d'Armure+Bouclier (Agi)",
"BOL.ui.armorInitMalus": "Malus d'Armure (Init)", "BOL.ui.armorInitMalus": "Malus d'Armure (Init)",
"BOL.ui.attackValue": "Valeur d'attaque", "BOL.ui.attackValue": "Valeur d'attaque",
"BOL.ui.vehicleWeapons": "Armes de véhicules",
"BOL.ui.hullDamage": "D.coque",
"BOL.ui.crewDamage": "D.équipage",
"BOL.ui.fireDamage": "Feu ?",
"BOL.ui.weaponbonus": "Cette arme bénéficie déja d'un Dé de Bonus (Arme Favorite prise en compte, par exemple)",
"BOL.ui.creature": "Creature",
"BOL.ui.rabble": "Piétaille",
"BOL.ui.tough": "Coriace",
"BOL.ui.villain": "Rival",
"BOL.ui.attributaptitude": "Attribut ou Aptitude",
"BOL.ui.always": "Tout les jets (ie toujours)",
"BOL.ui.effectbonusmalus": "Bonus ou Malus à appliquer",
"BOL.ui.boleffects": "Effets (automatiques)",
"BOL.ui.modifier": "Modificateur",
"BOL.ui.effects": "Effets en cours",
"BOL.ui.pcname": "PJs",
"BOL.ui.npcname": "PNJs",
"BOL.ui.pclistbutton": "Vue compacte",
"BOL.ui.noactorfound": "PNJ inconnu, le PNJ doit être présent dans le monde pour s'afficher ici.",
"BOL.ui.deletetitle": "Suppression",
"BOL.ui.confirmdelete": "Vous êtes sûr de vouloir supprimer cet item ?",
"BOL.ui.nomorealchemypoints": "Plus assez de Points de Création !",
"BOL.ui.armornoformula": "L'armure {protect.name} n'a pas de formule pour la protection !",
"BOL.ui.selectactor": "Selectionnez votre personnage pour utiliser la macro",
"BOL.ui.itemnotfound": "Impossible de trouver l'objet de cette macro",
"BOL.ui.noinit": "Pas d'initiative trouvée, veuillez en enregistrer une.",
"BOL.featureCategory.origins": "Origines", "BOL.featureCategory.origins": "Origines",
"BOL.featureCategory.races": "Races", "BOL.featureCategory.races": "Races",
"BOL.featureCategory.careers": "Carrières", "BOL.featureCategory.careers": "Carrières",
@ -163,6 +196,7 @@
"BOL.bougette.easylife": "A l'aise", "BOL.bougette.easylife": "A l'aise",
"BOL.bougette.luxury": "Luxe&Volupté", "BOL.bougette.luxury": "Luxe&Volupté",
"BOL.bougette.rich": "Richissime", "BOL.bougette.rich": "Richissime",
"BOL.featureSubtypes.origin": "Origine", "BOL.featureSubtypes.origin": "Origine",
"BOL.featureSubtypes.race": "Race", "BOL.featureSubtypes.race": "Race",
"BOL.featureSubtypes.career": "Carrière", "BOL.featureSubtypes.career": "Carrière",
@ -171,6 +205,10 @@
"BOL.featureSubtypes.language": "Langue", "BOL.featureSubtypes.language": "Langue",
"BOL.featureSubtypes.gods": "Dieux & Foi", "BOL.featureSubtypes.gods": "Dieux & Foi",
"BOL.featureSubtypes.fightOption": "Option de Combat", "BOL.featureSubtypes.fightOption": "Option de Combat",
"BOL.featureSubtypes.effect": "Effet",
"BOL.featureSubtypes.effects": "Effets",
"BOL.featureSubtypes.boleffect": "Effet",
"BOL.fightOptionTypes.armor": "Attaque au défaut d'armure", "BOL.fightOptionTypes.armor": "Attaque au défaut d'armure",
"BOL.fightOptionTypes.intrepid": "Attaque intrépide", "BOL.fightOptionTypes.intrepid": "Attaque intrépide",
"BOL.fightOptionTypes.twoweaponsdef": "Combat à 2 armes (Défense)", "BOL.fightOptionTypes.twoweaponsdef": "Combat à 2 armes (Défense)",
@ -178,6 +216,7 @@
"BOL.fightOptionTypes.fulldefense": "Défense totale", "BOL.fightOptionTypes.fulldefense": "Défense totale",
"BOL.fightOptionTypes.defense": "Posture défensive", "BOL.fightOptionTypes.defense": "Posture défensive",
"BOL.fightOptionTypes.attack": "Posture offensive", "BOL.fightOptionTypes.attack": "Posture offensive",
"BOL.itemCategory.object": "Objet", "BOL.itemCategory.object": "Objet",
"BOL.itemCategory.equipment": "Équipement", "BOL.itemCategory.equipment": "Équipement",
"BOL.itemCategory.consumable": "Consommable", "BOL.itemCategory.consumable": "Consommable",
@ -186,12 +225,15 @@
"BOL.itemCategory.other": "Autre", "BOL.itemCategory.other": "Autre",
"BOL.itemCategory.capacity": "Capacité", "BOL.itemCategory.capacity": "Capacité",
"BOL.itemCategory.alchemy": "Préparation Alchimique", "BOL.itemCategory.alchemy": "Préparation Alchimique",
"BOL.itemCategory.vehicleweapon": "Armes de Véhicule",
"BOL.combatCategory.protections": "Protections", "BOL.combatCategory.protections": "Protections",
"BOL.combatCategory.shields": "Boucliers", "BOL.combatCategory.shields": "Boucliers",
"BOL.combatCategory.melee": "Armes de contact", "BOL.combatCategory.melee": "Armes de contact",
"BOL.combatCategory.ranged": "Armes à distance", "BOL.combatCategory.ranged": "Armes à distance",
"BOL.combatCategory.fightOptions": "Options de combat", "BOL.combatCategory.fightOptions": "Options de combat",
"BOL.combatCategory.natural": "Armes Naturelless", "BOL.combatCategory.natural": "Armes Naturelless",
"BOL.equipmentCategory.weapon": "Arme", "BOL.equipmentCategory.weapon": "Arme",
"BOL.equipmentCategory.armor": "Armure", "BOL.equipmentCategory.armor": "Armure",
"BOL.equipmentCategory.protection": "Protection", "BOL.equipmentCategory.protection": "Protection",
@ -203,21 +245,26 @@
"BOL.equipmentCategory.container": "Conteneur", "BOL.equipmentCategory.container": "Conteneur",
"BOL.equipmentCategory.currency": "Monnaie", "BOL.equipmentCategory.currency": "Monnaie",
"BOL.equipmentCategory.other": "Autre", "BOL.equipmentCategory.other": "Autre",
"BOL.protectionCategory.armor": "Armure", "BOL.protectionCategory.armor": "Armure",
"BOL.protectionCategory.shield": "Bouclier", "BOL.protectionCategory.shield": "Bouclier",
"BOL.protectionCategory.helm": "Casque", "BOL.protectionCategory.helm": "Casque",
"BOL.protectionCategory.other": "Autre", "BOL.protectionCategory.other": "Autre",
"BOL.spellItem.charm": "Charme", "BOL.spellItem.charm": "Charme",
"BOL.spellItem.circle1": "Premier Cercle", "BOL.spellItem.circle1": "Premier Cercle",
"BOL.spellItem.circle2": "Second Cercle", "BOL.spellItem.circle2": "Second Cercle",
"BOL.spellItem.circle3": "Troisième Cercle", "BOL.spellItem.circle3": "Troisième Cercle",
"BOL.alchemyItem.common": "Courante", "BOL.alchemyItem.common": "Courante",
"BOL.alchemyItem.scarce": "Rare", "BOL.alchemyItem.scarce": "Rare",
"BOL.alchemyItem.legend": "Légendaire", "BOL.alchemyItem.legend": "Légendaire",
"BOL.alchemyItem.mythic": "Mythique", "BOL.alchemyItem.mythic": "Mythique",
"BOL.weaponCategory.melee": "Arme de mêlée", "BOL.weaponCategory.melee": "Arme de mêlée",
"BOL.weaponCategory.ranged": "Arme de tir", "BOL.weaponCategory.ranged": "Arme de tir",
"BOL.weaponCategory.other": "Autre", "BOL.weaponCategory.other": "Autre",
"BOL.itemProperty.damageMultiplier": "Multiplicateur de dommages", "BOL.itemProperty.damageMultiplier": "Multiplicateur de dommages",
"BOL.itemProperty.attackBonusDice": "Dé de Bonus d'attaque", "BOL.itemProperty.attackBonusDice": "Dé de Bonus d'attaque",
"BOL.itemProperty.equipable": "Équipable", "BOL.itemProperty.equipable": "Équipable",
@ -270,6 +317,18 @@
"BOL.itemProperty.difficulty": "Difficulté", "BOL.itemProperty.difficulty": "Difficulté",
"BOL.itemProperty.natural": "Arme naturelle", "BOL.itemProperty.natural": "Arme naturelle",
"BOL.itemProperty.onlymodifier": "Modificateur uniquement (ie attaques de créatures)", "BOL.itemProperty.onlymodifier": "Modificateur uniquement (ie attaques de créatures)",
"BOL.itemProperty.vehicleDamageType": "Type de dommages de véhicules",
"BOL.itemProperty.isfiredamage": "Dommages de Feu",
"BOL.itemProperty.ishulldamage": "Dommages à la coque",
"BOL.itemProperty.iscrewdamage": "Dommages à l'équipage",
"BOL.itemProperty.hulldamage": "Valeur des dommages à la coque",
"BOL.itemProperty.crewdamage": "Valeur des dommages à l'équipage",
"BOL.itemProperty.hullDamageMultiplier": "Multiplicateur",
"BOL.itemProperty.crewDamageMultiplier": "Multiplicateur",
"BOL.itemProperty.isboarding": "Abordage",
"BOL.itemProperty.isspur": "Eperonnage",
"BOL.itemProperty.isbreakrow": "Briser les rames",
"BOL.itemStat.quantity": "Quantité", "BOL.itemStat.quantity": "Quantité",
"BOL.itemStat.weight": "Poids", "BOL.itemStat.weight": "Poids",
"BOL.itemStat.price": "Prix", "BOL.itemStat.price": "Prix",
@ -279,21 +338,26 @@
"BOL.itemStat.soak": "Valeur de protection", "BOL.itemStat.soak": "Valeur de protection",
"BOL.itemStat.blocking": "Bloquage", "BOL.itemStat.blocking": "Bloquage",
"BOL.itemStat.modifiers": "Modificateurs", "BOL.itemStat.modifiers": "Modificateurs",
"BOL.weaponSize.unarmed": "Mains nues", "BOL.weaponSize.unarmed": "Mains nues",
"BOL.weaponSize.improvised": "Arme improvisée", "BOL.weaponSize.improvised": "Arme improvisée",
"BOL.weaponSize.light": "Légère", "BOL.weaponSize.light": "Légère",
"BOL.weaponSize.medium": "Moyenne", "BOL.weaponSize.medium": "Moyenne",
"BOL.weaponSize.heavy": "Lourde", "BOL.weaponSize.heavy": "Lourde",
"BOL.itemModifiers.init": "Malus (Initiative)", "BOL.itemModifiers.init": "Malus (Initiative)",
"BOL.itemModifiers.social": "Malus (Social)", "BOL.itemModifiers.social": "Malus (Social)",
"BOL.itemModifiers.agility": "Malus (Agilité)", "BOL.itemModifiers.agility": "Malus (Agilité)",
"BOL.itemModifiers.powercost": "Malus (Coût supplémentaire en PP)", "BOL.itemModifiers.powercost": "Malus (Coût supplémentaire en PP)",
"BOL.itemBlocking.malus": "Social", "BOL.itemBlocking.malus": "Social",
"BOL.itemBlocking.nbAttacksPerRound": "Agilité", "BOL.itemBlocking.nbAttacksPerRound": "Agilité",
"BOL.soakFormula.none": "-", "BOL.soakFormula.none": "-",
"BOL.soakFormula.light": "Légère (Annule d6-3 dégâts subis)", "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.medium": "Moyenne (Annule d6-2 dégâts subis)",
"BOL.soakFormula.heavy": "Lourde (Annule d6-1 dégâts subis)", "BOL.soakFormula.heavy": "Lourde (Annule d6-1 dégâts subis)",
"BOL.armorQuality.none": "-", "BOL.armorQuality.none": "-",
"BOL.armorQuality.light": "Légère", "BOL.armorQuality.light": "Légère",
"BOL.armorQuality.lightQ": "Légère de qualité", "BOL.armorQuality.lightQ": "Légère de qualité",
@ -307,6 +371,7 @@
"BOL.armorQuality.heavyQ": "Lourde de qualité", "BOL.armorQuality.heavyQ": "Lourde de qualité",
"BOL.armorQuality.heavySup": "Lourde Supérieure", "BOL.armorQuality.heavySup": "Lourde Supérieure",
"BOL.armorQuality.heavyLeg": "Lourde Légendaire", "BOL.armorQuality.heavyLeg": "Lourde Légendaire",
"BOL.equipmentSlots.none": "-", "BOL.equipmentSlots.none": "-",
"BOL.equipmentSlots.head": "Tête", "BOL.equipmentSlots.head": "Tête",
"BOL.equipmentSlots.neck": "Cou", "BOL.equipmentSlots.neck": "Cou",
@ -323,10 +388,12 @@
"BOL.equipmentSlots.feet": "Pieds", "BOL.equipmentSlots.feet": "Pieds",
"BOL.equipmentSlots.finder": "Doigt", "BOL.equipmentSlots.finder": "Doigt",
"BOL.equipmentSlots.ear": "Oreille", "BOL.equipmentSlots.ear": "Oreille",
"BOL.vehicleCategory.mount": "Monture terrestre", "BOL.vehicleCategory.mount": "Monture terrestre",
"BOL.vehicleCategory.flying": "Monture volante", "BOL.vehicleCategory.flying": "Monture volante",
"BOL.vehicleCategory.boat": "Bateau", "BOL.vehicleCategory.boat": "Bateau",
"BOL.vehicleCategory.other": "Autre", "BOL.vehicleCategory.other": "Autre",
"BOL.range.PointBlank": "Bout portant", "BOL.range.PointBlank": "Bout portant",
"BOL.range.Short": "Courte", "BOL.range.Short": "Courte",
"BOL.range.Medium": "Moyenne", "BOL.range.Medium": "Moyenne",
@ -334,6 +401,7 @@
"BOL.range.VeryLong": "Très longue", "BOL.range.VeryLong": "Très longue",
"BOL.range.Extreme": "Extrême", "BOL.range.Extreme": "Extrême",
"BOL.range.Maximum": "Maximale", "BOL.range.Maximum": "Maximale",
"BOL.notification.MacroMultipleTokensSelected": "Vous avez sélectionné plusieurs tokens", "BOL.notification.MacroMultipleTokensSelected": "Vous avez sélectionné plusieurs tokens",
"BOL.notification.MacroNoActorAvailable": "Aucun acteur n'a pu être ciblé", "BOL.notification.MacroNoActorAvailable": "Aucun acteur n'a pu être ciblé",
"BOL.notification.MacroNoTokenSelected": "Vous devez sélectionner un token", "BOL.notification.MacroNoTokenSelected": "Vous devez sélectionner un token",
@ -391,6 +459,26 @@
"BOL.chat.spellremaining": "Points de Pouvoir restants", "BOL.chat.spellremaining": "Points de Pouvoir restants",
"BOL.chat.nodamagesummary": "Aucun dégats n'a été subi ....", "BOL.chat.nodamagesummary": "Aucun dégats n'a été subi ....",
"BOL.chat.damageresume": "{name} a subi des blessures ...", "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.chat.rangeinfo": "Tir/Lancer de {attackerName} vers {defenderName}",
"BOL.chat.rangeweaponinfo": "Arme : {weaponName} - Portée de base {weaponRange}",
"BOL.chat.rangeout": "Modificateur : Hors de portée",
"BOL.chat.range0": "Modificateur : Bout portant (+1)",
"BOL.chat.range1": "Modificateur : Portée courte (0)",
"BOL.chat.range2": "Modificateur : Portée moyenne (-1)",
"BOL.chat.range3": "Modificateur : Portée longue (-2)",
"BOL.chat.range4": "Modificateur : Portée très longue (-4)",
"BOL.chat.range5": "Modificateur : Portée extrême (-6)",
"BOL.chat.range6": "Modificateur : Portée maximale (-8)",
"BOL.chat.rangeprefix": "Distance évaluée : ",
"BOL.chat.rangevisible": "La ligne de vue est dégagée entre les protagonistes.",
"BOL.chat.rangenotvisible": "La ligne de vue est bloquée entre les protagonistes.",
"BOL.chat.rangetitle": "Information MJ",
"BOL.chat.weaponreroll1": "Pour information, cette arme relance les 1 sur ses dégâts.",
"BOL.chat.rollbougette": "Jet de Bougette",
"BOL.chat.bougettesuccess": "Votre bougette reste inchangée !",
"BOL.chat.bougettefailure": "Vous avez trop dépensé, votre bougette s'est réduite...",
"BOL.chat.initiative": "Rang d'intiative (10 à 1)",
"BOL.dialog.soeasy": "Inmanquable (+4)", "BOL.dialog.soeasy": "Inmanquable (+4)",
"BOL.dialog.veryeasy": "Trés Facile (+2)", "BOL.dialog.veryeasy": "Trés Facile (+2)",
@ -426,9 +514,10 @@
"BOL.ui.bionotes": "Notes", "BOL.ui.bionotes": "Notes",
"BOL.chat.welcome1": "Bienvenue dans Barbarians of Lemuria (Ludospherik version)", "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.welcome2": "Les livres nécessaires pour jouer sont disponibles sur le site de <a href='http://www.ludospherik.fr/content/14-barbarians-of-lemuria'>l'éditeur Ludospherik.</a>",
"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.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.welcome4": "Tout le support et le suivi de ce système est disponible via le <a href='https://discord.gg/pPSDNJk'>Discord Foundry FR</a>.",
"BOL.chat.welcome5": "Bon jeu en Lemurie !" "BOL.chat.welcome5": "Consulter l'aide en ligne pour plus d'informations : @UUID[Compendium.bol.aides-de-jeu.97rugQOtiwt8zPfQ]{Aide du Jeu}.",
"BOL.chat.welcome6": "Bon jeu en Lemurie !"
} }

View File

@ -12,7 +12,7 @@ export class BoLActorSheet extends ActorSheet {
return mergeObject(super.defaultOptions, { return mergeObject(super.defaultOptions, {
classes: ["bol", "sheet", "actor"], classes: ["bol", "sheet", "actor"],
template: "systems/bol/templates/actor/actor-sheet.hbs", template: "systems/bol/templates/actor/actor-sheet.hbs",
width: 600, width: 860,
height: 600, height: 600,
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }], dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }] tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }]
@ -73,10 +73,9 @@ export class BoLActorSheet extends ActorSheet {
const incr = parseInt(dataset.incr) const incr = parseInt(dataset.incr)
const min = parseInt(dataset.min) const min = parseInt(dataset.min)
const max = parseInt(dataset.max) || 10000 const max = parseInt(dataset.max) || 10000
const itemData = item.data; let value = eval("item." + target)
let value = eval("itemData." + target)
value = value || 0 value = value || 0
console.log("IncDec", item, target, value, operator, min, max) //console.log("IncDec", item, target, value, operator, min, max)
if (operator === "minus") { if (operator === "minus") {
if (value >= min + incr) value -= incr; if (value >= min + incr) value -= incr;
else value = min; else value = min;
@ -95,8 +94,8 @@ export class BoLActorSheet extends ActorSheet {
// Delete Inventory Item // Delete Inventory Item
html.find('.item-delete').click(ev => { html.find('.item-delete').click(ev => {
Dialog.confirm({ Dialog.confirm({
title: "Suppression", title: game.i18n.localize("BOL.ui.deletetitle"),
content: `Vous êtes sûr de vouloir supprimer cet item ?`, content: game.i18n.localize("BOL.ui.confirmdelete"),
yes: () => { yes: () => {
const li = $(ev.currentTarget).parents(".item"); const li = $(ev.currentTarget).parents(".item");
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")]) this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")])
@ -115,17 +114,18 @@ export class BoLActorSheet extends ActorSheet {
/* -------------------------------------------- */ /* -------------------------------------------- */
/** @override */ /** @override */
getData(options) { async getData(options) {
const data = super.getData(options); const data = super.getData(options)
const actorData = duplicate(data.data); const actorData = duplicate(data)
let formData = duplicate(data) let formData = duplicate(data)
formData.config = game.bol.config formData.config = game.bol.config
formData.data = actorData.data formData.data = actorData
formData.details = this.actor.details formData.details = this.actor.details
formData.attributes = this.actor.attributes formData.attributes = this.actor.attributes
formData.aptitudes = this.actor.aptitudes formData.aptitudes = this.actor.aptitudes
formData.resources = this.actor.getResourcesFromType() formData.resources = this.actor.getResourcesFromType()
formData.xp = this.actor.system.xp
formData.equipment = this.actor.equipment formData.equipment = this.actor.equipment
formData.equipmentCreature = this.actor.equipmentCreature formData.equipmentCreature = this.actor.equipmentCreature
formData.weapons = this.actor.weapons formData.weapons = this.actor.weapons
@ -134,20 +134,26 @@ export class BoLActorSheet extends ActorSheet {
formData.alchemy = this.actor.alchemy formData.alchemy = this.actor.alchemy
formData.containers = this.actor.containers formData.containers = this.actor.containers
formData.treasure = this.actor.treasure formData.treasure = this.actor.treasure
formData.boleffects = this.actor.boleffects
formData.alchemyrecipe = this.actor.alchemyrecipe formData.alchemyrecipe = this.actor.alchemyrecipe
formData.vehicles = this.actor.vehicles formData.vehicles = this.actor.vehicles
formData.fightoptions = this.actor.fightoptions formData.fightoptions = this.actor.fightoptions
formData.ammos = this.actor.ammos formData.ammos = this.actor.ammos
formData.misc = this.actor.misc formData.misc = this.actor.misc
formData.combat = this.actor.buildCombat() formData.combat = this.actor.buildCombat()
formData.combatCreature = this.actor.buildCombatCreature() formData.initiativeRank = this.actor.getInitiativeRank()
//formData.combatCreature = this.actor.buildCombatCreature()
formData.features = this.actor.buildFeatures() formData.features = this.actor.buildFeatures()
formData.isGM = game.user.isGM formData.isGM = game.user.isGM
formData.options = this.options formData.options = this.options
formData.owner = this.document.isOwner formData.owner = this.document.isOwner
formData.editScore = this.options.editScore formData.editScore = this.options.editScore
formData.useBougette = BoLUtility.getUseBougette() formData.useBougette = BoLUtility.getUseBougette()
formData.bougette = this.actor.getBougette()
formData.charType = this.actor.getCharType()
formData.villainy = this.actor.getVillainy()
formData.biography = await TextEditor.enrichHTML(this.object.system.details.biography, {async: true})
formData.notes = await TextEditor.enrichHTML(this.object.system.details.notes, {async: true})
formData.isSorcerer = this.actor.isSorcerer() formData.isSorcerer = this.actor.isSorcerer()
formData.isAlchemist = this.actor.isAlchemist() formData.isAlchemist = this.actor.isAlchemist()
formData.isPriest = this.actor.isPriest() formData.isPriest = this.actor.isPriest()
@ -232,6 +238,9 @@ export class BoLActorSheet extends ActorSheet {
case "attributexp": case "attributexp":
this.actor.incAttributeXP(dataset.key) this.actor.incAttributeXP(dataset.key)
break; break;
case "bougette":
this.actor.rollBougette()
break;
case "careerxp": case "careerxp":
this.actor.incCareerXP( li.data("item-id")) this.actor.incCareerXP( li.data("item-id"))
break; break;

View File

@ -1,5 +1,6 @@
import { BoLDefaultRoll } from "../controllers/bol-rolls.js"; import { BoLDefaultRoll } from "../controllers/bol-rolls.js";
import { BoLUtility } from "../system/bol-utility.js"; import { BoLUtility } from "../system/bol-utility.js";
import { BoLRoll } from "../controllers/bol-rolls.js";
/** /**
* Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system. * Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system.
@ -9,60 +10,98 @@ export class BoLActor extends Actor {
/** @override */ /** @override */
prepareData() { prepareData() {
const actorData = this.data;
if (actorData.type === 'character') { if (this.type === 'character') {
actorData.type = 'player'; this.chartype = 'player'
actorData.villainy = false; this.villainy = false
} }
if (actorData.type === 'encounter') { if (this.type === 'encounter') {
actorData.type = 'tough'; this.chartype = 'tough'
actorData.villainy = true; this.villainy = true
} }
super.prepareData(); super.prepareData()
} }
/* -------------------------------------------- */
getCharType() {
if (this.type === 'character') {
return 'player'
}
return this.system.chartype
}
/* -------------------------------------------- */
getVillainy() {
if (this.type === 'character') {
return false
}
return true
}
/* -------------------------------------------- */
getBougette() {
let b = duplicate(this.system.bougette)
b.label = game.i18n.localize( game.bol.config.bougetteState[String(this.system.bougette.value)] )
b.diceImg = "icons/dice/" + game.bol.config.bougetteDice[String(this.system.bougette.value)] + "black.svg"
return b
}
/* -------------------------------------------- */
async rollBougette() {
//ui.notifications.info("Roll bougette done !")
let attribute = duplicate(this.system.attributes.vigor)
let rollData = BoLRoll.getCommonRollData(this, "bougette", attribute, undefined )
rollData.formula = game.bol.config.bougetteDice[String(this.system.bougette.value)]
let r = new BoLDefaultRoll(rollData)
r.roll()
}
/* -------------------------------------------- */
decBougette() {
let bougette = duplicate(this.system.bougette)
bougette.value = Math.max( Number(bougette.value) - 1, 0)
this.update( { 'system.bougette': bougette } )
}
/* -------------------------------------------- */ /* -------------------------------------------- */
updateResourcesData() { updateResourcesData() {
if (this.type == 'character') { if (this.type == 'character') {
let newVitality = 10 + this.data.data.attributes.vigor.value + this.data.data.resources.hp.bonus let newVitality = 10 + this.system.attributes.vigor.value + this.system.resources.hp.bonus
if (this.data.data.resources.hp.max != newVitality) { if (this.system.resources.hp.max != newVitality) {
this.update({ 'data.resources.hp.max': newVitality }) this.update({ 'system.resources.hp.max': newVitality })
} }
let newPower = 10 + this.data.data.attributes.mind.value + this.data.data.resources.power.bonus let newPower = 10 + this.system.attributes.mind.value + this.system.resources.power.bonus
if (this.data.data.resources.power.max != newPower) { if (this.system.resources.power.max != newPower) {
this.update({ 'data.resources.power.max': newPower }) this.update({ 'system.resources.power.max': newPower })
} }
} }
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareDerivedData() { prepareDerivedData() {
super.prepareDerivedData() if (this.type == "vehicle") {
this.updateResourcesData()
this.manageHealthState(); } else {
super.prepareDerivedData()
this.updateResourcesData()
this.manageHealthState();
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
get itemData() {
return Array.from(this.data.items.values()).map(i => i.data)
}
get details() { get details() {
return this.data.data.details return this.system.details
} }
get attributes() { get attributes() {
return Object.values(this.data.data.attributes) return Object.values(this.system.attributes)
} }
get aptitudes() { get aptitudes() {
return Object.values(this.data.data.aptitudes) return Object.values(this.system.aptitudes)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
clearRoundModifiers() { // Process data/items that are finished at end of a round clearRoundModifiers() { // Process data/items that are finished at end of a round
let foList = this.fightoptions let foList = this.fightoptions
for (let fo of foList) { for (let fo of foList) {
if (fo.data.properties.used) { if (fo.system.properties.used) {
this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'data.properties.used': false }]) this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'system.properties.used': false }])
} }
} }
} }
@ -71,28 +110,35 @@ export class BoLActor extends Actor {
get defenseValue() { get defenseValue() {
let defMod = 0 let defMod = 0
let fo = this.getActiveFightOption() let fo = this.getActiveFightOption()
if (fo && fo.data.properties.fightoptiontype == "intrepid") { if (fo && fo.system.properties.fightoptiontype == "intrepid") {
defMod += -2 defMod += -2
} }
if (fo && fo.data.properties.fightoptiontype == "fulldefense") { if (fo && fo.system.properties.fightoptiontype == "fulldefense") {
defMod += 2 defMod += 2
} }
if (fo && fo.data.properties.fightoptiontype == "twoweaponsdef" && !fo.data.properties.used) { if (fo && fo.system.properties.fightoptiontype == "twoweaponsdef" && !fo.system.properties.used) {
defMod += 1 defMod += 1
this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'data.properties.used': true }]) this.updateEmbeddedDocuments("Item", [{ _id: fo._id, 'system.properties.used': true }])
} }
if (fo && fo.data.properties.fightoptiontype == "defense") { if (fo && fo.system.properties.fightoptiontype == "defense") {
defMod += 1 defMod += 1
} }
if (fo && fo.data.properties.fightoptiontype == "attack") { if (fo && fo.system.properties.fightoptiontype == "attack") {
defMod += -1 defMod += -1
} }
return this.data.data.aptitudes.def.value + defMod // Apply defense effects
for (let i of this.items) {
if (i.type === "feature" && i.system.subtype === "boleffect" && i.system.properties.identifier.includes("aptitudes.def") ) {
defMod += Number(i.system.properties.modifier)
}
}
console.log("Defense : ", defMod)
return this.system.aptitudes.def.value + defMod
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getActiveFightOption() { getActiveFightOption() {
let it = this.itemData.find(i => i.type === "feature" && i.data.subtype === "fightoption" && i.data.properties.activated) let it = this.items.find(i => i.type === "feature" && i.system.subtype === "fightoption" && i.system.properties.activated)
if (it) { if (it) {
return duplicate(it) return duplicate(it)
} }
@ -101,14 +147,14 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
incAttributeXP(key) { incAttributeXP(key) {
let attr = duplicate(this.data.data.attributes[key]) let attr = duplicate(this.system.attributes[key])
if (attr) { if (attr) {
let nextXP = (attr.value == -1) ? 2 : attr.value + (attr.value + 1) let nextXP = (attr.value == -1) ? 2 : attr.value + (attr.value + 1)
let xp = duplicate(this.data.data.xp) let xp = duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) { if (xp.total - xp.spent >= nextXP) {
attr.value += 1 attr.value += 1
xp.spent += nextXP xp.spent += nextXP
this.update({ [`data.attributes.${key}`]: attr, [`data.xp`]: xp }) this.update({ [`system.attributes.${key}`]: attr, [`system.xp`]: xp })
} else { } else {
ui.notifications.warn("Pas assez de points d'expérience !") ui.notifications.warn("Pas assez de points d'expérience !")
} }
@ -117,14 +163,14 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
incAptitudeXP(key) { incAptitudeXP(key) {
let apt = duplicate(this.data.data.aptitudes[key]) let apt = duplicate(this.system.aptitudes[key])
if (apt) { if (apt) {
let nextXP = (apt.value == -1) ? 1 : apt.value + 2 let nextXP = (apt.value == -1) ? 1 : apt.value + 2
let xp = duplicate(this.data.data.xp) let xp = duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) { if (xp.total - xp.spent >= nextXP) {
apt.value += 1 apt.value += 1
xp.spent += nextXP xp.spent += nextXP
this.update({ [`data.aptitudes.${key}`]: apt, [`data.xp`]: xp }) this.update({ [`system.aptitudes.${key}`]: apt, [`system.xp`]: xp })
} else { } else {
ui.notifications.warn("Pas assez de points d'expérience !") ui.notifications.warn("Pas assez de points d'expérience !")
} }
@ -132,15 +178,15 @@ export class BoLActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
incCareerXP(itemId) { incCareerXP(itemId) {
let career = this.data.items.get(itemId) let career = this.items.get(itemId)
if (career) { if (career) {
career = duplicate(career) career = duplicate(career)
let nextXP = career.data.rank + 1 let nextXP = career.system.rank + 1
let xp = duplicate(this.data.data.xp) let xp = duplicate(this.system.xp)
if (xp.total - xp.spent >= nextXP) { if (xp.total - xp.spent >= nextXP) {
xp.spent += nextXP xp.spent += nextXP
this.update({ [`data.xp`]: xp }) this.update({ [`system.xp`]: xp })
this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'data.rank': career.data.rank + 1 }]) this.updateEmbeddedDocuments('Item', [{ _id: career._id, 'system.rank': career.system.rank + 1 }])
} else { } else {
ui.notifications.warn("Pas assez de points d'expérience !") ui.notifications.warn("Pas assez de points d'expérience !")
} }
@ -149,18 +195,18 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
async toggleFightOption(itemId) { async toggleFightOption(itemId) {
let fightOption = this.data.items.get(itemId) let fightOption = this.items.get(itemId)
let state let state
let updates = [] let updates = []
if (fightOption) { if (fightOption) {
fightOption = duplicate(fightOption) fightOption = duplicate(fightOption)
if (fightOption.data.properties.activated) { if (fightOption.system.properties.activated) {
state = false state = false
} else { } else {
state = true state = true
} }
updates.push({ _id: fightOption._id, 'data.properties.activated': state }) // Update the selected one updates.push({ _id: fightOption._id, 'system.properties.activated': state }) // Update the selected one
await this.updateEmbeddedDocuments("Item", updates) // Apply all changes await this.updateEmbeddedDocuments("Item", updates) // Apply all changes
// Then notify // Then notify
ChatMessage.create({ ChatMessage.create({
@ -175,13 +221,13 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */ /*-------------------------------------------- */
get armorMalusValue() { // used for Fight Options get armorMalusValue() { // used for Fight Options
for (let armor of this.armors) { for (let armor of this.armors) {
if (armor.data.properties.armorQuality.includes("light")) { if (armor.system.properties.armorQuality.includes("light")) {
return 1 return 1
} }
if (armor.data.properties.armorQuality.includes("medium")) { if (armor.system.properties.armorQuality.includes("medium")) {
return 2 return 2
} }
if (armor.data.properties.armorQuality.includes("heavy")) { if (armor.system.properties.armorQuality.includes("heavy")) {
return 3 return 3
} }
} }
@ -189,112 +235,118 @@ export class BoLActor extends Actor {
} }
get resources() { get resources() {
return Object.values(this.data.data.resources) return Object.values(this.system.resources)
}
get boleffects() {
return this.items.filter(i => i.type === "feature" && i.system.subtype === "boleffect")
} }
get boons() { get boons() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "boon"); return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "boon") || []);
} }
get flaws() { get flaws() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "flaw"); return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw") || []);
} }
get careers() { get careers() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "career"); return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "career") || [])
} }
get origins() { get origins() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "origin"); return this.items.filter(i => i.type === "feature" && i.system.subtype === "origin");
} }
get races() { get races() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "race"); return this.items.filter(i => i.type === "feature" && i.system.subtype === "race");
} }
get languages() { get languages() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "language") return this.items.filter(i => i.type === "feature" && i.system.subtype === "language")
} }
get fightoptions() { get fightoptions() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "fightoption") return this.items.filter(i => i.type === "feature" && i.system.subtype === "fightoption")
} }
get godsfaith() { get godsfaith() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "godsfaith") return this.items.filter(i => i.type === "feature" && i.system.subtype === "godsfaith")
} }
get features() { get features() {
return this.itemData.filter(i => i.type === "feature") return this.items.filter(i => i.type === "feature")
} }
get equipment() { get equipment() {
return this.itemData.filter(i => i.type === "item") return this.items.filter(i => i.type === "item")
} }
get equipmentCreature() { get equipmentCreature() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && (( i.data.subtype === "weapon" && i.data.properties.natural === true) || (i.data.subtype === "armor")) ) return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && ((i.system.subtype === "weapon" && i.system.properties.natural === true) || (i.system.subtype === "armor")))
} }
get armors() { get armors() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "armor"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "armor");
} }
get helms() { get helms() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "helm"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "helm");
} }
get shields() { get shields() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "shield"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "shield");
}
get vehicleWeapons() {
return this.items.filter(i => i.type === "item" && i.system.category === "vehicleweapon")
} }
get weapons() { get weapons() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "weapon"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "weapon")
} }
get protections() { get protections() {
return this.armors.concat(this.helms).concat(this.shields) return this.armors.concat(this.helms).concat(this.shields)
} }
get spells() { get spells() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "spell"); return this.items.filter(i => i.type === "item" && i.system.category === "spell");
} }
get alchemy() { get alchemy() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "alchemy"); return this.items.filter(i => i.type === "item" && i.system.category === "alchemy");
} }
get melee() { get melee() {
return this.weapons.filter(i => i.data.properties.melee === true); return this.weapons.filter(i => i.system.properties.melee === true);
} }
get natural() { get natural() {
return this.weapons.filter(i => i.data.properties.natural === true); return this.weapons.filter(i => i.system.properties.natural === true);
} }
get ranged() { get ranged() {
return this.weapons.filter(i => i.data.properties.ranged === true); return this.weapons.filter(i => i.system.properties.ranged === true);
} }
get containers() { get containers() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "container"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "container");
} }
get treasure() { get treasure() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "currency"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "currency");
} }
get vehicles() { get vehicles() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "vehicle"); return this.items.filter(i => i.type === "item" && i.system.category === "vehicle");
} }
get ammos() { get ammos() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && i.data.subtype === "ammunition"); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && i.system.subtype === "ammunition");
} }
get misc() { get misc() {
return this.itemData.filter(i => i.type === "item" && i.data.category === "equipment" && (i.data.subtype === "other" || i.data.subtype === "container" || i.data.subtype === "scroll" || i.data.subtype === "jewel")); return this.items.filter(i => i.type === "item" && i.system.category === "equipment" && (i.system.subtype === "other" || i.system.subtype === "container" || i.system.subtype === "scroll" || i.system.subtype === "jewel"));
} }
get bonusBoons() { get bonusBoons() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "boon" && i.data.properties.isbonusdice); let boons = this.items.filter(i => i.type === "feature" && i.system.subtype === "boon" && i.system.properties.isbonusdice)
return duplicate(boons || [])
} }
get malusFlaws() { get malusFlaws() {
return this.itemData.filter(i => i.type === "feature" && i.data.subtype === "flaw" && i.data.properties.ismalusdice); return duplicate(this.items.filter(i => i.type === "feature" && i.system.subtype === "flaw" && i.system.properties.ismalusdice) || []);
} }
isSorcerer() { isSorcerer() {
if (this.careers.find(item => item.data.properties.sorcerer == true)) if (this.careers.find(item => item.system.properties.sorcerer == true))
return true return true
return false return false
} }
isAlchemist() { isAlchemist() {
if (this.careers.find(item => item.data.properties.alchemist == true)) if (this.careers.find(item => item.system.properties.alchemist == true))
return true return true
return false return false
} }
isPriest() { isPriest() {
if (this.careers.find(item => item.data.properties.priest == true)) if (this.careers.find(item => item.system.properties.priest == true))
return true return true
return false return false
} }
@ -304,18 +356,35 @@ export class BoLActor extends Actor {
let armors = this.armors let armors = this.armors
let ppCostArmor = 0 let ppCostArmor = 0
for (let armor of armors) { for (let armor of armors) {
if (armor.data.worn) { if (armor.system.worn) {
ppCostArmor += Number(armor.data.properties.modifiers.powercost) || 0 ppCostArmor += Number(armor.system.properties.modifiers.powercost) || 0
} }
} }
return ppCostArmor return ppCostArmor
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
getDamageAttributeValue(attrDamage) {
let attrDamageValue = 0
if (attrDamage.includes("vigor")) {
attrDamageValue = this.system.attributes.vigor.value
if (attrDamage.includes("half")) {
attrDamageValue = Math.floor(attrDamageValue / 2)
}
// Apply vigor effects
for (let i of this.items) {
if (i.type === "feature" && i.system.subtype === "boleffect" && i.system.properties.identifier.includes("vigor") ) {
attrDamageValue += Number(i.system.properties.modifier)
}
}
}
return attrDamageValue
}
/*-------------------------------------------- */
getArmorAgiMalus() { getArmorAgiMalus() {
let malusAgi = 0 let malusAgi = 0
for (let armor of this.protections) { for (let armor of this.protections) {
if (armor.data.worn) { if (armor.system.worn) {
malusAgi += Number(armor.data.properties.modifiers.agility) || 0 malusAgi += Number(armor.system.properties.modifiers.agility) || 0
} }
} }
return malusAgi return malusAgi
@ -324,8 +393,8 @@ export class BoLActor extends Actor {
getArmorInitMalus() { getArmorInitMalus() {
let malusInit = 0 let malusInit = 0
for (let armor of this.protections) { for (let armor of this.protections) {
if (armor.data.worn) { if (armor.system.worn) {
malusInit += Number(armor.data.properties.modifiers.init) || 0 malusInit += Number(armor.system.properties.modifiers.init) || 0
} }
} }
return malusInit return malusInit
@ -333,50 +402,50 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */ /*-------------------------------------------- */
spendPowerPoint(ppCost) { spendPowerPoint(ppCost) {
let newPP = this.data.data.resources.power.value - ppCost let newPP = this.system.resources.power.value - ppCost
newPP = (newPP < 0) ? 0 : newPP newPP = (newPP < 0) ? 0 : newPP
this.update({ 'data.resources.power.value': newPP }) this.update({ 'system.resources.power.value': newPP })
return newPP return newPP
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
resetAlchemyStatus(alchemyId) { resetAlchemyStatus(alchemyId) {
let alchemy = this.data.items.get(alchemyId) let alchemy = this.items.get(alchemyId)
if (alchemy) { if (alchemy) {
this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'data.properties.pccurrent': 0 }]) this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'system.properties.pccurrent': 0 }])
} }
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
async spendAlchemyPoint(alchemyId, pcCost) { async spendAlchemyPoint(alchemyId, pcCost) {
let alchemy = this.data.items.get(alchemyId) let alchemy = this.items.get(alchemyId)
if (alchemy) { if (alchemy) {
pcCost = Number(pcCost) ?? 0 pcCost = Number(pcCost) ?? 0
if (this.data.data.resources.alchemypoints.value >= pcCost) { if (this.system.resources.alchemypoints.value >= pcCost) {
let newPC = this.data.data.resources.alchemypoints.value - pcCost let newPC = this.system.resources.alchemypoints.value - pcCost
newPC = (newPC < 0) ? 0 : newPC newPC = (newPC < 0) ? 0 : newPC
this.update({ 'data.resources.alchemypoints.value': newPC }) this.update({ 'data.resources.alchemypoints.value': newPC })
newPC = alchemy.data.data.properties.pccurrent + pcCost newPC = alchemy.system.properties.pccurrent + pcCost
await this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'data.properties.pccurrent': newPC }]) await this.updateEmbeddedDocuments('Item', [{ _id: alchemy.id, 'system.properties.pccurrent': newPC }])
} else { } else {
ui.notifications.warn("Plus assez de Points de Création !") ui.notifications.warn( game.i18n.localize("BOL.ui.nomorealchemypoints") )
} }
} }
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
getAlchemistBonus() { getAlchemistBonus() {
let sorcerer = this.careers.find(item => item.data.properties.alchemist == true) let sorcerer = this.careers.find(item => item.system.properties.alchemist == true)
if (sorcerer) { if (sorcerer) {
return sorcerer.data.rank return sorcerer.system.rank
} }
return 0; return 0;
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
getSorcererBonus() { getSorcererBonus() {
let sorcerer = this.careers.find(item => item.data.properties.sorcerer == true) let sorcerer = this.careers.find(item => item.system.properties.sorcerer == true)
if (sorcerer) { if (sorcerer) {
return sorcerer.data.rank return sorcerer.system.rank
} }
return 0; return 0;
} }
@ -384,29 +453,30 @@ export class BoLActor extends Actor {
/*-------------------------------------------- */ /*-------------------------------------------- */
heroReroll() { heroReroll() {
if (this.type == 'character') { if (this.type == 'character') {
return this.data.data.resources.hero.value > 0; return this.system.resources.hero.value > 0;
} else { } else {
if (this.data.data.type == 'adversary') { if (this.system.villainy == 'adversary') {
return this.data.data.resources.hero.value > 0; return this.system.resources.hero.value > 0;
} }
} }
return false return false
} }
/*-------------------------------------------- */
getResourcesFromType() { getResourcesFromType() {
let resources = {}; let resources = {};
if (this.type == 'encounter') { if (this.type == 'encounter') {
resources['hp'] = this.data.data.resources.hp; resources['hp'] = this.system.resources.hp;
if (this.data.data.type != 'base') { if (this.system.chartype != 'base') {
resources['faith'] = this.data.data.resources.faith resources['faith'] = this.system.resources.faith
resources['power'] = this.data.data.resources.power resources['power'] = this.system.resources.power
} }
if (this.data.data.type == 'adversary') { if (this.system.chartype == 'adversary') {
resources['hero'] = duplicate(this.data.data.resources.hero) resources['hero'] = duplicate(this.system.resources.hero)
resources['hero'].label = "BOL.resources.villainy" resources['hero'].label = "BOL.resources.villainy"
} }
} else { } else {
resources = this.data.data.resources; resources = this.system.resources;
} }
return resources return resources
} }
@ -452,6 +522,11 @@ export class BoLActor extends Actor {
"label": "BOL.featureSubtypes.gods", "label": "BOL.featureSubtypes.gods",
"ranked": false, "ranked": false,
"items": this.godsfaith "items": this.godsfaith
},
"boleffects": {
"label": "BOL.featureSubtypes.effects",
"ranked": false,
"items": this.boleffects
} }
} }
} }
@ -467,6 +542,15 @@ export class BoLActor extends Actor {
"options": false, "options": false,
"items": this.melee "items": this.melee
}, },
"natural": {
"label": "BOL.combatCategory.natural",
"weapon": true,
"protection": false,
"blocking": false,
"ranged": false,
"options": false,
"items": this.natural
},
"ranged": { "ranged": {
"label": "BOL.combatCategory.ranged", "label": "BOL.combatCategory.ranged",
"weapon": true, "weapon": true,
@ -506,39 +590,17 @@ export class BoLActor extends Actor {
} }
} }
buildCombatCreature() {
return {
"natural": {
"label": "BOL.combatCategory.natural",
"weapon": true,
"protection": false,
"blocking": false,
"ranged": false,
"options": false,
"items": this.natural
},
"protections": {
"label": "BOL.combatCategory.protections",
"weapon": false,
"protection": true,
"blocking": false,
"ranged": false,
"options": false,
"items": this.protections
},
}
}
/*-------------------------------------------- */ /*-------------------------------------------- */
buildRollList() { buildRollList() {
let rolls = [] let rolls = []
for (let key in this.data.data.attributes) { for (let key in this.system.attributes) {
let attr = this.data.data.attributes[key] let attr = this.system.attributes[key]
rolls.push({ key: key, value: attr.value, name: attr.label, type: "attribute" }) rolls.push({ key: key, value: attr.value, name: attr.label, type: "attribute" })
} }
for (let key in this.data.data.aptitudes) { for (let key in this.system.aptitudes) {
if (key != "def") { if (key != "def") {
let apt = this.data.data.aptitudes[key] let apt = this.system.aptitudes[key]
rolls.push({ key: key, value: apt.value, name: apt.label, type: "aptitude" }) rolls.push({ key: key, value: apt.value, name: apt.label, type: "aptitude" })
} }
} }
@ -554,60 +616,106 @@ export class BoLActor extends Actor {
async manageHealthState() { async manageHealthState() {
let hpID = "lastHP" + this.id let hpID = "lastHP" + this.id
let lastHP = await this.getFlag("world", hpID) let lastHP = await this.getFlag("world", hpID)
if (lastHP != this.data.data.resources.hp.value && game.user.isGM ) { // Only GM sends this if (lastHP != this.system.resources.hp.value && game.user.isGM) { // Only GM sends this
await this.setFlag("world", hpID, this.data.data.resources.hp.value) await this.setFlag("world", hpID, this.system.resources.hp.value)
if (this.data.data.resources.hp.value <= 0) { let prone = this.effects.find( ef => ef.label == "EFFECT.StatusProne")
let dead = this.effects.find( ef => ef.label == "EFFECT.StatusDead")
if (this.system.resources.hp.value <= 0) {
if ( !prone) {
await this.createEmbeddedDocuments("ActiveEffect", [
{label: 'EFFECT.StatusProne', icon: 'icons/svg/falling.svg', flags: { core: { statusId: 'prone' } } }
])
}
if ( this.system.resources.hp.value < -5 && !dead) {
await this.createEmbeddedDocuments("ActiveEffect", [
{label: 'EFFECT.StatusDead', icon: 'icons/svg/skull.svg', flags: { core: { statusId: 'dead' } } }
])
}
ChatMessage.create({ ChatMessage.create({
alias: this.name, alias: this.name,
whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name), whisper: BoLUtility.getWhisperRecipientsAndGMs(this.name),
content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.data.data.resources.hp.value }) content: await renderTemplate('systems/bol/templates/chat/chat-vitality-zero.hbs', { name: this.name, img: this.img, hp: this.system.resources.hp.value })
}) })
} else {
if ( prone ) {
await this.deleteEmbeddedDocuments("ActiveEffect", [ prone.id ] )
}
if ( dead ) {
await this.deleteEmbeddedDocuments("ActiveEffect", [ dead.id ] )
}
} }
} }
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
registerInit(initScore, isCritical, isFumble) { async registerInit(rollData) {
this.update({ 'data.combat.lastinit': initScore, 'data.combat.iscritical': isCritical, 'data.combat.isfumble': isFumble }) rollData.actor = undefined // Cleanup if present
await this.setFlag("world", "last-initiative", rollData)
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
getLastInitData() { getInitiativeRank(rollData = undefined) {
return this.data.data.combat if (!rollData) {
rollData = this.getFlag("world", "last-initiative")
}
let fvttInit = 4 // Pietaille par defaut
if (this.type == 'character' ) {
fvttInit = 5
if (!rollData) {
fvttInit = -1
} else {
if (rollData.isLegendary) {
fvttInit = 10
} else if (rollData.isCritical) {
fvttInit = 9
} else if (rollData.isSuccess ) {
fvttInit = 8
} else if (rollData.isFumble) {
fvttInit = 3
}
}
}
if ( this.getCharType() == 'adversary') {
fvttInit = 7
}
if ( this.getCharType() == 'tough') {
fvttInit = 6
}
return fvttInit
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
async subHeroPoints(nb) { async subHeroPoints(nb) {
let newHeroP = this.data.data.resources.hero.value - nb; let newHeroP = this.system.resources.hero.value - nb;
newHeroP = (newHeroP < 0) ? 0 : newHeroP; newHeroP = (newHeroP < 0) ? 0 : newHeroP;
await this.update({ 'data.resources.hero.value': newHeroP }); await this.update({ 'system.resources.hero.value': newHeroP });
} }
/*-------------------------------------------- */ /*-------------------------------------------- */
async sufferDamage(damage) { async sufferDamage(damage) {
let newHP = this.data.data.resources.hp.value - damage let newHP = this.system.resources.hp.value - damage
await this.update({ 'data.resources.hp.value': newHP }) await this.update({ 'system.resources.hp.value': newHP })
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getArmorFormula() { getArmorFormula() {
let protectWorn = this.protections.filter(item => item.data.worn) let protectWorn = this.protections.filter(item => item.system.worn)
let formula = "" let formula = ""
for (let protect of protectWorn) { for (let protect of protectWorn) {
if (protect.data.subtype == 'helm') { if (protect.system.subtype == 'helm') {
formula += "+1" formula += "+1"
} else if (protect.data.subtype == 'armor') { } else if (protect.system.subtype == 'armor') {
if (BoLUtility.getRollArmor()) { if (BoLUtility.getRollArmor()) {
if (!protect.data.properties.soak.formula || protect.data.properties.soak.formula == "") { if (!protect.system.properties.soak.formula || protect.system.properties.soak.formula == "") {
ui.notifications.warn(`L'armure ${protect.name} n'a pas de formule pour la protection !`) ui.notifications.warn( game.i18n.localize("BOL.ui.armornoformula", protect.name) )
} else { } else {
formula += "+" + " max(" + protect.data.properties.soak.formula +",0)" formula += "+" + " max(" + protect.system.properties.soak.formula + ",0)"
} }
} else { } else {
if (protect.data.properties.soak.value == undefined) { if (protect.system.properties.soak.value == undefined) {
ui.notifications.warn(`L'armure ${protect.name} n'a pas de valeur fixe pour la protection !`) ui.notifications.warn( game.i18n.localize("BOL.ui.armornoformula", protect.name) )
} else { } else {
formula += "+ " + protect.data.properties.soak.value formula += "+ " + protect.system.properties.soak.value
} }
} }
} }
@ -618,9 +726,9 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
rollProtection(itemId) { rollProtection(itemId) {
let armor = duplicate(this.data.items.get(itemId)) let armor = duplicate(this.items.get(itemId))
if (armor) { if (armor) {
let armorFormula = "max("+armor.data.properties.soak.formula + ", 0)" let armorFormula = "max(" + armor.system.properties.soak.formula + ", 0)"
let rollArmor = new Roll(armorFormula) let rollArmor = new Roll(armorFormula)
rollArmor.roll({ async: false }).toMessage() rollArmor.roll({ async: false }).toMessage()
} }
@ -628,7 +736,7 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
rollWeaponDamage(itemId) { rollWeaponDamage(itemId) {
let weapon = duplicate(this.data.items.get(itemId)) let weapon = duplicate(this.items.get(itemId))
if (weapon) { if (weapon) {
let r = new BoLDefaultRoll({ id: randomID(16), isSuccess: true, mode: "weapon", weapon: weapon, actorId: this.id, actor: this }) let r = new BoLDefaultRoll({ id: randomID(16), isSuccess: true, mode: "weapon", weapon: weapon, actorId: this.id, actor: this })
r.setSuccess(true) r.setSuccess(true)
@ -638,10 +746,10 @@ export class BoLActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
toggleEquipItem(item) { toggleEquipItem(item) {
const equipable = item.data.data.properties.equipable; const equipable = item.system.properties.equipable;
if (equipable) { if (equipable) {
let itemData = duplicate(item.data); let itemData = duplicate(item);
itemData.data.worn = !itemData.data.worn; itemData.system.worn = !itemData.system.worn;
return item.update(itemData); return item.update(itemData);
} }
} }

View File

@ -0,0 +1,229 @@
/**
* Extend the basic ActorSheet with some very simple modifications
* @extends {ActorSheet}
*/
import { BoLRoll } from "../controllers/bol-rolls.js";
import { BoLUtility } from "../system/bol-utility.js";
export class BoLVehicleSheet extends ActorSheet {
/** @override */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
classes: ["bol", "sheet", "actor"],
template: "systems/bol/templates/actor/vehicle-sheet.hbs",
width: 860,
height: 600,
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "stats" }]
});
}
/* -------------------------------------------- */
/** @override */
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;
// Add Inventory Item
html.find('.item-create').click(this._onItemCreate.bind(this));
// Update Inventory Item
html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item");
const item = this.actor.items.get(li.data("itemId"));
item.sheet.render(true);
})
// Equip/Unequip item
html.find('.item-equip').click(this._onToggleEquip.bind(this));
html.find('.create_item').click(ev => {
this.actor.createEmbeddedDocuments('Item', [{ name: "Nouvel Equipement", type: "item" }], { renderSheet: true });
});
html.find(".toggle-fight-option").click((ev) => {
const li = $(ev.currentTarget).parents(".item")
this.actor.toggleFightOption(li.data("itemId"))
})
html.find(".inc-dec-btns-alchemy").click((ev) => {
const li = $(ev.currentTarget).parents(".item");
this.actor.spendAlchemyPoint(li.data("itemId"), 1)
})
// Incr./Decr. career ranks
html.find(".inc-dec-btns").click((ev) => {
const li = $(ev.currentTarget).parents(".item");
if (li) {
const item = this.actor.items.get(li.data("itemId"));
if (item) {
const dataset = ev.currentTarget.dataset;
const operator = dataset.operator;
const target = dataset.target;
const incr = parseInt(dataset.incr)
const min = parseInt(dataset.min)
const max = parseInt(dataset.max) || 10000
let value = eval("item." + target)
value = value || 0
//console.log("IncDec", item, target, value, operator, min, max)
if (operator === "minus") {
if (value >= min + incr) value -= incr;
else value = min;
}
if (operator === "plus") {
if (value <= max - incr) value += incr;
else value = max;
}
let update = { [`${target}`]: value };
item.update(update);
}
}
});
// Delete Inventory Item
html.find('.item-delete').click(ev => {
Dialog.confirm({
title: "Suppression",
content: `Vous êtes sûr de vouloir supprimer cet item ?`,
yes: () => {
const li = $(ev.currentTarget).parents(".item");
this.actor.deleteEmbeddedDocuments("Item", [li.data("itemId")])
li.slideUp(200, () => this.render(false));
},
no: () => { },
defaultYes: false,
});
});
// Rollable abilities.
html.find('.rollable').click(this._onRoll.bind(this));
}
/* -------------------------------------------- */
/** @override */
async getData(options) {
const data = super.getData(options)
const actorData = duplicate(data)
let formData = duplicate(data)
formData.config = game.bol.config
formData.name = this.actor.name
formData.img = this.actor.img
formData.system = duplicate(this.actor.system)
formData.weapons = this.actor.vehicleWeapons
formData.isGM = game.user.isGM
formData.options = this.options
formData.owner = this.document.isOwner
formData.editScore = this.options.editScore
formData.description = await TextEditor.enrichHTML(this.actor.system.description, {async: true})
formData.isGM = game.user.isGM
console.log("VEHICLEDATA", formData)
return formData;
}
/* -------------------------------------------- */
/**
* Handle creating a new Owned Item for the actor using initial data defined in the HTML dataset
* @param {Event} event The originating click event
* @private
*/
_onItemCreate(event) {
event.preventDefault();
const header = event.currentTarget;
// Get the type of item to create.
const type = header.dataset.type;
// Grab any data associated with this control.
const data = duplicate(header.dataset);
// Initialize a default name.
const name = `New ${type.capitalize()}`;
// Prepare the item object.
const itemData = {
name: name,
type: type,
data: data
};
// Remove the type from the dataset since it's in the itemData.type prop.
delete itemData.data["type"];
// Finally, create the item!
return this.actor.createEmbeddedDocuments("Item", [itemData]);
}
_onToggleEquip(event) {
event.preventDefault();
const li = $(event.currentTarget).closest(".item");
const item = this.actor.items.get(li.data("itemId"));
return this.actor.toggleEquipItem(item);
}
/**
* Handle clickable rolls.
* @param {Event} event The originating click event
* @private
*/
_onRoll(event) {
event.preventDefault();
const element = event.currentTarget
const dataset = element.dataset
const rollType = dataset.rollType
const li = $(event.currentTarget).closest(".item")
switch (rollType) {
case "attribute":
BoLRoll.attributeCheck(this.actor, dataset.key, event)
break;
case "aptitude":
BoLRoll.aptitudeCheck(this.actor, dataset.key, event)
break;
case "weapon":
BoLRoll.weaponCheck(this.actor, event)
break;
case "spell":
BoLRoll.spellCheck(this.actor, event)
break;
case "alchemy":
BoLRoll.alchemyCheck(this.actor, event)
break;
case "protection":
this.actor.rollProtection(li.data("item-id"))
break;
case "damage":
this.actor.rollWeaponDamage(li.data("item-id"))
break;
case "aptitudexp":
this.actor.incAptitudeXP(dataset.key)
break;
case "attributexp":
this.actor.incAttributeXP(dataset.key)
break;
case "careerxp":
this.actor.incCareerXP( li.data("item-id"))
break;
default: break;
}
}
/** @override */
setPosition(options = {}) {
const position = super.setPosition(options);
const sheetBody = this.element.find(".sheet-body");
const bodyHeight = position.height - 192;
sheetBody.css("height", bodyHeight);
return position;
}
}

View File

@ -2,6 +2,7 @@
// Import Modules // Import Modules
import { BoLActor } from "./actor/actor.js" import { BoLActor } from "./actor/actor.js"
import { BoLActorSheet } from "./actor/actor-sheet.js" import { BoLActorSheet } from "./actor/actor-sheet.js"
import { BoLVehicleSheet } from "./actor/vehicle-sheet.js"
import { BoLItem } from "./item/item.js" import { BoLItem } from "./item/item.js"
import { BoLItemSheet } from "./item/item-sheet.js" import { BoLItemSheet } from "./item/item-sheet.js"
import { System, BOL } from "./system/config.js" import { System, BOL } from "./system/config.js"
@ -15,6 +16,7 @@ import { BoLTokenHud } from "./system/bol-action-hud.js"
import { BoLHotbar } from "./system/bol-hotbar.js" import { BoLHotbar } from "./system/bol-hotbar.js"
import { BoLAdventureGenerator } from "./system/bol-adventure-generator.js" import { BoLAdventureGenerator } from "./system/bol-adventure-generator.js"
import { BoLCommands} from "./system/bol-commands.js" import { BoLCommands} from "./system/bol-commands.js"
import { BoLCharacterSummary} from "./system/bol-character-summary.js"
/* -------------------------------------------- */ /* -------------------------------------------- */
Hooks.once('init', async function () { Hooks.once('init', async function () {
@ -39,7 +41,7 @@ Hooks.once('init', async function () {
*/ */
CONFIG.Combat.initiative = { CONFIG.Combat.initiative = {
formula: "2d6+@attributes.mind.value+@aptitudes.init.value", formula: "2d6+@attributes.mind.value+@aptitudes.init.value",
decimals: 3 decimals: 2
}; };
// Define custom Entity classes // Define custom Entity classes
@ -49,7 +51,9 @@ Hooks.once('init', async function () {
// Register sheet application classes // Register sheet application classes
Actors.unregisterSheet("core", ActorSheet); Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("bol", BoLActorSheet, { makeDefault: true }); Actors.registerSheet("bol", BoLActorSheet, { types: ["character", "encounter"], makeDefault: true })
Actors.registerSheet("bol", BoLVehicleSheet, { types: ["vehicle"], makeDefault: true })
Items.unregisterSheet("core", ItemSheet); Items.unregisterSheet("core", ItemSheet);
Items.registerSheet("bol", BoLItemSheet, { makeDefault: true }); Items.registerSheet("bol", BoLItemSheet, { makeDefault: true });
@ -79,6 +83,7 @@ function registerUsageCount( registerKey ) {
name: "Unique world key", name: "Unique world key",
scope: "world", scope: "world",
config: false, config: false,
default: "",
type: String type: String
}); });
@ -88,7 +93,10 @@ function registerUsageCount( registerKey ) {
game.settings.set(registerKey, "world-key", worldKey ) game.settings.set(registerKey, "world-key", worldKey )
} }
// Simple API counter // Simple API counter
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.data.version}"` let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
//$.ajaxSetup({
//headers: { 'Access-Control-Allow-Origin': '*' }
//})
$.ajax(regURL) $.ajax(regURL)
} }
} }
@ -103,13 +111,17 @@ function welcomeMessage() {
game.i18n.localize("BOL.chat.welcome2") + "<p>" + game.i18n.localize("BOL.chat.welcome2") + "<p>" +
game.i18n.localize("BOL.chat.welcome3") + "<p>" + game.i18n.localize("BOL.chat.welcome3") + "<p>" +
game.i18n.localize("BOL.chat.welcome4") + "</p>" + game.i18n.localize("BOL.chat.welcome4") + "</p>" +
game.i18n.localize("BOL.chat.welcome5") + "</p>" game.i18n.localize("BOL.chat.welcome5") + "<br>" +
game.i18n.localize("BOL.chat.welcome6")
} ) } )
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
Hooks.once('ready', async function () { Hooks.once('ready', async function () {
BoLUtility.ready() BoLUtility.ready()
BoLCharacterSummary.ready()
registerUsageCount('bol') registerUsageCount('bol')

View File

@ -7,7 +7,7 @@ export class BoLRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
static options() { static options() {
return { classes: ["bol", "dialog"], width: 480, height: 540 }; return { classes: ["bol", "dialog"], width: 480, height: 'fit-content' };
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -16,26 +16,57 @@ export class BoLRoll {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static attributeCheck(actor, key) { static updateApplicableEffects(rollData) {
let appEffects = []
for( let effect of rollData.bolEffects) {
if(effect.system.properties.identifier =="always") {
appEffects.push(effect)
} else if (effect.system.properties.identifier.includes(rollData.attribute.key)) {
appEffects.push(effect)
} else if ( rollData.aptitude && effect.system.properties.identifier.includes(rollData.aptitude.key)) {
appEffects.push(effect)
}
}
return appEffects
}
let attribute = eval(`actor.data.data.attributes.${key}`) /* -------------------------------------------- */
let label = (attribute.label) ? game.i18n.localize(attribute.label) : null static getCommonRollData(actor, mode, attribute, aptitude = undefined ) {
let description = game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label)
let rollData = { let rollData = {
mode: "attribute", mode: mode,
actorId: actor.id, actorId: actor.id,
tokenId: actor.token?.id,
img: actor.img, img: actor.img,
attribute: attribute, attribute: attribute,
attrValue: attribute.value, attrValue: attribute.value,
aptValue: 0, aptValue: 0,
label: label,
careerBonus: 0, careerBonus: 0,
description: description,
armorAgiMalus: actor.getArmorAgiMalus(), armorAgiMalus: actor.getArmorAgiMalus(),
armorInitMalus: actor.getArmorInitMalus(), armorInitMalus: actor.getArmorInitMalus(),
mod: 0 adv: "0",
mod: 0,
modRanged: 0,
aptValue: 0,
bolEffects: actor.boleffects
} }
if (aptitude) {
rollData.aptitude = aptitude
rollData.aptValue = aptitude.value
}
rollData.bolApplicableEffects = this.updateApplicableEffects(rollData)
return rollData
}
/* -------------------------------------------- */
static attributeCheck(actor, key) {
let attribute = eval(`actor.system.attributes.${key}`)
let rollData = this.getCommonRollData(actor, "attribute", attribute)
rollData.description = game.i18n.localize('BOL.ui.attributeCheck') + " - " + game.i18n.localize(attribute.label)
rollData.label = (attribute.label) ? game.i18n.localize(attribute.label) : null
console.log(">>>>>>>>>>", rollData, actor) console.log(">>>>>>>>>>", rollData, actor)
return this.displayRollDialog(rollData) return this.displayRollDialog(rollData)
} }
@ -43,28 +74,54 @@ export class BoLRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
static aptitudeCheck(actor, key) { static aptitudeCheck(actor, key) {
let aptitude = eval(`actor.data.data.aptitudes.${key}`) let aptitude = eval(`actor.system.aptitudes.${key}`)
let attrKey = this.getDefaultAttribute(key) let attrKey = this.getDefaultAttribute(key)
let attribute = eval(`actor.data.data.attributes.${attrKey}`) let attribute = eval(`actor.system.attributes.${attrKey}`)
let label = (aptitude.label) ? game.i18n.localize(aptitude.label) : null; let rollData = this.getCommonRollData(actor, "aptitude", attribute, aptitude)
let description = game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label);
return this.displayRollDialog( rollData.label = (aptitude.label) ? game.i18n.localize(aptitude.label) : null
{ rollData.description = game.i18n.localize('BOL.ui.aptitudeCheck') + " - " + game.i18n.localize(aptitude.label)
mode: "aptitude",
actorId: actor.id, return this.displayRollDialog( rollData)
img: actor.img, }
attribute: attribute,
aptitude: aptitude, /* -------------------------------------------- */
attrValue: attribute.value, static async detectDistance( weapon, target ) {
aptValue: aptitude.value, let visible, dist
armorAgiMalus: actor.getArmorAgiMalus(), if (weapon.system.properties.ranged || weapon.system.properties.throwing) {
armorInitMalus: actor.getArmorInitMalus(), console.log("target", target, weapon)
label: label, visible = canvas.effects.visibility.testVisibility(target.center, { object: _token })
careerBonus: 0, dist = Number(canvas.grid.measureDistances([{ ray: new Ray(_token.center, target.center) }], { gridSpaces: false })).toFixed(2)
description: description, let range = Number(weapon.system.properties.range)
mod: 0 let rangeMsg = "BOL.chat.rangeout"
if ( dist <= range) {
rangeMsg = "BOL.chat.range0"
} else if (dist < range*2) {
rangeMsg = "BOL.chat.range1"
} else if (dist < range*3) {
rangeMsg = "BOL.chat.range2"
} else if (dist < range*4) {
rangeMsg = "BOL.chat.range3"
} else if (dist < range*5) {
rangeMsg = "BOL.chat.range4"
} else if (dist < range*6) {
rangeMsg = "BOL.chat.range5"
} else if (dist < range*7) {
rangeMsg = "BOL.chat.range6"
}
ChatMessage.create({
content: await renderTemplate('systems/bol/templates/chat/chat-info-range.hbs', {
weapon: weapon,
attackerName: _token.actor.name,
defenderName: target.actor.name,
weaponRange: weapon.system.properties.range,
visible: visible,
distance: dist,
rangeMsg: rangeMsg
})
}) })
}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -72,40 +129,34 @@ export class BoLRoll {
let target = BoLUtility.getTarget() let target = BoLUtility.getTarget()
let weaponData = weapon.data let weaponData = weapon.system
let attribute = eval(`actor.data.data.attributes.${weaponData.properties.attackAttribute}`) let attribute = eval(`actor.system.attributes.${weaponData.properties.attackAttribute}`)
let aptitude = eval(`actor.data.data.aptitudes.${weaponData.properties.attackAptitude}`) let aptitude = eval(`actor.system.aptitudes.${weaponData.properties.attackAptitude}`)
let rollData = this.getCommonRollData(actor, "weapon", attribute, aptitude)
// Compute distance
this.detectDistance( weapon, target)
// Manage specific case // Manage specific case
let fightOption = actor.getActiveFightOption() let fightOption = actor.getActiveFightOption()
if (fightOption && fightOption.data.fightoptiontype == "fulldefense") { if (fightOption && fightOption.system.fightoptiontype == "fulldefense") {
ui.notifications.warn(`{{actor.name}} est en Défense Totale ! Il ne peut pas attaquer ce round.`) ui.notifications.warn(`{{actor.name}} est en Défense Totale ! Il ne peut pas attaquer ce round.`)
return return
} }
// Build the roll structure
let rolldata = { // Update the roll structure
mode: "weapon", rollData.weapon = weapon
actorId: actor.id, rollData.isRanged = weaponData.properties.ranged || weaponData.properties.throwing
img: actor.img, rollData.targetId = target?.id
weapon: weapon, rollData.fightOption = fightOption
isRanged: weaponData.properties.ranged || weaponData.properties.throwing, rollData.defenderId = target?.actor.id
targetId: target?.id, rollData.label = (weapon.name) ? weapon.name : game.i18n.localize('BOL.ui.noWeaponName')
fightOption: fightOption, rollData.description = game.i18n.localize('BOL.ui.weaponAttack') + " : " + weapon.name
careerBonus: 0,
defenderId: target?.data?.actorId, return this.displayRollDialog(rollData)
attribute: attribute,
aptitude: aptitude,
attrValue: attribute.value,
aptValue: aptitude.value,
armorAgiMalus: actor.getArmorAgiMalus(),
armorInitMalus: actor.getArmorInitMalus(),
mod: 0,
modRanged: 0,
label: (weapon.name) ? weapon.name : game.i18n.localize('BOL.ui.noWeaponName'),
description: game.i18n.localize('BOL.ui.weaponAttack') + " : " + weapon.name,
}
return this.displayRollDialog(rolldata)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static weaponCheck(actor, event) { static weaponCheck(actor, event) {
const li = $(event.currentTarget).parents(".item") const li = $(event.currentTarget).parents(".item")
@ -127,60 +178,46 @@ export class BoLRoll {
return; return;
} }
alchemy = duplicate(alchemy) alchemy = duplicate(alchemy)
let alchemyData = alchemy.data let alchemyData = alchemy.system
if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) { if (alchemyData.properties.pccurrent < alchemyData.properties.pccost) {
ui.notifications.warn("Pas assez de Points de Cration investis dans la Préparation !") ui.notifications.warn("Pas assez de Points de Création investis dans la Préparation !")
return return
} }
let alchemyDef = { let rollData = this.getCommonRollData(actor, "alchemy", actor.system.attributes.mind)
mode: "alchemy",
actorId: actor.id, rollData.alchemy = alchemy
img: actor.img, rollData.careerBonus = actor.getAlchemistBonus()
alchemy: alchemy, rollData.pcCost = Number(alchemyData.properties.pccost)
attribute: actor.data.data.attributes.mind, rollData.pcCostCurrent = Number(alchemyData.properties.pccurrent)
attrValue: actor.data.data.attributes.mind.value, rollData.mod = Number(alchemyData.properties.difficulty)
aptValue: 0, rollData.label = alchemy.name
careerBonus: actor.getAlchemistBonus(), rollData.description = game.i18n.localize('BOL.ui.makeAlchemy') + "+" + alchemy.name
pcCost: Number(alchemyData.properties.pccost),
pcCostCurrent: Number(alchemyData.properties.pccurrent),
mod: Number(alchemyData.properties.difficulty),
armorAgiMalus: actor.getArmorAgiMalus(),
armorInitMalus: actor.getArmorInitMalus(),
label: alchemy.name,
description: game.i18n.localize('BOL.ui.makeAlchemy') + "+" + alchemy.name,
}
console.log("ALCHEMY!", alchemyDef); console.log("ALCHEMY!", alchemyDef);
return this.displayRollDialog(alchemyDef); return this.displayRollDialog(alchemyDef);
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static spellCheckWithSpell( actor, spell ) { static spellCheckWithSpell( actor, spell ) {
let spellDef = { let rollData = this.getCommonRollData(actor, "spell", actor.system.attributes.mind)
mode: "spell",
actorId: actor.id, rollData.spell = spell
img: actor.img, rollData.ppCurrent = Number(actor.system.resources.power.value),
spell: spell, rollData.careerBonus = actor.getSorcererBonus(),
attribute: actor.data.data.attributes.mind, rollData.ppCostArmor = actor.getPPCostArmor(),
attrValue: actor.data.data.attributes.mind.value, rollData.ppCost = Number(spell.system.properties.ppcost),
aptValue: 0, rollData.mod = Number(spell.system.properties.difficulty),
ppCurrent: Number(actor.data.data.resources.power.value), rollData.label = spell.name,
careerBonus: actor.getSorcererBonus(), rollData.description = game.i18n.localize('BOL.ui.focusSpell') + " : " + spell.name
ppCostArmor: actor.getPPCostArmor(),
ppCost: Number(spell.data.properties.ppcost),
mod: Number(spell.data.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) return this.displayRollDialog(rollData)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static spellCheck(actor, event) { static spellCheck(actor, event) {
if (actor.data.data.resources.power.value <= 0) { if (actor.system.resources.power.value <= 0) {
ui.notifications.warn("Plus assez de points de Pouvoir !") ui.notifications.warn("Plus assez de points de Pouvoir !")
return return
} }
@ -200,8 +237,29 @@ export class BoLRoll {
this.updateArmorMalus(this.rollData) this.updateArmorMalus(this.rollData)
this.updatePPCost(this.rollData) this.updatePPCost(this.rollData)
// get basic dices from boons/flaws
let effectModifier = 0
this.rollData.bmDice = this.rollData.nbBoons - this.rollData.nbFlaws + this.rollData.bDice - this.rollData.mDice this.rollData.bmDice = this.rollData.nbBoons - this.rollData.nbFlaws + this.rollData.bDice - this.rollData.mDice
// add applicable bonus/malus dices effects
for (let effect of this.rollData.bolApplicableEffects) {
if (effect.system.properties.modifier == "1B") {
this.rollData.bmDice++;
} else if (effect.system.properties.modifier == "1B") {
this.rollData.bmDice+=2;
} else if (effect.system.properties.modifier == "1M") {
this.rollData.bmDice--;
} else if (effect.system.properties.modifier == "2M") {
this.rollData.bmDice-=2;
} else {
effectModifier += Number(effect.system.properties.modifier)
}
}
// Keep track of the final effect modifier
this.rollData.effectModifier = effectModifier
// Final number of dices
this.rollData.nbDice = 2 + Math.abs(this.rollData.bmDice) this.rollData.nbDice = 2 + Math.abs(this.rollData.bmDice)
// Bonus or Malus ?
if (this.rollData.bmDice == 0) { if (this.rollData.bmDice == 0) {
$('#roll-nbdice').val("2") $('#roll-nbdice').val("2")
} else { } else {
@ -209,12 +267,19 @@ export class BoLRoll {
$('#roll-nbdice').val("2 + " + String(Math.abs(this.rollData.bmDice)) + letter) $('#roll-nbdice').val("2 + " + String(Math.abs(this.rollData.bmDice)) + letter)
} }
let rollbase = this.rollData.attrValue + "+" + this.rollData.aptValue let rollbase = this.rollData.attrValue + "+" + this.rollData.aptValue
if ( this.rollData.weapon && this.rollData.weapon.data.properties.onlymodifier ) { if ( this.rollData.weapon && this.rollData.weapon.system.properties.onlymodifier ) {
rollbase = "" rollbase = ""
} }
$('#roll-modifier').val(rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" + $('#roll-modifier').val(rollbase + "+" + this.rollData.careerBonus + "+" + this.rollData.mod + "+" +
this.rollData.modRanged + "+" + this.rollData.weaponModifier + "-" + this.rollData.defence + "-" + this.rollData.modArmorMalus + "-" + this.rollData.modRanged + "+" + this.rollData.weaponModifier + "-" + this.rollData.defence + "-" + this.rollData.modArmorMalus + "-" +
this.rollData.shieldMalus + "+" + this.rollData.attackModifier + "+" + this.rollData.appliedArmorMalus) this.rollData.shieldMalus + "+" + this.rollData.attackModifier + "+" + this.rollData.appliedArmorMalus + "+" + effectModifier)
// Rebuild lits of applicable effects
let selectEffects = ""
for(let effect of this.rollData.bolApplicableEffects) {
selectEffects += `<option value="${effect.id}" selected>${effect.name}</option>`
}
$('#applicable-effects').html(selectEffects)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -226,20 +291,20 @@ export class BoLRoll {
let fgItem = rollData.fightOption let fgItem = rollData.fightOption
if (fgItem) { if (fgItem) {
console.log(fgItem) console.log(fgItem)
if (fgItem.data.properties.fightoptiontype == "armordefault") { if (fgItem.system.properties.fightoptiontype == "armordefault") {
rollData.modArmorMalus = rollData.armorMalus // Activate the armor malus rollData.modArmorMalus = rollData.armorMalus // Activate the armor malus
rollData.damagesIgnoresArmor = true rollData.damagesIgnoresArmor = true
} }
if (fgItem.data.properties.fightoptiontype == "intrepid") { if (fgItem.system.properties.fightoptiontype == "intrepid") {
rollData.attackModifier += 2 rollData.attackModifier += 2
} }
if (fgItem.data.properties.fightoptiontype == "defense") { if (fgItem.system.properties.fightoptiontype == "defense") {
rollData.attackModifier += -1 rollData.attackModifier += -1
} }
if (fgItem.data.properties.fightoptiontype == "attack") { if (fgItem.system.properties.fightoptiontype == "attack") {
rollData.attackModifier += 1 rollData.attackModifier += 1
} }
if (fgItem.data.properties.fightoptiontype == "twoweaponsdef" || fgItem.data.properties.fightoptiontype == "twoweaponsatt") { if (fgItem.system.properties.fightoptiontype == "twoweaponsdef" || fgItem.system.properties.fightoptiontype == "twoweaponsatt") {
rollData.attackModifier += -1 rollData.attackModifier += -1
} }
} }
@ -288,16 +353,18 @@ export class BoLRoll {
html.find('#attr').change((event) => { html.find('#attr').change((event) => {
let attrKey = event.currentTarget.value let attrKey = event.currentTarget.value
let actor = game.actors.get( this.rollData.actorId) let actor = BoLUtility.getActorFromRollData(this.rollData)
this.rollData.attribute = duplicate(actor.data.data.attributes[attrKey]) this.rollData.attribute = duplicate(actor.system.attributes[attrKey])
this.rollData.attrValue = actor.data.data.attributes[attrKey].value this.rollData.attrValue = actor.system.attributes[attrKey].value
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
this.updateTotalDice() this.updateTotalDice()
}) })
html.find('#apt').change((event) => { html.find('#apt').change((event) => {
let aptKey = event.currentTarget.value let aptKey = event.currentTarget.value
let actor = game.actors.get( this.rollData.actorId) let actor = BoLUtility.getActorFromRollData(this.rollData)
this.rollData.aptitude = duplicate(actor.data.data.aptitudes[aptKey]) this.rollData.aptitude = duplicate(actor.system.aptitudes[aptKey])
this.rollData.aptValue = actor.data.data.aptitudes[aptKey].value this.rollData.aptValue = actor.system.aptitudes[aptKey].value
this.rollData.bolApplicableEffects = this.updateApplicableEffects(this.rollData)
this.updateTotalDice() this.updateTotalDice()
}) })
@ -339,16 +406,20 @@ export class BoLRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
static preProcessWeapon(rollData, defender) { static preProcessWeapon(rollData, defender) {
if (rollData.mode == "weapon") { if (rollData.mode == "weapon") {
rollData.weaponModifier = rollData.weapon.data.properties.attackModifiers ?? 0; rollData.weaponModifier = rollData.weapon.system.properties.attackModifiers ?? 0
rollData.attackBonusDice = rollData.weapon.data.properties.attackBonusDice rollData.attackBonusDice = rollData.weapon.system.properties.attackBonusDice
if ( rollData.attackBonusDice) {
rollData.adv = "1B"
rollData.bDice = 1
}
if (defender) { // If target is selected if (defender) { // If target is selected
rollData.defence = defender.defenseValue rollData.defence = defender.defenseValue
rollData.armorMalus = defender.armorMalusValue rollData.armorMalus = defender.armorMalusValue
rollData.shieldBlock = 'none' rollData.shieldBlock = 'none'
let shields = defender.shields let shields = defender.shields
for (let shield of shields) { for (let shield of shields) {
rollData.shieldBlock = (shield.data.properties.blocking.blockingAll) ? 'blockall' : 'blockone'; rollData.shieldBlock = (shield.system.properties.blocking.blockingAll) ? 'blockall' : 'blockone';
rollData.shieldAttackMalus = (shield.data.properties.blocking.malus) ? shield.data.properties.blocking.malus : 1; rollData.shieldAttackMalus = (shield.system.properties.blocking.malus) ? shield.system.properties.blocking.malus : 1;
rollData.applyShieldMalus = false rollData.applyShieldMalus = false
} }
} }
@ -362,7 +433,7 @@ export class BoLRoll {
// initialize default flags/values // initialize default flags/values
const rollOptionTpl = `systems/bol/templates/dialogs/${rollData.mode}-roll-dialog.hbs` const rollOptionTpl = `systems/bol/templates/dialogs/${rollData.mode}-roll-dialog.hbs`
let actor = game.actors.get( rollData.actorId ) let actor = BoLUtility.getActorFromRollData(rollData)
let defender let defender
if ( rollData.targetId) { if ( rollData.targetId) {
let token = game.scenes.current.tokens.get(rollData.targetId) let token = game.scenes.current.tokens.get(rollData.targetId)
@ -424,17 +495,18 @@ export class BoLRoll {
ui.notifications.warn("Pas assez de Points de Pouvoir !") ui.notifications.warn("Pas assez de Points de Pouvoir !")
return return
} }
//console.log("ROLLMALUS", rollData)
rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? $('#register-init').is(":checked") : false; rollData.registerInit = (rollData.aptitude && rollData.aptitude.key == 'init') ? $('#register-init').is(":checked") : false;
const isMalus = rollData.mDice > 0 const isMalus = (rollData.bmDice < 0)
rollData.nbDice += (rollData.attackBonusDice) ? 1 : 0 //rollData.nbDice += (rollData.attackBonusDice) ? 1 : 0
let rollbase = rollData.attrValue + rollData.aptValue let rollbase = rollData.attrValue + rollData.aptValue
if ( rollData.weapon && rollData.weapon.data.properties.onlymodifier ) { if ( rollData.weapon && rollData.weapon.system.properties.onlymodifier ) {
rollbase = 0 rollbase = 0
} }
const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus const modifiers = rollbase + rollData.careerBonus + rollData.mod + rollData.weaponModifier - rollData.defence - rollData.modArmorMalus + rollData.shieldMalus + rollData.attackModifier + rollData.appliedArmorMalus + rollData.effectModifier
const formula = (isMalus) ? rollData.nbDice + "d6kl2 + " + modifiers : rollData.nbDice + "d6kh2 + " + modifiers const formula = (isMalus) ? rollData.nbDice + "d6kl2 + " + modifiers : rollData.nbDice + "d6kh2 + " + modifiers
rollData.formula = formula rollData.formula = formula
rollData.modifiers = modifiers rollData.modifiers = modifiers
@ -476,7 +548,7 @@ export class BoLDefaultRoll {
async roll() { async roll() {
const r = new Roll(this.rollData.formula) const r = new Roll(this.rollData.formula)
// console.log("Roll formula", this.rollData.formula) //console.log("Roll formula", this.rollData.formula)
await r.roll({ "async": false }) await r.roll({ "async": false })
const activeDice = r.terms[0].results.filter(r => r.active) const activeDice = r.terms[0].results.filter(r => r.active)
const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b) const diceTotal = activeDice.map(r => r.result).reduce((a, b) => a + b)
@ -488,14 +560,18 @@ export class BoLDefaultRoll {
this.rollData.isLegendary = false this.rollData.isLegendary = false
this.rollData.isFumble = (diceTotal === 2) this.rollData.isFumble = (diceTotal === 2)
this.rollData.isFailure = !this.rollData.isSuccess this.rollData.isFailure = !this.rollData.isSuccess
let actor = game.actors.get( this.rollData.actorId) //this.rollData.isRealCritical = true
//this.rollData.isFumble = true
let actor = BoLUtility.getActorFromRollData(this.rollData)
if (this.rollData.reroll == undefined) { if (this.rollData.reroll == undefined) {
this.rollData.reroll = actor.heroReroll() this.rollData.reroll = actor.heroReroll()
} }
if (this.rollData.registerInit) { if (this.rollData.registerInit) {
actor.registerInit(r.total, this.rollData.isCritical, this.rollData.isFumble) actor.registerInit(this.rollData)
this.rollData.initiativeRank = actor.getInitiativeRank(this.rollData)
} }
if (this.rollData.isSuccess && this.rollData.mode == "spell") { // PP cost management if (this.rollData.isSuccess && this.rollData.mode == "spell") { // PP cost management
this.rollData.remainingPP = actor.spendPowerPoint(this.rollData.ppCost + this.rollData.ppCostArmor) this.rollData.remainingPP = actor.spendPowerPoint(this.rollData.ppCost + this.rollData.ppCostArmor)
@ -503,13 +579,16 @@ export class BoLDefaultRoll {
if (this.rollData.mode == "alchemy") { // PP cost management if (this.rollData.mode == "alchemy") { // PP cost management
actor.resetAlchemyStatus(this.rollData.alchemy._id) actor.resetAlchemyStatus(this.rollData.alchemy._id)
} }
if ( this.rollData.mode == "bougette" && this.rollData.isFailure) {
actor.decBougette()
}
await this.sendChatMessage() await this.sendChatMessage()
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async sendChatMessage() { async sendChatMessage() {
let actor = game.actors.get( this.rollData.actorId) let actor = BoLUtility.getActorFromRollData(this.rollData)
this._buildChatMessage(this.rollData).then( async msgFlavor => { this._buildChatMessage(this.rollData).then( async msgFlavor => {
let msg = await this.rollData.roll.toMessage({ let msg = await this.rollData.roll.toMessage({
user: game.user.id, user: game.user.id,
@ -556,7 +635,7 @@ export class BoLDefaultRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
async sendDamageMessage() { async sendDamageMessage() {
let actor = game.actors.get( this.rollData.actorId) let actor = BoLUtility.getActorFromRollData(this.rollData)
this._buildDamageChatMessage(this.rollData).then(async msgFlavor => { this._buildDamageChatMessage(this.rollData).then(async msgFlavor => {
let msg = await this.rollData.damageRoll.toMessage({ let msg = await this.rollData.damageRoll.toMessage({
user: game.user.id, user: game.user.id,
@ -571,16 +650,8 @@ export class BoLDefaultRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
getDamageAttributeValue(attrDamage, actorId = undefined) { getDamageAttributeValue(attrDamage, actorId = undefined) {
let attrDamageValue = 0 let actor = BoLUtility.getActorFromRollData(this.rollData)
return actor.getDamageAttributeValue( attrDamage )
let actor = game.actors.get( (actorId) ? actorId: this.rollData.actorId)
if (attrDamage.includes("vigor")) {
attrDamageValue = actor.data.data.attributes.vigor.value
if (attrDamage.includes("half")) {
attrDamageValue = Math.floor(attrDamageValue / 2)
}
}
return attrDamageValue
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -598,8 +669,8 @@ export class BoLDefaultRoll {
if (this.rollData.damageMode == 'damage-plus-12') { if (this.rollData.damageMode == 'damage-plus-12') {
bonusDmg = 12 bonusDmg = 12
} }
let attrDamageValue = this.getDamageAttributeValue(this.rollData.weapon.data.properties.damageAttribute) let attrDamageValue = this.getDamageAttributeValue(this.rollData.weapon.system.properties.damageAttribute)
let weaponFormula = BoLUtility.getDamageFormula(this.rollData.weapon.data, this.rollData.fightOption) let weaponFormula = BoLUtility.getDamageFormula(this.rollData.weapon.system, this.rollData.fightOption)
let damageFormula = weaponFormula + "+" + bonusDmg + "+" + attrDamageValue let damageFormula = weaponFormula + "+" + bonusDmg + "+" + attrDamageValue
console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData) console.log("DAMAGE !!!", damageFormula, attrDamageValue, this.rollData)
@ -623,8 +694,8 @@ export class BoLDefaultRoll {
/* -------------------------------------------- */ /* -------------------------------------------- */
_buildChatMessage(rollData) { _buildChatMessage(rollData) {
const rollMessageTpl = 'systems/bol/templates/chat/rolls/default-roll-card.hbs'; const rollMessageTpl = 'systems/bol/templates/chat/rolls/default-roll-card.hbs'
return renderTemplate(rollMessageTpl, rollData); return renderTemplate(rollMessageTpl, rollData)
} }
} }

View File

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

View File

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

View File

@ -40,7 +40,7 @@ export class BoLCalendar extends Application {
constructor() { constructor() {
super(); super();
// position // position
this.calendarPos = duplicate(game.settings.get(SYSTEM_RDD, "calendar-pos")); this.calendarPos = duplicate(game.settings.get("bol", "calendar-pos"));
if (this.calendarPos == undefined || this.calendarPos.top == undefined) { if (this.calendarPos == undefined || this.calendarPos.top == undefined) {
this.calendrierPos = BoLCalendar.createCalendarPos() this.calendrierPos = BoLCalendar.createCalendarPos()
game.settings.set("bol", "calendar-pos", this.calendarPos) game.settings.set("bol", "calendar-pos", this.calendarPos)

View File

@ -0,0 +1,128 @@
/* -------------------------------------------- */
import { BoLUtility } from "./bol-utility.js";
import { BoLRoll } from "../controllers/bol-rolls.js";
/* -------------------------------------------- */
export class BoLCharacterSummary extends Application {
/* -------------------------------------------- */
static displayPCSummary(){
game.bol.charSummary.render(true)
}
/* -------------------------------------------- */
static createSummaryPos() {
return { top: 200, left: 200 };
}
/* -------------------------------------------- */
static ready() {
if ( !game.user.isGM ) { // Uniquement si GM
return
}
let charSummary = new BoLCharacterSummary()
game.bol.charSummary = charSummary
}
/* -------------------------------------------- */
constructor() {
super();
//game.settings.set("world", "character-summary-data", {npcList: [], x:0, y:0})
this.settings = game.settings.get("world", "character-summary-data")
}
/* -------------------------------------------- */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
template: "systems/bol/templates/apps/character-summary-template.html",
popOut: true,
resizable: true,
dragDrop: [{ dragSelector: ".items-list .item", dropSelector: null }],
classes: ["bol", "dialog"], width: 820, height: 'fit-content'
})
}
/* -------------------------------------------- */
getData() {
let formData = super.getData();
formData.pcs = game.actors.filter( ac => ac.type == "character" && ac.hasPlayerOwner )
formData.npcs = []
let newList = []
let toUpdate = false
for( let actorId of this.settings.npcList ) {
let actor = game.actors.get(actorId)
if (actor) {
formData.npcs.push( actor )
newList.push(actorId)
} else {
toUpdate = true
}
}
formData.config = game.bol.config
if ( toUpdate ) {
this.settings.npcList = newList
//console.log("Going to update ...", this.settings)
game.settings.set("world", "character-summary-data", this.settings)
}
return formData
}
/* -------------------------------------------- */
updateNPC() {
game.settings.set("world", "character-summary-data", game.bol.charSummary.settings)
game.bol.charSummary.close()
setTimeout( function() { game.bol.charSummary.render(true)}, 500)
}
/* -------------------------------------------- */
async _onDrop(event) {
//console.log("Dragged data are : ", dragData)
let data = event.dataTransfer.getData('text/plain')
let dataItem = JSON.parse( data)
let actor = fromUuidSync(dataItem.uuid)
if (actor) {
game.bol.charSummary.settings.npcList.push( actor.id )
game.bol.charSummary.updateNPC()
} else {
ui.notifications.warn( game.i18n.localize("BOL.ui.noactorfound") )
}
}
/* -------------------------------------------- */
/** @override */
async activateListeners(html) {
super.activateListeners(html);
html.find('.actor-open').click((event) => {
const li = $(event.currentTarget).parents(".item")
const actor = game.actors.get(li.data("actor-id"))
actor.sheet.render(true)
})
html.find('.summary-roll').click((event) => {
const li = $(event.currentTarget).parents(".item")
const actor = game.actors.get(li.data("actor-id"))
let type = $(event.currentTarget).data("type")
let key = $(event.currentTarget).data("key")
if ( type == "attribute") {
BoLRoll.attributeCheck(actor, key, event)
} else if (type == "aptitude") {
BoLRoll.aptitudeCheck(actor, key, event)
}
})
html.find('.actor-delete').click(event => {
const li = $(event.currentTarget).parents(".item");
let actorId = li.data("actor-id")
let newList = game.bol.charSummary.settings.npcList.filter(id => id != actorId)
game.bol.charSummary.settings.npcList = newList
game.bol.charSummary.updateNPC()
})
}
}

View File

@ -10,41 +10,22 @@ Init order =
3 - Echec critique 3 - Echec critique
*/ */
import { BoLUtility } from "../system/bol-utility.js";
export class BoLCombatManager extends Combat { export class BoLCombatManager extends Combat {
/************************************************************************************/ /************************************************************************************/
async rollInitiative(ids, formula = undefined, messageOptions = {}) { async rollInitiative(ids, formula = undefined, messageOptions = {}) {
console.log(`${game.data.system.data.title} | Combat.rollInitiative()`, ids, formula, messageOptions); console.log(`${game.system.title} | Combat.rollInitiative()`, ids, formula, messageOptions);
// Structure input data // Structure input data
ids = typeof ids === "string" ? [ids] : ids; ids = typeof ids === "string" ? [ids] : ids;
const currentId = this.combatant._id; //const currentId = this.combatant.id;
// calculate initiative // calculate initiative
for (let cId = 0; cId < ids.length; cId++) { for (let cId = 0; cId < ids.length; cId++) {
const combatant = this.combatants.get(ids[cId]); const combatant = this.combatants.get(ids[cId])
let fvttInit = 5 let fvttInit = combatant.actor.getInitiativeRank()
if (combatant.actor.type == 'character') {
let initData = combatant.actor.getLastInitData()
console.log("Init data !!!", initData)
if (initData.isLegendary) {
fvttInit = 10
} else if (initData.isCritical) {
fvttInit = 9
} else if (initData.lastinit >= 9) {
fvttInit = 8
} else if (initData.isFumble) {
fvttInit = 3
}
} else {
fvttInit = 4 // Pietaille par defaut
if ( combatant.actor.getSubtype == 'adversary') {
fvttInit = 7
}
if ( combatant.actor.getSubtype == 'tough') {
fvttInit = 6
}
}
fvttInit += (cId / 100) fvttInit += (cId / 100)
await this.updateEmbeddedDocuments("Combatant", [{ _id: ids[cId], initiative: fvttInit }]); await this.updateEmbeddedDocuments("Combatant", [{ _id: ids[cId], initiative: fvttInit }]);
} }

View File

@ -1,5 +1,6 @@
/* -------------------------------------------- */ /* -------------------------------------------- */
import { BoLAdventureGenerator } from "./bol-adventure-generator.js" import { BoLAdventureGenerator } from "./bol-adventure-generator.js"
import { BoLCharacterSummary } from "./bol-character-summary.js"
/* -------------------------------------------- */ /* -------------------------------------------- */
export class BoLCommands { export class BoLCommands {
@ -8,6 +9,7 @@ export class BoLCommands {
if (!game.bol.commands) { if (!game.bol.commands) {
const bolCommands = new BoLCommands() const bolCommands = new BoLCommands()
bolCommands.registerCommand({ path: ["/adventure"], func: (content, msg, params) => BoLAdventureGenerator.createAdventure(), descr: "Nouvelle idée d'aventure!" }); bolCommands.registerCommand({ path: ["/adventure"], func: (content, msg, params) => BoLAdventureGenerator.createAdventure(), descr: "Nouvelle idée d'aventure!" });
bolCommands.registerCommand({ path: ["/pcview"], func: (content, msg, params) => BoLCharacterSummary.displayPCSummary(), descr: "Affiche la liste des PJs!" });
game.bol.commands = bolCommands game.bol.commands = bolCommands
} }

View File

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

View File

@ -28,6 +28,13 @@ export class BoLUtility {
type: Boolean, type: Boolean,
onChange: lang => window.location.reload() onChange: lang => window.location.reload()
}) })
game.settings.register("world", "character-summary-data", {
name: "character-summary-data",
scope: "world",
config: false,
default: { npcList : [], x: 200, y: 200},
type: Object
})
game.settings.register("bol", "logoActorSheet", { game.settings.register("bol", "logoActorSheet", {
name: "Chemin du logo des fiches de perso", 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)", 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)",
@ -69,11 +76,24 @@ export class BoLUtility {
static getLogoTopLeft() { static getLogoTopLeft() {
return this.logoTopLeft return this.logoTopLeft
} }
/* -------------------------------------------- */
static getActorFromRollData(rollData) {
let actor = game.actors.get( rollData.actorId)
if (rollData.tokenId) {
let token = canvas.tokens.placeables.find(t => t.id == rollData.tokenId)
if (token) {
actor = token.actor
}
}
return actor
}
/* -------------------------------------------- */ /* -------------------------------------------- */
static async ready() { static async ready() {
//$("#logo").attr("src", this.getLogoTopLeft() ) //$("#logo").attr("src", this.getLogoTopLeft() )
$("#logo").css("content",`url(${this.getLogoTopLeft()})`) $("#logo").css("content", `url(${this.getLogoTopLeft()})`)
CONFIG.statusEffects = duplicate(game.bol.config.statusEffects)
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
@ -158,8 +178,8 @@ export class BoLUtility {
static getOtherWhisperRecipients(name) { static getOtherWhisperRecipients(name) {
let users = [] let users = []
for (let user of game.users) { for (let user of game.users) {
if (!user.isGM && user.name != name) { if ( !user.isGM && user.name != name) {
users.push(user.data._id) users.push(user.id)
} }
} }
return users return users
@ -271,7 +291,7 @@ export class BoLUtility {
let attackId = event.currentTarget.attributes['data-attack-id'].value let attackId = event.currentTarget.attributes['data-attack-id'].value
let defenseMode = event.currentTarget.attributes['data-defense-mode'].value let defenseMode = event.currentTarget.attributes['data-defense-mode'].value
let weaponId = (event.currentTarget.attributes['data-weapon-id']) ? event.currentTarget.attributes['data-weapon-id'].value : -1 let weaponId = (event.currentTarget.attributes['data-weapon-id']) ? event.currentTarget.attributes['data-weapon-id'].value : -1
// Remove message for all // Remove message for all
let msgId = BoLUtility.findChatMessageId(event.currentTarget) let msgId = BoLUtility.findChatMessageId(event.currentTarget)
if (game.user.isGM) { if (game.user.isGM) {
@ -287,7 +307,7 @@ export class BoLUtility {
if (!game.user.isGM) { if (!game.user.isGM) {
return return
} }
BoLUtility.removeChatMessageId( msgId ) BoLUtility.removeChatMessageId(msgId)
console.log("Damage Handling", attackId, defenseMode, weaponId) console.log("Damage Handling", attackId, defenseMode, weaponId)
// Only GM process this // Only GM process this
let attackDef = this.attackStore[attackId] let attackDef = this.attackStore[attackId]
@ -334,10 +354,10 @@ export class BoLUtility {
let defenderUser let defenderUser
for (let user of game.users) { for (let user of game.users) {
if ( user.character && user.character.id == defender.id ) { if (user.character && user.character.id == defender.id) {
defenderUser = user defenderUser = user
} }
} }
let damageResults = { let damageResults = {
attackId: attackDef.id, attackId: attackDef.id,
attacker: attackDef.attacker, attacker: attackDef.attacker,
@ -442,8 +462,8 @@ export class BoLUtility {
} }
// Build and send the defense message to the relevant people (ie GM + defender) // Build and send the defense message to the relevant people (ie GM + defender)
let defender = game.actors.get(attackDef.defenderId) let defender = game.actors.get(attackDef.defenderId)
let defenderWeapons = defender.weapons console.log("DEF WEP", attackDef, defender)
console.log("DEF WEP", attackDef) let defenderWeapons = defender.weapons || []
this.attackStore[attackDef.id] = attackDef // Store ! this.attackStore[attackDef.id] = attackDef // Store !
ChatMessage.create({ ChatMessage.create({
alias: defender.name, alias: defender.name,
@ -534,31 +554,29 @@ export class BoLUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async confirmDelete(actorSheet, li) { static async loadCompendiumData(compendium) {
let itemId = li.data("item-id"); const pack = game.packs.get(compendium);
let msgTxt = "<p>Are you sure to remove this Item ?"; return await pack?.getDocuments() ?? [];
let buttons = {
delete: {
icon: '<i class="fas fa-check"></i>',
label: "Yes, remove it",
callback: () => {
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
li.slideUp(200, () => actorSheet.render(false));
}
},
cancel: {
icon: '<i class="fas fa-times"></i>',
label: "Cancel"
}
}
msgTxt += "</p>";
let d = new Dialog({
title: "Confirm removal",
content: msgTxt,
buttons: buttons,
default: "cancel"
});
d.render(true);
} }
/* -------------------------------------------- */
static async loadCompendium(compendium, filter = item => true) {
let compendiumData = await this.loadCompendiumData(compendium);
return compendiumData.filter(filter);
}
/* -------------------------------------------- */
static async searchItem(dataItem) {
let item
if (dataItem.pack) {
let id = dataItem.id || dataItem._id
let items = await this.loadCompendium(dataItem.pack, item => item.id == id)
item = items[0] || undefined
} else {
item = game.items.get(dataItem.id)
}
return item
}
} }

View File

@ -25,6 +25,10 @@ BOL.damageMultiplier = {
"2": "x2", "2": "x2",
"3": "x3", "3": "x3",
"4": "x4", "4": "x4",
"5": "x5",
"6": "x6",
"7": "7",
"8": "x8"
} }
BOL.spellType = { BOL.spellType = {
@ -111,6 +115,14 @@ BOL.aptitudes = {
"def" : "BOL.aptitudes.def" "def" : "BOL.aptitudes.def"
} }
BOL.resources = {
"hp" : "BOL.resources.hp",
"hero" : "BOL.resources.hero",
"faith" : "BOL.resources.faith",
"power" : "BOL.resources.power",
"alchemypoints" : "BOL.resources.alchemypoints"
}
BOL.weaponSizes = { BOL.weaponSizes = {
"unarmed" : "BOL.weaponSize.unarmed", "unarmed" : "BOL.weaponSize.unarmed",
"improvised" : "BOL.weaponSize.improvised", "improvised" : "BOL.weaponSize.improvised",
@ -131,6 +143,7 @@ BOL.itemCategories = {
"spell" : "BOL.itemCategory.spell", "spell" : "BOL.itemCategory.spell",
"alchemy" : "BOL.itemCategory.alchemy", "alchemy" : "BOL.itemCategory.alchemy",
"vehicle" : "BOL.itemCategory.vehicle", "vehicle" : "BOL.itemCategory.vehicle",
"vehicleweapon": "BOL.itemCategory.vehicleweapon",
"other" : "BOL.itemCategory.other" "other" : "BOL.itemCategory.other"
} }
@ -255,7 +268,8 @@ BOL.featureSubtypes = {
"flaw" : "BOL.featureSubtypes.flaw", "flaw" : "BOL.featureSubtypes.flaw",
"language" : "BOL.featureSubtypes.language", "language" : "BOL.featureSubtypes.language",
"godsfaith" : "BOL.featureSubtypes.gods", "godsfaith" : "BOL.featureSubtypes.gods",
"fightoption" : "BOL.featureSubtypes.fightOption" "fightoption" : "BOL.featureSubtypes.fightOption",
"boleffect": "BOL.featureSubtypes.effect",
} }
BOL.fightOptionTypes = { BOL.fightOptionTypes = {
@ -283,11 +297,18 @@ BOL.actorIcons = {
} }
BOL.bougetteState = { BOL.bougetteState = {
"nomoney": "BOL.bougette.nomoney", "0": "BOL.bougette.nomoney",
"tolive": "BOL.bougette.tolive", "1": "BOL.bougette.tolive",
"easylife": "BOL.bougette.easylife", "2": "BOL.bougette.easylife",
"luxury": "BOL.bougette.luxury", "3": "BOL.bougette.luxury",
"rich": "BOL.bougette.rich" "4": "BOL.bougette.rich"
}
BOL.bougetteDice = {
"0": "0",
"1": "2d6-1",
"2": "2d6",
"3": "2d6+1",
"4": "2d6+2"
} }
BOL.creatureSize = { BOL.creatureSize = {
@ -305,4 +326,129 @@ BOL.creatureSize = {
"colossal": "BOL.size.colossal" "colossal": "BOL.size.colossal"
} }
BOL.bolEffectModifier = {
"-8": "-8",
"-6": "-6",
"-4": "-4",
"-2": "-2",
"-1": "-1",
"1B": "1B",
"2B": "2B",
"1M": "1M",
"2M": "2M",
"+1": "+1",
"+2": "+2",
"+4": "+4",
"+6": "+6",
"+8": "+8",
}
BOL.statusEffects = [
{
"id": "dead",
"label": "EFFECT.StatusDead",
"icon": "icons/svg/skull.svg"
},
{
"id": "unconscious",
"label": "EFFECT.StatusUnconscious",
"icon": "icons/svg/unconscious.svg"
},
{
"id": "sleep",
"label": "EFFECT.StatusAsleep",
"icon": "icons/svg/sleep.svg"
},
{
"id": "stun",
"label": "EFFECT.StatusStunned",
"icon": "icons/svg/daze.svg"
},
{
"id": "prone",
"label": "EFFECT.StatusProne",
"icon": "icons/svg/falling.svg"
},
{
"id": "restrain",
"label": "EFFECT.StatusRestrained",
"icon": "icons/svg/net.svg"
},
{
"id": "paralysis",
"label": "EFFECT.StatusParalysis",
"icon": "icons/svg/paralysis.svg"
},
{
"id": "fly",
"label": "EFFECT.StatusFlying",
"icon": "icons/svg/wing.svg"
},
{
"id": "blind",
"label": "EFFECT.StatusBlind",
"icon": "icons/svg/blind.svg"
},
{
"id": "deaf",
"label": "EFFECT.StatusDeaf",
"icon": "icons/svg/deaf.svg"
},
{
"id": "silence",
"label": "EFFECT.StatusSilenced",
"icon": "icons/svg/silenced.svg"
},
{
"id": "fear",
"label": "EFFECT.StatusFear",
"icon": "icons/svg/terror.svg"
},
{
"id": "burning",
"label": "EFFECT.StatusBurning",
"icon": "icons/svg/fire.svg"
},
{
"id": "frozen",
"label": "EFFECT.StatusFrozen",
"icon": "icons/svg/frozen.svg"
},
{
"id": "shock",
"label": "EFFECT.StatusShocked",
"icon": "icons/svg/lightning.svg"
},
{
"id": "disease",
"label": "EFFECT.StatusDisease",
"icon": "icons/svg/biohazard.svg"
},
{
"id": "poison",
"label": "EFFECT.StatusPoison",
"icon": "icons/svg/poison.svg"
},
{
"id": "curse",
"label": "EFFECT.StatusCursed",
"icon": "icons/svg/sun.svg"
},
{
"id": "invisible",
"label": "EFFECT.StatusInvisible",
"icon": "icons/svg/invisible.svg"
},
{
"id": "target",
"label": "EFFECT.StatusTarget",
"icon": "icons/svg/target.svg"
},
{
"id": "eye",
"label": "EFFECT.StatusMarked",
"icon": "icons/svg/eye.svg"
}
]
BOL.debug = false; BOL.debug = false;

View File

@ -103,6 +103,12 @@ export const registerHandlebarsHelpers = function () {
Handlebars.registerHelper('sub', function (a, b) { Handlebars.registerHelper('sub', function (a, b) {
return parseInt(a) - parseInt(b); return parseInt(a) - parseInt(b);
}) })
Handlebars.registerHelper('abbrev2', function (a) {
return a.substring(0,2);
})
Handlebars.registerHelper('abbrev3', function (a) {
return a.substring(0,3);
})
Handlebars.registerHelper('valueAtIndex', function (arr, idx) { Handlebars.registerHelper('valueAtIndex', function (arr, idx) {
return arr[idx]; return arr[idx];
}) })

View File

@ -75,4 +75,18 @@ export default function registerHooks() {
} }
return false; return false;
}); });
/********************************************************************************** */
Hooks.on("renderActorDirectory", (app, html, data) => {
if (game.user.isGM) {
const button = document.createElement('button');
button.style.width = '95%';
button.innerHTML = game.i18n.localize("BOL.ui.pclistbutton")
button.addEventListener('click', () => {
game.bol.charSummary.render(true)
})
html.find('.header-actions').after(button)
}
})
} }

View File

@ -18,6 +18,9 @@ export const preloadHandlebarsTemplates = async function () {
"systems/bol/templates/actor/parts/tabs/actor-biodata.hbs", "systems/bol/templates/actor/parts/tabs/actor-biodata.hbs",
"systems/bol/templates/actor/parts/tabs/creature-stats.hbs", "systems/bol/templates/actor/parts/tabs/creature-stats.hbs",
"systems/bol/templates/actor/parts/tabs/creature-actions.hbs", "systems/bol/templates/actor/parts/tabs/creature-actions.hbs",
"systems/bol/templates/actor/parts/tabs/vehicle-stats.hbs",
"systems/bol/templates/actor/parts/tabs/vehicle-description.hbs",
"systems/bol/templates/actor/parts/tabs/vehicle-weapons.hbs",
// ITEMS // ITEMS
"systems/bol/templates/item/parts/item-header.hbs", "systems/bol/templates/item/parts/item-header.hbs",
"systems/bol/templates/item/parts/properties/feature-properties.hbs", "systems/bol/templates/item/parts/properties/feature-properties.hbs",
@ -33,9 +36,11 @@ export const preloadHandlebarsTemplates = async function () {
"systems/bol/templates/item/parts/properties/feature/career-properties.hbs", "systems/bol/templates/item/parts/properties/feature/career-properties.hbs",
"systems/bol/templates/item/parts/properties/feature/boon-properties.hbs", "systems/bol/templates/item/parts/properties/feature/boon-properties.hbs",
"systems/bol/templates/item/parts/properties/feature/flaw-properties.hbs", "systems/bol/templates/item/parts/properties/feature/flaw-properties.hbs",
"systems/bol/templates/item/parts/properties/feature/effect-properties.hbs",
"systems/bol/templates/item/parts/properties/feature/origin-properties.hbs", "systems/bol/templates/item/parts/properties/feature/origin-properties.hbs",
"systems/bol/templates/item/parts/properties/feature/race-properties.hbs", "systems/bol/templates/item/parts/properties/feature/race-properties.hbs",
"systems/bol/templates/item/parts/properties/feature/fightoption-properties.hbs", "systems/bol/templates/item/parts/properties/feature/fightoption-properties.hbs",
"systems/bol/templates/item/parts/properties/item/weapon-vehicle-properties.hbs",
// DIALOGS // DIALOGS
"systems/bol/templates/chat/rolls/attack-damage-card.hbs", "systems/bol/templates/chat/rolls/attack-damage-card.hbs",
@ -46,6 +51,7 @@ export const preloadHandlebarsTemplates = async function () {
"systems/bol/templates/dialogs/mod-roll-part.hbs", "systems/bol/templates/dialogs/mod-roll-part.hbs",
"systems/bol/templates/dialogs/adv-roll-part.hbs", "systems/bol/templates/dialogs/adv-roll-part.hbs",
"systems/bol/templates/dialogs/career-roll-part.hbs", "systems/bol/templates/dialogs/career-roll-part.hbs",
"systems/bol/templates/dialogs/effect-roll-part.hbs",
"systems/bol/templates/dialogs/boons-roll-part.hbs", "systems/bol/templates/dialogs/boons-roll-part.hbs",
"systems/bol/templates/dialogs/flaws-roll-part.hbs", "systems/bol/templates/dialogs/flaws-roll-part.hbs",
"systems/bol/templates/dialogs/total-roll-part.hbs", "systems/bol/templates/dialogs/total-roll-part.hbs",

File diff suppressed because one or more lines are too long

4
packs/effets-exemples.db Normal file
View File

@ -0,0 +1,4 @@
{"name":"Vigueur -1","type":"feature","img":"icons/consumables/potions/bottle-conical-corked-labeled-skull-poison-green.webp","system":{"category":null,"subtype":"boleffect","description":"","properties":{"ismalusdice":false,"bonusmalus":-2,"identifier":"system.attributes.vigor","modifier":"-1"},"rank":0},"effects":[],"flags":{"core":{"sourceId":"Item.6fTZ6hOKR4pWbWOe"}},"_stats":{"systemId":"bol","systemVersion":"10.3.3","coreVersion":"10.290","createdTime":1669218607632,"modifiedTime":1669234720255,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"6fTZ6hOKR4pWbWOe","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"Esprit -1","type":"feature","img":"icons/consumables/potions/bottle-conical-corked-labeled-skull-poison-green.webp","system":{"category":null,"subtype":"boleffect","description":"","properties":{"ismalusdice":false,"bonusmalus":-2,"identifier":"system.attributes.mind","modifier":"-1"},"rank":0},"effects":[],"flags":{"core":{"sourceId":"Item.6fTZ6hOKR4pWbWOe"}},"_stats":{"systemId":"bol","systemVersion":"10.3.3","coreVersion":"10.290","createdTime":1669218607632,"modifiedTime":1669234720255,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"V2geomwPtTBnBeQW","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"Agilité -1","type":"feature","img":"icons/consumables/potions/bottle-conical-corked-labeled-skull-poison-green.webp","system":{"category":null,"subtype":"boleffect","description":"","properties":{"ismalusdice":false,"bonusmalus":-2,"identifier":"system.attributes.agility","modifier":"-1"},"rank":0},"effects":[],"flags":{"core":{"sourceId":"Item.6fTZ6hOKR4pWbWOe"}},"_stats":{"systemId":"bol","systemVersion":"10.3.3","coreVersion":"10.290","createdTime":1669218607632,"modifiedTime":1669234720255,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"eXPNwGQiwnIiGYaK","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"Aura -1","type":"feature","img":"icons/consumables/potions/bottle-conical-corked-labeled-skull-poison-green.webp","system":{"category":null,"subtype":"boleffect","description":"","properties":{"ismalusdice":false,"bonusmalus":-2,"identifier":"system.attributes.appeal","modifier":"-1"},"rank":0},"effects":[],"flags":{"core":{"sourceId":"Item.6fTZ6hOKR4pWbWOe"}},"_stats":{"systemId":"bol","systemVersion":"10.3.3","coreVersion":"10.290","createdTime":1669218607632,"modifiedTime":1669234720256,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"zwSNMO9HpiqUCMt8","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}

View File

@ -1,4 +1,4 @@
{"_id":"19p4FnLRVdw6cx7Y","name":"Arbalète","type":"item","img":"icons/weapons/crossbows/crossbow-blue.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Arbalète</h1><p>une arme de tir qui nécessite peu dentraînement et offre beaucoup de puissance. Les lourds projectiles tirés par une arbalète portent le nom de carreaux. Il faut un round complet pour charger une arbalète.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":true,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"2h":true,"damage":"d6","range":30,"reload":1,"slot":"2hands","attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"damageAttribute":"half-vigor","damageModifiers":null,"damageReroll1":false,"weaponSize":"medium","attackBonusDice":false,"damageMultiplier":"1"},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"19p4FnLRVdw6cx7Y","name":"Arbalète","type":"item","img":"icons/weapons/crossbows/crossbow-blue.webp","effects":[],"folder":null,"sort":0,"flags":{},"system":{"category":"equipment","subtype":"weapon","description":"<h1>Arbalète</h1><p>une arme de tir qui nécessite peu dentraînement et offre beaucoup de puissance. Les lourds projectiles tirés par une arbalète portent le nom de carreaux. Il faut un round complet pour charger une arbalète.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":true,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"2h":true,"damage":"d6","range":30,"reload":1,"slot":"2hands","attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"damageAttribute":"half-vigor","damageModifiers":null,"damageReroll1":false,"weaponSize":"medium","attackBonusDice":false,"damageMultiplier":"1","natural":false,"onlymodifier":false},"quantity":null,"weight":null,"price":0,"worn":false},"ownership":{"default":0,"EEnCVoPAR7pMjRym":3},"_stats":{"systemId":"bol","systemVersion":"10.3.2","coreVersion":"10.290","createdTime":null,"modifiedTime":1669209273712,"lastModifiedBy":"zN9ZZg5J7XzNELjd"}}
{"_id":"3U9Gl7g8D5Ih72HQ","name":"Hache","type":"item","img":"icons/weapons/axes/axe-broad-engraved.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Hache</h1><p>un fer à un ou deux tranchants (qui peut être en bronze, en fer ou en acier) monté sur un manche en bois.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"medium","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"3U9Gl7g8D5Ih72HQ","name":"Hache","type":"item","img":"icons/weapons/axes/axe-broad-engraved.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Hache</h1><p>un fer à un ou deux tranchants (qui peut être en bronze, en fer ou en acier) monté sur un manche en bois.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"medium","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"3UUZjuD4Esgj4ENP","name":"Épée","type":"item","img":"icons/weapons/swords/greatsword-guard-gem-blue.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Épée</h1><p>larme favorite des héros. Elle se décline en différents modèles utilisés un peu partout en Lémurie, comme les sabres dabordage, les tulwars, les cimeterres ou les épées longues. Inscrivez le nom de larme que vous voulez sur la fiche de votre personnage en fonction de limage que vous vous faites de ce dernier. Mais au final, une épée reste une longue lame utilisée pour tuer lennemi.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"light","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"3UUZjuD4Esgj4ENP","name":"Épée","type":"item","img":"icons/weapons/swords/greatsword-guard-gem-blue.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Épée</h1><p>larme favorite des héros. Elle se décline en différents modèles utilisés un peu partout en Lémurie, comme les sabres dabordage, les tulwars, les cimeterres ou les épées longues. Inscrivez le nom de larme que vous voulez sur la fiche de votre personnage en fonction de limage que vous vous faites de ce dernier. Mais au final, une épée reste une longue lame utilisée pour tuer lennemi.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"light","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"3xSSlnw9CDhwg67c","name":"Lance","type":"item","img":"icons/weapons/polearms/glaive-simple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Lance</h1><p>une hampe de bois de 1,80 m de long (parfois davantage), pourvue dune pointe, qui peut être lancée ou utilisée au corps à corps, notamment contre des adversaires montés.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":6,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"medium","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"3xSSlnw9CDhwg67c","name":"Lance","type":"item","img":"icons/weapons/polearms/glaive-simple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Lance</h1><p>une hampe de bois de 1,80 m de long (parfois davantage), pourvue dune pointe, qui peut être lancée ou utilisée au corps à corps, notamment contre des adversaires montés.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":6,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"medium","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
@ -6,6 +6,8 @@
{"_id":"4GyTrBGnvlyqoh38","name":"Dague","type":"item","img":"icons/weapons/daggers/dagger-jeweled-purple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Dague</h1><p>cette catégorie regroupe toutes les lames courtes destinées à lacérer ou poignarder un adversaire. Les dagues sont à un ou deux tranchants selon les modèles, et peuvent être lancées aussi bien quutilisées au corps à corps. Facilement dissimulable, la dague est larme favorite des truands et des assassins.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":true,"activable":false,"concealable":true,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6M","slot":"none","stacksize":null,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"light","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"4GyTrBGnvlyqoh38","name":"Dague","type":"item","img":"icons/weapons/daggers/dagger-jeweled-purple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Dague</h1><p>cette catégorie regroupe toutes les lames courtes destinées à lacérer ou poignarder un adversaire. Les dagues sont à un ou deux tranchants selon les modèles, et peuvent être lancées aussi bien quutilisées au corps à corps. Facilement dissimulable, la dague est larme favorite des truands et des assassins.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":true,"activable":false,"concealable":true,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6M","slot":"none","stacksize":null,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"light","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"4NEaikxe0k1vzeqI","name":"Morgenstern","type":"item","img":"icons/weapons/maces/flail-spiked-grey.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Morgenstern</h1><p>une grosse boule de métal hérissée de pointes, montée à lextrémité dune longue hampe de 1,20 à 1,50 m de long. Rudimentaire, mais efficace.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6B","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"heavy","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"4NEaikxe0k1vzeqI","name":"Morgenstern","type":"item","img":"icons/weapons/maces/flail-spiked-grey.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Morgenstern</h1><p>une grosse boule de métal hérissée de pointes, montée à lextrémité dune longue hampe de 1,20 à 1,50 m de long. Rudimentaire, mais efficace.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6B","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"heavy","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"name":"Lance (Lancer)","type":"item","img":"icons/weapons/polearms/glaive-simple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Lance</h1><p>une hampe de bois de 1,80 m de long (parfois davantage), pourvue dune pointe, qui peut être lancée ou utilisée au corps à corps, notamment contre des adversaires montés.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":6,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"medium","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Compendium.bol.equipment.3xSSlnw9CDhwg67c"}},"_id":"4k3SUYYCnqc9uNCm"} {"name":"Lance (Lancer)","type":"item","img":"icons/weapons/polearms/glaive-simple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Lance</h1><p>une hampe de bois de 1,80 m de long (parfois davantage), pourvue dune pointe, qui peut être lancée ou utilisée au corps à corps, notamment contre des adversaires montés.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":6,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"medium","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Compendium.bol.equipment.3xSSlnw9CDhwg67c"}},"_id":"4k3SUYYCnqc9uNCm"}
{"name":"Projectiles","type":"item","img":"icons/weapons/artillery/ballista-wood-green.webp","system":{"category":"vehicleweapon","subtype":"armor","description":"<p>L&rsquo;&eacute;quipage du navire envoie une vol&eacute;e de projectiles (javelines, fl&egrave;ches, billes de fronde) sur le vaisseau ennemi, &agrave; condition que ce dernier se trouve au maximum &agrave; port&eacute;e Longue.</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,"isfiredamage":false,"ishulldamage":false,"iscrewdamage":true,"hulldamage":"d6","hullDamageMultiplier":"1","crewdamage":"d6","crewDamageMultiplier":"1"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"flags":{},"_stats":{"systemId":"bol","systemVersion":"10.2.1","coreVersion":"10.287","createdTime":1665332723905,"modifiedTime":1665384335829,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"55CWxwKSYgBCbLrG","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"Cimeterre","type":"item","img":"icons/weapons/swords/scimitar-guard-red.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.bol.equipment.3UUZjuD4Esgj4ENP"}},"system":{"category":"equipment","subtype":"weapon","description":"<h1>Épée</h1><p>larme favorite des héros. Elle se décline en différents modèles utilisés un peu partout en Lémurie, comme les sabres dabordage, les tulwars, les cimeterres ou les épées longues. Inscrivez le nom de larme que vous voulez sur la fiche de votre personnage en fonction de limage que vous vous faites de ce dernier. Mais au final, une épée reste une longue lame utilisée pour tuer lennemi.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"light","damageAttribute":"vigor","damageModifiers":1,"damageMultiplier":"1","damageReroll1":false,"natural":false,"onlymodifier":false},"quantity":null,"weight":null,"price":0,"worn":false},"ownership":{"default":0,"EEnCVoPAR7pMjRym":3,"zN9ZZg5J7XzNELjd":3},"_stats":{"systemId":"bol","systemVersion":"10.3.2","coreVersion":"10.290","createdTime":1669206284323,"modifiedTime":1669206324202,"lastModifiedBy":"zN9ZZg5J7XzNELjd"},"folder":null,"sort":0,"_id":"9WkrG0m6w04nq2CG"}
{"name":"Massue (Lancer)","type":"item","img":"icons/weapons/clubs/club-simple-stone-purple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Massue</h1><p>la version lourde du gourdin. Une massue consiste en un solide manche en bois dont lextrémité, plus volumineuse, sert à fracasser le crâne de ses adversaires, doù son autre nom de casse-tête.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":true,"range":3,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"medium","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Compendium.bol.equipment.pncWIrD5z7mk6dbc"}},"_id":"9dk1DqMpZXCgvS2r"} {"name":"Massue (Lancer)","type":"item","img":"icons/weapons/clubs/club-simple-stone-purple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Massue</h1><p>la version lourde du gourdin. Une massue consiste en un solide manche en bois dont lextrémité, plus volumineuse, sert à fracasser le crâne de ses adversaires, doù son autre nom de casse-tête.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":true,"range":3,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"medium","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Compendium.bol.equipment.pncWIrD5z7mk6dbc"}},"_id":"9dk1DqMpZXCgvS2r"}
{"_id":"9mDDJnPsOCZRGPJN","name":"Gourdin","type":"item","img":"icons/weapons/clubs/club-barbed-square-black.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Gourdin</h1><p>cest larme la plus rudimentaire qui soit. Un gourdin consiste généralement en un bâton de bois noueux, extrêmement dur et mesurant moins de 90 cm de long. Par commodité, on regroupe sous ce terme toute autre arme contondante du même genre (matraque, etc.). Il est possible dutiliser un gourdin pour infliger des dégâts non létaux et assommer son ennemi plutôt que de le tuer.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":true,"damage":"d6M","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"light","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"9mDDJnPsOCZRGPJN","name":"Gourdin","type":"item","img":"icons/weapons/clubs/club-barbed-square-black.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Gourdin</h1><p>cest larme la plus rudimentaire qui soit. Un gourdin consiste généralement en un bâton de bois noueux, extrêmement dur et mesurant moins de 90 cm de long. Par commodité, on regroupe sous ce terme toute autre arme contondante du même genre (matraque, etc.). Il est possible dutiliser un gourdin pour infliger des dégâts non létaux et assommer son ennemi plutôt que de le tuer.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":true,"damage":"d6M","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"light","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"AMDFMOvMhdapUJJF","name":"Dague (Lancer)","type":"item","img":"icons/weapons/daggers/dagger-jeweled-purple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Dague</h1><p>cette catégorie regroupe toutes les lames courtes destinées à lacérer ou poignarder un adversaire. Les dagues sont à un ou deux tranchants selon les modèles, et peuvent être lancées aussi bien quutilisées au corps à corps. Facilement dissimulable, la dague est larme favorite des truands et des assassins.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":true,"activable":false,"concealable":true,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6M","slot":"none","stacksize":null,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"light","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Compendium.bol.equipment.4GyTrBGnvlyqoh38"}}} {"_id":"AMDFMOvMhdapUJJF","name":"Dague (Lancer)","type":"item","img":"icons/weapons/daggers/dagger-jeweled-purple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Dague</h1><p>cette catégorie regroupe toutes les lames courtes destinées à lacérer ou poignarder un adversaire. Les dagues sont à un ou deux tranchants selon les modèles, et peuvent être lancées aussi bien quutilisées au corps à corps. Facilement dissimulable, la dague est larme favorite des truands et des assassins.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":true,"activable":false,"concealable":true,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6M","slot":"none","stacksize":null,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"light","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Compendium.bol.equipment.4GyTrBGnvlyqoh38"}}}
@ -15,16 +17,22 @@
{"name":"Masse darmes (Lancer)","type":"item","img":"icons/weapons/maces/mace-flanged-steel.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Masse darmes</h1><p>cette arme a la même forme quun gourdin, mais possède une tête en métal, souvent agrémentée de pointes ou dailettes pour plus defficacité. Les masses darmes à une main peuvent se lancer, mais à courte distance, car elles ne sont pas vraiment prévues pour cet usage.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":1.5,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"medium","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Compendium.bol.equipment.AUqk1SXktM4iDXvr"}},"_id":"BcYQ4pigZSXp1jWb"} {"name":"Masse darmes (Lancer)","type":"item","img":"icons/weapons/maces/mace-flanged-steel.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Masse darmes</h1><p>cette arme a la même forme quun gourdin, mais possède une tête en métal, souvent agrémentée de pointes ou dailettes pour plus defficacité. Les masses darmes à une main peuvent se lancer, mais à courte distance, car elles ne sont pas vraiment prévues pour cet usage.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":1.5,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"medium","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Compendium.bol.equipment.AUqk1SXktM4iDXvr"}},"_id":"BcYQ4pigZSXp1jWb"}
{"_id":"D1UjDptdZGFg6Ggx","name":"Hache (Lancer)","type":"item","img":"icons/weapons/axes/axe-broad-engraved.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Hache</h1><p>un fer à un ou deux tranchants (qui peut être en bronze, en fer ou en acier) monté sur un manche en bois.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"medium","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Compendium.bol.equipment.3U9Gl7g8D5Ih72HQ"}}} {"_id":"D1UjDptdZGFg6Ggx","name":"Hache (Lancer)","type":"item","img":"icons/weapons/axes/axe-broad-engraved.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Hache</h1><p>un fer à un ou deux tranchants (qui peut être en bronze, en fer ou en acier) monté sur un manche en bois.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"medium","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"kQghu0tL1dft5xLu":3},"flags":{"core":{"sourceId":"Compendium.bol.equipment.3U9Gl7g8D5Ih72HQ"}}}
{"_id":"E8XHWMpwVHjPZV3M","name":"Hâche à deux mains","type":"item","img":"icons/weapons/axes/axe-double-brown.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Hâche à deux mains</h1><p>Une lourde hache sutilisant à deux mains.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6B","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"heavy","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"E8XHWMpwVHjPZV3M","name":"Hâche à deux mains","type":"item","img":"icons/weapons/axes/axe-double-brown.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Hâche à deux mains</h1><p>Une lourde hache sutilisant à deux mains.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6B","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"heavy","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"name":"Kriss","type":"item","img":"icons/weapons/daggers/dagger-jeweled-purple.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.bol.equipment.4GyTrBGnvlyqoh38"}},"system":{"category":"equipment","subtype":"weapon","description":"<h1>Dague</h1><p>cette catégorie regroupe toutes les lames courtes destinées à lacérer ou poignarder un adversaire. Les dagues sont à un ou deux tranchants selon les modèles, et peuvent être lancées aussi bien quutilisées au corps à corps. Facilement dissimulable, la dague est larme favorite des truands et des assassins.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":true,"activable":false,"concealable":true,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6M","slot":"none","stacksize":null,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"light","damageAttribute":"vigor","damageModifiers":1,"damageMultiplier":"1","damageReroll1":false,"natural":false,"onlymodifier":false},"quantity":null,"weight":null,"price":0,"worn":true},"ownership":{"default":0,"EEnCVoPAR7pMjRym":3,"zN9ZZg5J7XzNELjd":3},"_stats":{"systemId":"bol","systemVersion":"10.3.2","coreVersion":"10.290","createdTime":1662130019228,"modifiedTime":1669197345576,"lastModifiedBy":"zN9ZZg5J7XzNELjd"},"folder":null,"sort":0,"_id":"EbvPPc9hFGudZYeP"}
{"name":"Catapulte (Pierre)","type":"item","img":"icons/weapons/artillery/catapult-simple.webp","system":{"category":"vehicleweapon","subtype":"armor","description":"<p>Les catapultes peuvent tirer des pierres ou des pots de goudron enflamm&eacute; jusqu&rsquo;&agrave; une port&eacute;e<br>Extr&ecirc;me. Les pierres font des d&eacute;g&acirc;ts &agrave; la coque et au gr&eacute;ement du navire, mais peuvent aussi<br>tuer des matelots. Un pot &agrave; feu qui explose sur le pont arrose la coque et l&rsquo;&eacute;quipage de goudron<br>enflamm&eacute;, qui continue &agrave; br&ucirc;ler jusqu&rsquo;&agrave; ce que l&rsquo;incendie soit ma&icirc;tris&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,"isfiredamage":false,"ishulldamage":true,"iscrewdamage":true,"hulldamage":"d6","hullDamageMultiplier":"1","crewdamage":"d3","crewDamageMultiplier":"1"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"flags":{},"_stats":{"systemId":"bol","systemVersion":"10.2.1","coreVersion":"10.287","createdTime":1665332723905,"modifiedTime":1665384335828,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"FEEgNQr54HLmbxb4","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"_id":"G0qpJmjQPSJshPsC","name":"Bâton-Fronde","type":"item","img":"icons/weapons/slings/slingshot-wood.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Bâton-Fronde</h1><p>Version plus puissante de la fronde, montée au bout dun bâton (ce qui en fait une arme à deux mains), qui permet des tirs à plus longue portée.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":true,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"2h":true,"damage":"d6M","range":18,"reload":0,"slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"light","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"G0qpJmjQPSJshPsC","name":"Bâton-Fronde","type":"item","img":"icons/weapons/slings/slingshot-wood.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Bâton-Fronde</h1><p>Version plus puissante de la fronde, montée au bout dun bâton (ce qui en fait une arme à deux mains), qui permet des tirs à plus longue portée.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":true,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"2h":true,"damage":"d6M","range":18,"reload":0,"slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"light","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"Gm8Qpfuay4hu2ihq","name":"Grand bouclier","type":"item","img":"icons/equipment/shield/wardoor-wooden-boss-brown.webp","data":{"category":"equipment","subtype":"shield","description":"<h1>Grand bouclier</h1><p>Un personnage ne peut bénéficier de son bouclier que sil est conscient de lattaque qui le vise, et donc sil est prêt à la parer.</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":true,"weapon":false,"armor":false,"helm":false,"shield":true,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"modifiers":{"agility":-1,"init":0,"powercost":0,"social":false},"blocking":{"malus":-1,"nbAttacksPerRound":"1","blocking1":false,"blockingAll":true},"slot":"none"},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"Gm8Qpfuay4hu2ihq","name":"Grand bouclier","type":"item","img":"icons/equipment/shield/wardoor-wooden-boss-brown.webp","data":{"category":"equipment","subtype":"shield","description":"<h1>Grand bouclier</h1><p>Un personnage ne peut bénéficier de son bouclier que sil est conscient de lattaque qui le vise, et donc sil est prêt à la parer.</p>","properties":{"ranged":false,"melee":false,"spell":false,"protection":true,"weapon":false,"armor":false,"helm":false,"shield":true,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"modifiers":{"agility":-1,"init":0,"powercost":0,"social":false},"blocking":{"malus":-1,"nbAttacksPerRound":"1","blocking1":false,"blockingAll":true},"slot":"none"},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"name":"Outils de Crochetage","type":"item","img":"icons/sundries/misc/key-angular-white.webp","data":{"category":"equipment","subtype":"other","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"HZpsorw1Okd07bvh"} {"name":"Outils de Crochetage","type":"item","img":"icons/sundries/misc/key-angular-white.webp","data":{"category":"equipment","subtype":"other","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"HZpsorw1Okd07bvh"}
{"_id":"LDklxAUh1IPNPnyi","name":"Mains Nues","type":"item","img":"icons/skills/melee/unarmed-punch-fist.webp","data":{"category":"equipment","subtype":"weapon","description":"","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"concealable":false,"ignoreshield":false,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"unarmed","damage":"d3","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false,"bashing":true,"throwable":false},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.BSoDfbLMBtwZllDb"}}} {"_id":"LDklxAUh1IPNPnyi","name":"Mains Nues","type":"item","img":"icons/skills/melee/unarmed-punch-fist.webp","data":{"category":"equipment","subtype":"weapon","description":"","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"concealable":false,"ignoreshield":false,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"unarmed","damage":"d3","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false,"bashing":true,"throwable":false},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.BSoDfbLMBtwZllDb"}}}
{"name":"Corde + Grappin","type":"item","img":"icons/sundries/survival/rope-wrapped-brown.webp","data":{"category":"equipment","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"NRBT2VmdzhjDL4fW"} {"name":"Corde + Grappin","type":"item","img":"icons/sundries/survival/rope-wrapped-brown.webp","data":{"category":"equipment","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"NRBT2VmdzhjDL4fW"}
{"name":"Armes Improvisée (Lancer)","type":"item","img":"icons/tools/cooking/knife-cleaver-steel-grey.webp","data":{"category":"equipment","subtype":"weapon","description":"","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":false,"concealable":false,"ignoreshield":false,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"improvised","damage":"d3","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false,"bashing":true,"throwable":false,"range":null},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.BSoDfbLMBtwZllDb"}},"_id":"Oe330qkRSJAQ88mX"} {"name":"Abordage","type":"item","img":"icons/weapons/swords/scimitar-guard-gold.webp","system":{"category":"vehicleweapon","subtype":"weapon","description":"<p>Une action d&rsquo;Abordage peut &ecirc;tre tent&eacute;e si deux navires sont bloqu&eacute;s l&rsquo;un contre l&rsquo;autre suite &agrave; une action r&eacute;ussie d&rsquo;&Eacute;peronner ou de Lancer les grappins. L&rsquo;Abordage est la seule action pour laquelle il n&rsquo;y a pas de limite aux points de ressources que vous pouvez engager afin d&rsquo;avoir un bonus au jet d&rsquo;attaque. L&rsquo;Abordage est aussi l&rsquo;occasion pour des h&eacute;ros d&rsquo;entreprendre des Actions h&eacute;ro&iuml;ques en mer, de la m&ecirc;me fa&ccedil;on qu&rsquo;ils peuvent le faire lors de batailles terrestres. Ces actions formeront une petite aventure &agrave; part enti&egrave;re, par exemple si les h&eacute;ros doivent fouiller le navire ennemi tout en affrontant son &eacute;quipage.</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,"isfiredamage":false,"ishulldamage":false,"iscrewdamage":true,"hulldamage":"d6","hullDamageMultiplier":"1","crewdamage":"d6","crewDamageMultiplier":"1","isboarding":true,"isspur":false,"isbreakrow":false},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"flags":{},"_stats":{"systemId":"bol","systemVersion":"10.3.2","coreVersion":"10.290","createdTime":1665332723905,"modifiedTime":1669197331084,"lastModifiedBy":"zN9ZZg5J7XzNELjd"},"_id":"Oyz8RcFNq6MzDUBO","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"Armes Improvisée","type":"item","img":"icons/tools/hand/shovel-spade-steel-grey.webp","data":{"category":"equipment","subtype":"weapon","description":"","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"concealable":false,"ignoreshield":false,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"improvised","damage":"d3","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false,"bashing":true,"throwable":false},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.BSoDfbLMBtwZllDb"}},"_id":"RNHBCCGlpPNIkbFu"} {"name":"Armes Improvisée","type":"item","img":"icons/tools/hand/shovel-spade-steel-grey.webp","data":{"category":"equipment","subtype":"weapon","description":"","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"concealable":false,"ignoreshield":false,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"improvised","damage":"d3","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false,"bashing":true,"throwable":false},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.BSoDfbLMBtwZllDb"}},"_id":"RNHBCCGlpPNIkbFu"}
{"name":"Armes Improvisée (Lancer)","type":"item","img":"icons/tools/cooking/knife-cleaver-steel-grey.webp","effects":[],"flags":{"core":{"sourceId":"Item.BSoDfbLMBtwZllDb"}},"system":{"category":"equipment","subtype":"weapon","description":"","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":false,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":false,"concealable":false,"ignoreshield":false,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"improvised","damage":"d3","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false,"bashing":true,"throwable":false,"range":null},"quantity":1,"weight":0,"price":0,"worn":false},"ownership":{"default":0,"zN9ZZg5J7XzNELjd":3},"_stats":{"systemId":"bol","systemVersion":"10.3.2","coreVersion":"10.290","createdTime":1669197361967,"modifiedTime":1669197361967,"lastModifiedBy":"zN9ZZg5J7XzNELjd"},"folder":null,"sort":0,"_id":"URCyzJr7vFAIuN3b"}
{"name":"Couteau de Lancer","type":"item","img":"icons/weapons/daggers/dagger-twin-curved-black.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.bol.equipment.4GyTrBGnvlyqoh38"}},"system":{"category":"equipment","subtype":"weapon","description":"<h1>Dague</h1><p>cette catégorie regroupe toutes les lames courtes destinées à lacérer ou poignarder un adversaire. Les dagues sont à un ou deux tranchants selon les modèles, et peuvent être lancées aussi bien quutilisées au corps à corps. Facilement dissimulable, la dague est larme favorite des truands et des assassins.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":true,"stackable":true,"activable":false,"concealable":true,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6M","slot":"none","stacksize":null,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"light","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false,"natural":false,"onlymodifier":false},"quantity":2,"weight":null,"price":0,"worn":false},"ownership":{"kQghu0tL1dft5xLu":3,"zN9ZZg5J7XzNELjd":3},"_stats":{"systemId":"bol","systemVersion":"10.3.2","coreVersion":"10.290","createdTime":1669209202825,"modifiedTime":1669209256671,"lastModifiedBy":"zN9ZZg5J7XzNELjd"},"folder":null,"sort":0,"_id":"W3q72Hop6XYopxpU"}
{"name":"Gourdin Clouté","type":"item","img":"icons/weapons/clubs/club-barbed-square-black.webp","effects":[],"flags":{"core":{"sourceId":"Compendium.bol.equipment.9mDDJnPsOCZRGPJN"}},"system":{"category":"equipment","subtype":"weapon","description":"<h1>Gourdin</h1><p>cest larme la plus rudimentaire qui soit. Un gourdin consiste généralement en un bâton de bois noueux, extrêmement dur et mesurant moins de 90 cm de long. Par commodité, on regroupe sous ce terme toute autre arme contondante du même genre (matraque, etc.). Il est possible dutiliser un gourdin pour infliger des dégâts non létaux et assommer son ennemi plutôt que de le tuer.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":true,"damage":"d6","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"light","damageAttribute":"vigor","damageModifiers":2,"damageMultiplier":"1","damageReroll1":false,"natural":false,"onlymodifier":false},"quantity":null,"weight":null,"price":0,"worn":false},"ownership":{"default":0,"EEnCVoPAR7pMjRym":3,"zN9ZZg5J7XzNELjd":3},"_stats":{"systemId":"bol","systemVersion":"10.3.2","coreVersion":"10.290","createdTime":1669208789210,"modifiedTime":1669208814086,"lastModifiedBy":"zN9ZZg5J7XzNELjd"},"folder":null,"sort":0,"_id":"Wq2zN2XVbYwqw2ki"}
{"name":"Bottes","type":"item","img":"icons/equipment/feet/boots-collared-leather-brown.webp","data":{"category":"equipment","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"X3AR5En9mQhGUrOA"} {"name":"Bottes","type":"item","img":"icons/equipment/feet/boots-collared-leather-brown.webp","data":{"category":"equipment","subtype":"armor","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"X3AR5En9mQhGUrOA"}
{"_id":"Z2AaQKweMljBAgt6","name":"Arc","type":"item","img":"icons/weapons/bows/longbow-leather-green.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Arc</h1><p>une longue tige flexible en bois dont les extrémités sont reliées par une corde et qui permet de tirer des flèches. Il existe différentes formes darcs.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":true,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"2h":true,"damage":"d6","range":22,"reload":0,"slot":"none","attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"damageAttribute":"half-vigor","damageModifiers":null,"damageReroll1":false,"attackBonusDice":false,"weaponSize":"medium","damageMultiplier":"1"},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"Z2AaQKweMljBAgt6","name":"Arc","type":"item","img":"icons/weapons/bows/longbow-leather-green.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Arc</h1><p>une longue tige flexible en bois dont les extrémités sont reliées par une corde et qui permet de tirer des flèches. Il existe différentes formes darcs.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":true,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"2h":true,"damage":"d6","range":22,"reload":0,"slot":"none","attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"damageAttribute":"half-vigor","damageModifiers":null,"damageReroll1":false,"attackBonusDice":false,"weaponSize":"medium","damageMultiplier":"1"},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"name":"Sac","type":"item","img":"icons/containers/bags/pack-leather-black-brown.webp","data":{"category":"equipment","subtype":"container","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"aclqGClakTbXVwAK"} {"name":"Sac","type":"item","img":"icons/containers/bags/pack-leather-black-brown.webp","data":{"category":"equipment","subtype":"container","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"aclqGClakTbXVwAK"}
{"name":"Briser les Rames","type":"item","img":"icons/tools/nautical/steering-wheel.webp","system":{"category":"vehicleweapon","subtype":"armor","description":"<p>Le navire attaquant fr&ocirc;le le navire ennemi dans le but de briser ses rang&eacute;es de rames afin de<br>l&rsquo;immobiliser sans le couler. Pour cette man&oelig;uvre, les navires doivent commencer le round &agrave; Bout<br>portant ou &agrave; port&eacute;e Courte. L&rsquo;attaquant effectue un jet d&rsquo;action. Le d&eacute;fenseur peut utiliser ses<br>ressources pour &eacute;viter l&rsquo;attaque (ce qui lui octroie un bonus en d&eacute;fense).</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,"isfiredamage":false,"ishulldamage":true,"iscrewdamage":false,"hulldamage":"d6","hullDamageMultiplier":"1","crewdamage":"d6","crewDamageMultiplier":"1","isboarding":false,"isspur":false,"isbreakrow":true},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"flags":{},"_stats":{"systemId":"bol","systemVersion":"10.2.1","coreVersion":"10.287","createdTime":1665332723905,"modifiedTime":1665384335828,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"c8XSKMNX8hFr1Lgf","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"_id":"cS2LGlXLZegvRGOo","name":"Arbalète lourde","type":"item","img":"icons/weapons/crossbows/crossbow-golden-bolt.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Arbalète lourde</h1><p>plus lourde et plus puissante quune arbalète normale, larbalète lourde est peu usitée en Lémurie, sauf comme arme de siège portative. Il faut 2 rounds complets pour charger une arbalète lourde.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":true,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"2h":true,"damage":"d6B","range":45,"reload":2,"slot":"none","attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"damageAttribute":"half-vigor","damageModifiers":null,"damageReroll1":false,"attackBonusDice":false,"weaponSize":"heavy","damageMultiplier":"1"},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"cS2LGlXLZegvRGOo","name":"Arbalète lourde","type":"item","img":"icons/weapons/crossbows/crossbow-golden-bolt.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Arbalète lourde</h1><p>plus lourde et plus puissante quune arbalète normale, larbalète lourde est peu usitée en Lémurie, sauf comme arme de siège portative. Il faut 2 rounds complets pour charger une arbalète lourde.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":true,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"2h":true,"damage":"d6B","range":45,"reload":2,"slot":"none","attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"damageAttribute":"half-vigor","damageModifiers":null,"damageReroll1":false,"attackBonusDice":false,"weaponSize":"heavy","damageMultiplier":"1"},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"d7UV55xQXXfMiGQI","name":"Fronde","type":"item","img":"icons/weapons/slings/slingshot-wood.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Fronde</h1><p>simple pièce de cuir équipée de lanières, une fronde permet de projeter de petites pierres ou des billes de plomb avec une certaine force. Cest une arme peu coûteuse et facile à fabriquer. Il existe une version plus puissante, montée au bout dun bâton (ce qui en fait une arme à deux mains), qui permet des tirs à plus longue portée.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":true,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6M","range":9,"reload":0,"slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"unarmed","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"d7UV55xQXXfMiGQI","name":"Fronde","type":"item","img":"icons/weapons/slings/slingshot-wood.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Fronde</h1><p>simple pièce de cuir équipée de lanières, une fronde permet de projeter de petites pierres ou des billes de plomb avec une certaine force. Cest une arme peu coûteuse et facile à fabriquer. Il existe une version plus puissante, montée au bout dun bâton (ce qui en fait une arme à deux mains), qui permet des tirs à plus longue portée.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":true,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6M","range":9,"reload":0,"slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"unarmed","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"gCbETPg0ROGdDfHS","name":"Arc Ghataï","type":"item","img":"icons/weapons/bows/longbow-recurve-brown.webp","data":{"category":"equipment","subtype":"weapon","description":"<p>L&rsquo;arme embl&eacute;matique des Ghata&iuml; est un arc composite, particuli&egrave;rement adapt&eacute; pour des cavaliers. Les archers de cavalerie forment le gros des forces gatha&iuml;, qui utilisent des tactiques de harc&egrave;lement plut&ocirc;t que de charge frontale.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"concealable":false,"ignoreshield":false,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"unarmed","damage":"d6","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false,"slot":"2hands","bashing":false,"throwable":false,"range":22},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"vpqjUad9wWS9Gk5R":3},"flags":{"core":{"sourceId":"Item.ltAvk5pqfNeqF8gO"}}} {"_id":"gCbETPg0ROGdDfHS","name":"Arc Ghataï","type":"item","img":"icons/weapons/bows/longbow-recurve-brown.webp","data":{"category":"equipment","subtype":"weapon","description":"<p>L&rsquo;arme embl&eacute;matique des Ghata&iuml; est un arc composite, particuli&egrave;rement adapt&eacute; pour des cavaliers. Les archers de cavalerie forment le gros des forces gatha&iuml;, qui utilisent des tactiques de harc&egrave;lement plut&ocirc;t que de charge frontale.</p>","properties":{"ranged":true,"melee":false,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"concealable":false,"ignoreshield":false,"attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"ranged","attackModifiers":null,"weaponSize":"unarmed","damage":"d6","damageAttribute":"half-vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false,"slot":"2hands","bashing":false,"throwable":false,"range":22},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"vpqjUad9wWS9Gk5R":3},"flags":{"core":{"sourceId":"Item.ltAvk5pqfNeqF8gO"}}}
@ -35,8 +43,10 @@
{"_id":"pncWIrD5z7mk6dbc","name":"Massue","type":"item","img":"icons/weapons/clubs/club-simple-stone-purple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Massue</h1><p>la version lourde du gourdin. Une massue consiste en un solide manche en bois dont lextrémité, plus volumineuse, sert à fracasser le crâne de ses adversaires, doù son autre nom de casse-tête.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"medium","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"pncWIrD5z7mk6dbc","name":"Massue","type":"item","img":"icons/weapons/clubs/club-simple-stone-purple.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Massue</h1><p>la version lourde du gourdin. Une massue consiste en un solide manche en bois dont lextrémité, plus volumineuse, sert à fracasser le crâne de ses adversaires, doù son autre nom de casse-tête.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"throwable":false,"range":3,"damage":"d6","slot":"none","attackBonusDice":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"medium","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"qG5Jlhjjh7vDtBB1","name":"Fléau","type":"item","img":"icons/weapons/maces/flail-triple-grey.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Fléau</h1><p>un fléau consiste en un manche de bois prolongé dune chaîne, à lextrémité de laquelle est fixée une boule hérissée de pointes métalliques. Les fléaux ne sont pas des armes employées couramment en Lémurie, mais les gladiateurs en utilisent parfois dans les arènes. Les attaques au fléau ignorent le bonus en défense accordé par lemploi dun bouclier.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":true,"powder":false,"bashing":false,"damage":"d6","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"medium","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"qG5Jlhjjh7vDtBB1","name":"Fléau","type":"item","img":"icons/weapons/maces/flail-triple-grey.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Fléau</h1><p>un fléau consiste en un manche de bois prolongé dune chaîne, à lextrémité de laquelle est fixée une boule hérissée de pointes métalliques. Les fléaux ne sont pas des armes employées couramment en Lémurie, mais les gladiateurs en utilisent parfois dans les arènes. Les attaques au fléau ignorent le bonus en défense accordé par lemploi dun bouclier.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":true,"powder":false,"bashing":false,"damage":"d6","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"medium","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"rVLqiqxtfsZ7z6Hw","name":"Rapière","type":"item","img":"icons/weapons/swords/greatsword-flamberge.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Rapière</h1><p>cette épée fine et légère est essentiellement utilisée par les bellâtres et les courtisans des cités-états de Lémurie, chez qui lescrime a été élevé au rang dart. La rapière sutilise généralement en conjonction avec une dague de parade (aussi appelée main gauche), un petit bouclier, ou une simple cape roulée en boule.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6M","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"light","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"rVLqiqxtfsZ7z6Hw","name":"Rapière","type":"item","img":"icons/weapons/swords/greatsword-flamberge.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Rapière</h1><p>cette épée fine et légère est essentiellement utilisée par les bellâtres et les courtisans des cités-états de Lémurie, chez qui lescrime a été élevé au rang dart. La rapière sutilise généralement en conjonction avec une dague de parade (aussi appelée main gauche), un petit bouclier, ou une simple cape roulée en boule.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6M","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"light","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"name":"Crache Feu","type":"item","img":"icons/weapons/artillery/cannon-engraved-gold.webp","system":{"category":"vehicleweapon","subtype":"armor","description":"<p>L&rsquo;usage de cet appareil d&rsquo;alchimiste exige des comp&eacute;tences particuli&egrave;res. Sa conception comme<br>la formule du produit qui l&rsquo;alimente sont des secrets jalousement gard&eacute;s. Le crache-feu est un<br>gros r&eacute;servoir pressuris&eacute; &eacute;quip&eacute; d&rsquo;un tube &agrave; son sommet. La machine tire un jet de liquide br&ucirc;lant<br>&agrave; de grandes distances (jusqu&rsquo;&agrave; port&eacute;e Longue).</p>\n<p>Les flammes sont presque impossibles &agrave; &eacute;teindre.</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,"isfiredamage":true,"ishulldamage":true,"iscrewdamage":true,"hulldamage":"d6","hullDamageMultiplier":"1","crewdamage":"d6","crewDamageMultiplier":"1","isboarding":false,"isspur":false,"isbreakrow":false},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"flags":{},"_stats":{"systemId":"bol","systemVersion":"10.2.1","coreVersion":"10.287","createdTime":1665332723905,"modifiedTime":1665384335828,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"uBTjNOW9I8dAJPdv","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"_id":"vN3CHxyOrXuXHQRY","name":"Bâton","type":"item","img":"icons/weapons/staves/staff-simple-gold.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Bâton</h1><p>une longueur de bois robuste (environ 1,80 m de hauteur), qui sert aussi bien de bâton de marche que darme.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":true,"damage":"d6","slot":"none","throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"damageAttribute":"vigor","damageModifiers":null,"damageReroll1":false,"attackBonusDice":false,"weaponSize":"unarmed","damageMultiplier":"1"},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"vN3CHxyOrXuXHQRY","name":"Bâton","type":"item","img":"icons/weapons/staves/staff-simple-gold.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Bâton</h1><p>une longueur de bois robuste (environ 1,80 m de hauteur), qui sert aussi bien de bâton de marche que darme.</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":true,"damage":"d6","slot":"none","throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"damageAttribute":"vigor","damageModifiers":null,"damageReroll1":false,"attackBonusDice":false,"weaponSize":"unarmed","damageMultiplier":"1"},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"name":"Somnifère","type":"item","img":"icons/consumables/potions/bottle-bulb-corked-labeled-blue.webp","data":{"category":"equipment","subtype":"other","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"vgJSyqc6VVxfbWsC"} {"name":"Somnifère","type":"item","img":"icons/consumables/potions/bottle-bulb-corked-labeled-blue.webp","data":{"category":"equipment","subtype":"other","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"vgJSyqc6VVxfbWsC"}
{"name":"Catapulte (Feu)","type":"item","img":"icons/weapons/artillery/catapult-simple.webp","system":{"category":"vehicleweapon","subtype":"armor","description":"<p>Les catapultes peuvent tirer des pierres ou des pots de goudron enflamm&eacute; jusqu&rsquo;&agrave; une port&eacute;e<br>Extr&ecirc;me. Les pierres font des d&eacute;g&acirc;ts &agrave; la coque et au gr&eacute;ement du navire, mais peuvent aussi<br>tuer des matelots. Un pot &agrave; feu qui explose sur le pont arrose la coque et l&rsquo;&eacute;quipage de goudron<br>enflamm&eacute;, qui continue &agrave; br&ucirc;ler jusqu&rsquo;&agrave; ce que l&rsquo;incendie soit ma&icirc;tris&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,"isfiredamage":true,"ishulldamage":true,"iscrewdamage":true,"hulldamage":"d3","hullDamageMultiplier":"1","crewdamage":"d3","crewDamageMultiplier":"1"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"flags":{},"_stats":{"systemId":"bol","systemVersion":"10.2.1","coreVersion":"10.287","createdTime":1665332723905,"modifiedTime":1665384335828,"lastModifiedBy":"kQghu0tL1dft5xLu"},"_id":"vgyGk9PEKJOqfZH2","folder":null,"sort":0,"ownership":{"default":0,"kQghu0tL1dft5xLu":3}}
{"name":"Lanterne + Huile + Silex","type":"item","img":"icons/sundries/lights/lantern-iron-yellow.webp","data":{"category":"equipment","subtype":"other","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"x86khXdimiKSujjy"} {"name":"Lanterne + Huile + Silex","type":"item","img":"icons/sundries/lights/lantern-iron-yellow.webp","data":{"category":"equipment","subtype":"other","description":"","properties":{"ranged":false,"melee":false,"spell":false,"protection":false,"weapon":false,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":false,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"slot":"chest"},"quantity":1,"weight":0,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"zN9ZZg5J7XzNELjd":3},"flags":{"core":{"sourceId":"Item.rk4tvTBFlLe87mRM"}},"_id":"x86khXdimiKSujjy"}
{"_id":"xH95daHpPAQWuiYp","name":"Arme dhast","type":"item","img":"icons/weapons/polearms/halberd-crescent-small-spiked.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Arme dhast</h1><p>ce nom recouvre une catégorie darmes possédant toutes un fer destiné à frapper, fixé au bout dune longue hampe en bois, qui offre à son utilisateur une grande allonge. Selon leur forme, ces armes à deux mains portent le nom de hallebarde, coutille, guisarme, vouge…</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6B","slot":"none","throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"damageAttribute":"vigor","damageModifiers":null,"damageReroll1":false,"attackBonusDice":false,"weaponSize":"unarmed","damageMultiplier":"1"},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"xH95daHpPAQWuiYp","name":"Arme dhast","type":"item","img":"icons/weapons/polearms/halberd-crescent-small-spiked.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Arme dhast</h1><p>ce nom recouvre une catégorie darmes possédant toutes un fer destiné à frapper, fixé au bout dune longue hampe en bois, qui offre à son utilisateur une grande allonge. Selon leur forme, ces armes à deux mains portent le nom de hallebarde, coutille, guisarme, vouge…</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6B","slot":"none","throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"damageAttribute":"vigor","damageModifiers":null,"damageReroll1":false,"attackBonusDice":false,"weaponSize":"unarmed","damageMultiplier":"1"},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}
{"_id":"xYWeGSCfnPwTq0rV","name":"Épée à deux mains","type":"item","img":"icons/weapons/swords/greatsword-crossguard-silver.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Épée à deux mains</h1><p>Une lourde épée pouvant mesurer jusquà 1,80 m de long pour les plus grandes, et sutilisant à deux mains. Elle peut porter différents noms selon les modèles : claymore, espadon, épée bâtarde…</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6B","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"heavy","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}} {"_id":"xYWeGSCfnPwTq0rV","name":"Épée à deux mains","type":"item","img":"icons/weapons/swords/greatsword-crossguard-silver.webp","data":{"category":"equipment","subtype":"weapon","description":"<h1>Épée à deux mains</h1><p>Une lourde épée pouvant mesurer jusquà 1,80 m de long pour les plus grandes, et sutilisant à deux mains. Elle peut porter différents noms selon les modèles : claymore, espadon, épée bâtarde…</p>","properties":{"ranged":false,"melee":true,"spell":false,"protection":false,"weapon":true,"armor":false,"helm":false,"shield":false,"equipable":true,"consumable":false,"magical":false,"2H":true,"reloadable":false,"bow":false,"crossbow":false,"throwing":false,"stackable":false,"activable":false,"concealable":false,"ignoreshield":false,"powder":false,"bashing":false,"damage":"d6B","slot":"none","attackBonusDice":false,"throwable":false,"attackAttribute":"agility","attackAptitude":"melee","attackModifiers":null,"weaponSize":"heavy","damageAttribute":"vigor","damageModifiers":null,"damageMultiplier":"1","damageReroll1":false},"quantity":null,"weight":null,"price":0,"worn":false},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"EEnCVoPAR7pMjRym":3},"flags":{}}

View File

@ -1,24 +1,25 @@
{ {
"name": "bol", "id": "bol",
"title": "Barbarians of Lemuria", "title": "Barbarians of Lemuria",
"description": "The Barbarians of Lemuria system for FoundryVTT!", "description": "The Barbarians of Lemuria system for FoundryVTT!",
"author": "LeRatierBretonnien,Zigmund",
"authors": [ "authors": [
{ {
"name": "LeRatierBretonnien" "name": "LeRatierBretonnien",
"flags": {}
}, },
{ {
"name": "Zigmund" "name": "Zigmund",
"flags": {}
} }
], ],
"url": "https://www.uberwald.me/gitea/public/bol", "url": "https://www.uberwald.me/gitea/public/bol",
"license": "LICENSE.txt", "license": "LICENSE.txt",
"flags": {}, "version": "10.4.10",
"version": "1.5.2", "compatibility": {
"templateVersion": 10, "minimum": "10",
"minimumCoreVersion": "0.8.6", "verified": "10",
"compatibleCoreVersion": "9", "maximum": "10"
"scripts": [], },
"esmodules": [ "esmodules": [
"module/bol.js" "module/bol.js"
], ],
@ -29,17 +30,20 @@
{ {
"lang": "en", "lang": "en",
"name": "English", "name": "English",
"path": "lang/en.json" "path": "lang/en.json",
"flags": {}
}, },
{ {
"lang": "fr", "lang": "fr",
"name": "Français", "name": "Français",
"path": "lang/fr.json" "path": "lang/fr.json",
"flags": {}
}, },
{ {
"lang": "de", "lang": "de",
"name": "Deutsch", "name": "Deutsch",
"path": "lang/de.json" "path": "lang/de.json",
"flags": {}
} }
], ],
"packs": [ "packs": [
@ -47,64 +51,64 @@
"name": "boons", "name": "boons",
"label": "Avantages", "label": "Avantages",
"system": "bol", "system": "bol",
"path": "./packs/boons.db", "path": "packs/boons.db",
"tag": "boon",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "boonsflawscreatures", "name": "boonsflawscreatures",
"label": "Avantages/Désavantages de Créatures", "label": "Avantages/Désavantages de Créatures",
"system": "bol", "system": "bol",
"path": "./packs/boonsflawscreatures.db", "path": "packs/boonsflawscreatures.db",
"tag": "boon",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "flaws", "name": "flaws",
"label": "Désavantages", "label": "Désavantages",
"system": "bol", "system": "bol",
"path": "./packs/flaws.db", "path": "packs/flaws.db",
"tag": "flaw",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "careers", "name": "careers",
"label": "Carrières héroïques", "label": "Carrières héroïques",
"system": "bol", "system": "bol",
"path": "./packs/careers.db", "path": "packs/careers.db",
"tag": "career",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "origins", "name": "origins",
"label": "Origines", "label": "Origines",
"system": "bol", "system": "bol",
"path": "./packs/origins.db", "path": "packs/origins.db",
"tag": "origin",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "races", "name": "races",
"label": "Races", "label": "Races",
"system": "bol", "system": "bol",
"path": "./packs/races.db", "path": "packs/races.db",
"tag": "race",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"name": "equipment", "name": "equipment",
"label": "Equipement", "label": "Equipement",
"system": "bol", "system": "bol",
"path": "./packs/equipment.db", "path": "packs/equipment.db",
"tag": "item",
"type": "Item", "type": "Item",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Aides de Jeu", "label": "Aides de Jeu",
@ -112,7 +116,8 @@
"name": "aides-de-jeu", "name": "aides-de-jeu",
"path": "packs/aides-de-jeu.db", "path": "packs/aides-de-jeu.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Cartes", "label": "Cartes",
@ -120,7 +125,8 @@
"name": "cartes", "name": "cartes",
"path": "packs/cartes.db", "path": "packs/cartes.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Langues", "label": "Langues",
@ -128,7 +134,8 @@
"name": "languages", "name": "languages",
"path": "packs/languages.db", "path": "packs/languages.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Sorts", "label": "Sorts",
@ -136,7 +143,8 @@
"name": "spells", "name": "spells",
"path": "packs/spells.db", "path": "packs/spells.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Dieux", "label": "Dieux",
@ -144,7 +152,8 @@
"name": "godsfaith", "name": "godsfaith",
"path": "packs/godsfaith.db", "path": "packs/godsfaith.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Options de Combat", "label": "Options de Combat",
@ -152,7 +161,8 @@
"name": "fightoptions", "name": "fightoptions",
"path": "packs/fightoptions.db", "path": "packs/fightoptions.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Alchimie - Potions", "label": "Alchimie - Potions",
@ -160,7 +170,8 @@
"name": "potions-alchimie", "name": "potions-alchimie",
"path": "packs/potions-alchimie.db", "path": "packs/potions-alchimie.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
}, },
{ {
"label": "Alchimie - Objets", "label": "Alchimie - Objets",
@ -168,7 +179,17 @@
"name": "objets-alchimie", "name": "objets-alchimie",
"path": "packs/objets-alchimie.db", "path": "packs/objets-alchimie.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
},
{
"label": "Effets - Exemples",
"type": "Item",
"name": "effets-exemples",
"path": "packs/effets-exemples.db",
"system": "bol",
"private": false,
"flags": {}
}, },
{ {
"label": "Créatures", "label": "Créatures",
@ -176,18 +197,16 @@
"name": "creatures", "name": "creatures",
"path": "packs/creatures.db", "path": "packs/creatures.db",
"system": "bol", "system": "bol",
"private": false "private": false,
"flags": {}
} }
], ],
"system": [],
"dependencies": [],
"socket": true, "socket": true,
"manifest": "https://www.uberwald.me/gitea/public/bol/raw/master/system.json", "manifest": "https://www.uberwald.me/gitea/public/bol/raw/v10/system.json",
"download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v1.5.2.zip", "download": "https://www.uberwald.me/gitea/public/bol/archive/bol-v10.4.10.zip",
"protected": false, "background": "systems/images/map_lemurie.webp",
"background": "images/map_lemurie.webp",
"gridDistance": 1.5, "gridDistance": 1.5,
"gridUnits": "m", "gridUnits": "m",
"primaryTokenAttribute": "resources.hp", "primaryTokenAttribute": "resources.hp",
"secondaryTokenAttribute": "resources.hero" "secondaryTokenAttribute": "resources.hero"
} }

View File

@ -2,7 +2,8 @@
"Actor": { "Actor": {
"types": [ "types": [
"character", "character",
"encounter" "encounter",
"vehicle"
], ],
"templates": { "templates": {
"base": { "base": {
@ -101,10 +102,10 @@
"hp": { "hp": {
"key": "hp", "key": "hp",
"label": "BOL.resources.hp", "label": "BOL.resources.hp",
"base": 0, "base": 1,
"value": 0, "value": 1,
"bonus": 0, "bonus": 0,
"max": 0 "max": 1
}, },
"hero": { "hero": {
"key": "hero", "key": "hero",
@ -137,10 +138,11 @@
}, },
"character": { "character": {
"templates": [ "base" ], "templates": [ "base" ],
"type": "player", "chartype": "player",
"villainy": false, "villainy": false,
"bougette": { "bougette": {
"state": "nomoney" "state": "nomoney",
"value": 0
}, },
"xp": { "xp": {
"key": "xp", "key": "xp",
@ -157,10 +159,50 @@
}, },
"encounter": { "encounter": {
"templates": [ "base" ], "templates": [ "base" ],
"type": "tough", "chartype": "tough",
"villainy": false, "villainy": false,
"size": "", "size": "",
"environment": "" "environment": ""
},
"vehicle": {
"vehicletype": "boat",
"attributes": {
"hull": {
"key": "hull",
"label": "BOL.attributes.hull",
"value": 0,
"min": 0,
"max": 5
},
"crew": {
"key": "crew",
"label": "BOL.attributes.crew",
"value": 0,
"min": 0,
"max": 5
},
"resources": {
"key": "resources",
"label": "BOL.attributes.resources",
"value": 0,
"min": 0,
"max": 5
}
},
"row": {
"key": "row",
"label": "BOL.attributes.row",
"value": 0,
"min": 0,
"max": 5
},
"spur": {
"value": ""
},
"status": {
},
"description": ""
} }
}, },
"Item": { "Item": {

View File

@ -7,6 +7,23 @@
<div class="sidebar flex0 bol-actor-sidebar"> <div class="sidebar flex0 bol-actor-sidebar">
<img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="100" width="100" <img class="profile-img" src="{{actor.img}}" data-edit="img" title="{{actor.name}}" height="100" width="100"
style="border:1px outset lightgray; box-shadow: 5px 5px 5px gray" /> style="border:1px outset lightgray; box-shadow: 5px 5px 5px gray" />
<div></div>
{{#if (count boleffects)}}
<ol class="items-list">
<li class="item flexrow item-header">
<div class="item-name flex2">{{localize "BOL.ui.effects"}}</div>
</li>
{{#each boleffects as |effect keyEffect|}}
<li class="item flexrow" data-item-id="{{effect.id}}">
<div class="item-image"><img src="{{effect.img}}" title="{{effect.name}}"/></div>
<h4 class="item-name flex2"><a class="item-edit">{{effect.name}}</a></h4>
</li>
{{/each}}
</ol>
{{/if}}
</div> </div>
<div class="main flex1"> <div class="main flex1">
@ -16,8 +33,8 @@
{{!-- Sheet Tab Navigation --}} {{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary"> <nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="stats">{{localize "BOL.ui.tab.stats"}}</a> <a class="item" data-tab="stats">{{localize "BOL.ui.tab.stats"}}</a>
<a class="item" data-tab="actions">{{localize "BOL.ui.tab.actions"}}</a> {{#if (ne charType "creature")}}
{{#if (ne data.type "creature")}} <a class="item" data-tab="actions">{{localize "BOL.ui.tab.actions"}}</a>
<a class="item" data-tab="features">{{localize "BOL.ui.tab.features"}}</a> <a class="item" data-tab="features">{{localize "BOL.ui.tab.features"}}</a>
<a class="item" data-tab="equipment">{{localize "BOL.ui.tab.equipment"}}</a> <a class="item" data-tab="equipment">{{localize "BOL.ui.tab.equipment"}}</a>
{{#if (or isSorcerer isAlchemist)}} {{#if (or isSorcerer isAlchemist)}}
@ -30,22 +47,21 @@
{{!-- Sheet Body --}} {{!-- Sheet Body --}}
<section class="sheet-body"> <section class="sheet-body">
<div class="tab stats" data-group="primary" data-tab="stats"> <div class="tab stats" data-group="primary" data-tab="stats">
{{#if (eq data.type "creature")}} {{#if (eq charType "creature")}}
{{>"systems/bol/templates/actor/parts/tabs/creature-stats.hbs"}} {{>"systems/bol/templates/actor/parts/tabs/creature-stats.hbs"}}
{{> "systems/bol/templates/actor/parts/tabs/creature-actions.hbs"}}
{{else}} {{else}}
{{>"systems/bol/templates/actor/parts/tabs/actor-stats.hbs"}} {{>"systems/bol/templates/actor/parts/tabs/actor-stats.hbs"}}
{{/if}} {{/if}}
</div> </div>
{{#if (ne charType "creature")}}
<div class="tab actions" data-group="primary" data-tab="actions"> <div class="tab actions" data-group="primary" data-tab="actions">
{{#if (eq data.type "creature")}}
{{> "systems/bol/templates/actor/parts/tabs/creature-actions.hbs"}}
{{else}}
{{> "systems/bol/templates/actor/parts/tabs/actor-actions.hbs"}} {{> "systems/bol/templates/actor/parts/tabs/actor-actions.hbs"}}
{{/if}}
</div> </div>
{{/if}}
{{#if (ne data.type "creature")}} {{#if (ne charType "creature")}}
<div class="tab features" data-group="primary" data-tab="features"> <div class="tab features" data-group="primary" data-tab="features">
{{> "systems/bol/templates/actor/parts/tabs/actor-features.hbs"}} {{> "systems/bol/templates/actor/parts/tabs/actor-features.hbs"}}
</div> </div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,7 @@
{{#each combatCreature as |combatType id|}} {{#each combat as |combatType id|}}
<ol class="items-list"> <ol class="items-list">
{{#if (isEmpty combatType.items)}}
{{else}}
<li class="item flexrow item-header"> <li class="item flexrow item-header">
<div class="item-name flex2">{{localize combatType.label}}</div> <div class="item-name flex2">{{localize combatType.label}}</div>
{{#if protection}}<div class="item-field">{{localize "BOL.ui.protection"}}</div>{{/if}} {{#if protection}}<div class="item-field">{{localize "BOL.ui.protection"}}</div>{{/if}}
@ -8,16 +10,17 @@
{{#if ranged}}<div class="item-field">{{localize "BOL.ui.range"}}</div>{{else}}<div class="item-field"></div>{{/if}} {{#if ranged}}<div class="item-field">{{localize "BOL.ui.range"}}</div>{{else}}<div class="item-field"></div>{{/if}}
{{#if options}}<div class="item-field">{{localize "BOL.ui.status"}}</div>{{else}}<div class="item-field"></div>{{/if}} {{#if options}}<div class="item-field">{{localize "BOL.ui.status"}}</div>{{else}}<div class="item-field"></div>{{/if}}
</li> </li>
{{/if}}
{{#each combatType.items as |item id|}} {{#each combatType.items as |item id|}}
<li class="item flexrow" data-item-id="{{item._id}}"> <li class="item flexrow" data-item-id="{{item._id}}">
<div class="item-image" ><img src="{{item.img}}" title="{{item.name}}"/></div> <div class="item-image" ><img src="{{item.img}}" title="{{item.name}}"/></div>
<h4 class="item-name flex2">{{#if ../weapon}}<a class="rollable" data-roll-type="weapon">{{/if}}{{item.name}}{{#if ../weapon}}</a>{{/if}}</h4> <h4 class="item-name flex2">{{#if ../weapon}}<a class="rollable" data-roll-type="weapon">{{/if}}{{item.name}}{{#if ../weapon}}</a>{{/if}}</h4>
{{#if ../protection}}<div class="item-field"><a class="rollable" data-roll-type="protection">{{item.data.properties.soak.formula}}</a> / {{item.data.properties.soak.value}}</div>{{/if}} {{#if ../protection}}<div class="item-field"><a class="rollable" data-roll-type="protection">{{item.system.properties.soak.formula}}</a> / {{item.system.properties.soak.value}}</div>{{/if}}
{{#if ../blocking}}<div class="item-field">{{item.data.properties.blocking.malus}}</div>{{/if}} {{#if ../blocking}}<div class="item-field">{{item.system.properties.blocking.malus}}</div>{{/if}}
{{#if ../weapon}}<div class="item-field"><a class="rollable" data-roll-type="damage">{{item.data.properties.damage}}+{{item.data.properties.damageModifiers}} x{{item.data.properties.damageMultiplier}}</a></div>{{/if}} {{#if ../weapon}}<div class="item-field"><a class="rollable" data-roll-type="damage">{{item.system.properties.damage}}+{{item.system.properties.damageModifiers}} x{{item.system.properties.damageMultiplier}}</a></div>{{/if}}
{{#if ../ranged}}<div class="item-field">{{item.data.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}} {{#if ../ranged}}<div class="item-field">{{item.system.properties.range}}</div>{{else}}<div class="item-field"></div>{{/if}}
{{#if ../options}}<div class="item-field"> {{#if ../options}}<div class="item-field">
{{#if item.data.properties.activated}} {{#if item.system.properties.activated}}
<a class="toggle-fight-option">{{localize "BOL.ui.toactivated"}}</a> <a class="toggle-fight-option">{{localize "BOL.ui.toactivated"}}</a>
{{else}} {{else}}
<a class="toggle-fight-option">{{localize "BOL.ui.todeactivated"}}</a> <a class="toggle-fight-option">{{localize "BOL.ui.todeactivated"}}</a>

View File

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

View File

@ -0,0 +1,10 @@
<ol class="items-list">
<li class="item flexrow item-header">
<div class="item-name flex4 left">{{localize "BOL.ui.biodescription"}}</div>
<div class="item-field flex1 right"></div>
</li>
</ol>
{{editor description target="system.description" button=true owner=owner
editable=editable}}

View File

@ -0,0 +1,24 @@
<hr />
<div class="resources flexrow">
{{#each system.attributes as |attr key|}}
<div class="resource stat flex1 flex-group-center">
<label class="stat-label">{{localize attr.label}}</label><br />
<input class="stat-value resources-value" type="text" name="system.attributes.{{key}}.value"
value="{{numberFormat attr.value decimals=0 sign=false}}" data-dtype="Number" />
<input class="resources-value" type="text" name="system.attributes.{{key}}.max"
value="{{numberFormat attr.max decimals=0 sign=false}}" data-dtype="Number" />
</div>
{{/each}}
{{#if (eq system.vehicletype "boat")}}
<div class="resource stat flex1 flex-group-center">
<label class="stat-label">{{localize system.row.label}}</label><br />
<input class="stat-value resources-value" type="text" name="system.row.value"
value="{{numberFormat system.row.value decimals=0 sign=false}}" data-dtype="Number" />
<input class="resources-value" type="text" name="system.row.max"
value="{{numberFormat system.row.max decimals=0 sign=false}}" data-dtype="Number" />
</div>
{{/if}}
</div>

View File

@ -0,0 +1,30 @@
<div class="item-name flex4 left">{{localize "BOL.ui.vehicleWeapons"}}</div>
<ol class="items-list">
<li class="item flexrow item-header">
<div class="item-name flex4 left">{{localize "BOL.ui.weapons"}}</div>
<div class="item-field flex2 center">{{localize "BOL.ui.hullDamage"}}</div>
<div class="item-field flex1 center">{{localize "BOL.ui.crewDamage"}}</div>
<div class="item-field flex1 center">{{localize "BOL.ui.fireDamage"}}</div>
<div class="item-field flex1 right"></div>
</li>
{{#each weapons as |item id|}}
<li class="item flexrow" data-item-id="{{item._id}}">
<h4 class="item-name flex4 left">
<div class="item-image"><img src="{{item.img}}" title="{{item.name}}" /></div>
<a class="item-edit">{{item.name}}</a>
</h4>
<div class="item-field flex1 center">
<span class="item-field">{{item.system.properties.hulldamage}}</span>
</div>
<div class="item-field flex1 center">
<span class="item-field">{{item.system.properties.crewdamage}}</span>
</div>
<div class="item-field flex1 center">
<span class="item-field">{{#if item.system.properties.isfiredamage}}X{{else}}-{{/if}}</span>
</div>
<div class="item-field flex1 right">
<a class="item-control item-delete" title="{{localize " BOL.ui.delete"}}"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ol>

View File

@ -0,0 +1,66 @@
<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 bol-actor-sidebar">
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" height="100" width="100"
style="border:1px outset lightgray; box-shadow: 5px 5px 5px gray" />
</div>
<div class="main flex1">
{{!-- Sheet Header --}}
<header class="sheet-header">
<div class="header-field flex1">
<div class="header-field-group flexrow">
<label class="header-field-label flex2">{{localize "BOL.ui.name"}}</label><br/>
<input class="charname flex6" name="name" type="text" value="{{name}}" placeholder="Name"/>
</div>
<div class="header-field-group flexrow">
<label class="header-field-label flex2">Type : </label><br/>
<select class="field-value" name="system.vehicletype" data-dtype="String">
{{#select system.vehicletype}}
<option value="boat">Navire</option>
<option value="flyingboat">Nef Volante</option>
<option value="chariot">Chariot/Carriole</option>
<option value="other">Autre</option>
{{/select}}
</select>
</div>
</div>
</header>
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="stats">{{localize "BOL.ui.tab.stats"}}</a>
<a class="item" data-tab="description">{{localize "BOL.ui.tab.description"}}</a>
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body">
<div class="tab stats" data-group="primary" data-tab="stats">
{{>"systems/bol/templates/actor/parts/tabs/vehicle-stats.hbs"}}
{{>"systems/bol/templates/actor/parts/tabs/vehicle-weapons.hbs"}}
</div>
<div class="tab description" data-group="primary" data-tab="description">
{{> "systems/bol/templates/actor/parts/tabs/vehicle-description.hbs"}}
</div>
</section>
</div>
</div>
<div class="bol-footer flexrow">
<div class="footer-left flex1">
<img src="/systems/bol/ui/banner.webp" />
</div>
<div class="footer-center flex1"></div>
<div class="footer-right flex1">
<img src="/systems/bol/ui/banner.webp" />
</div>
</div>
</form>

View File

@ -0,0 +1,85 @@
<form class="{{cssClass}} flexcol character-summary-container" autocomplete="off">
<ol class="items-list">
<li class="item flexrow item-header">
<div class="item-field item-name item-name-fixed-medium">{{localize "BOL.ui.pcname"}}</div>
{{#each config.attackAttributes as |attr key|}}
<div class="item-field flex2 item-field-fixed-short">{{abbrev3 (localize attr)}}</div>
{{/each}}
{{#each config.aptitudes as |apt key|}}
<div class="item-field flex2 item-field-fixed-short">{{abbrev3 (localize apt)}}</div>
{{/each}}
{{#each config.resources as |res key|}}
<div class="item-field flex2 item-field-fixed-short">{{abbrev3 (localize res)}}</div>
{{/each}}
<div class="item-field flex1 right">
</div>
</li>
{{#each pcs as |pc key|}}
<li class="item flexrow" data-actor-id="{{pc.id}}">
<div class="item-field item-name item-name-fixed-medium">
<a class="actor-open character-summary-rollable">{{pc.name}}</a>
</div>
{{#each pc.system.attributes as |attr key|}}
<div class="item-field flex2 item-field-fixed-short">
<a class="summary-roll character-summary-rollable" data-type="attribute" data-key="{{key}}">{{attr.value}}</a>
</div>
{{/each}}
{{#each pc.system.aptitudes as |apt key|}}
<div class="item-field flex item-field-fixed-short">
<a class="summary-roll character-summary-rollable" data-type="aptitude" data-key="{{key}}">{{apt.value}}</a>
</div>
{{/each}}
{{#each pc.system.resources as |res key|}}
<div class="item-field flex2 item-field-fixed-short">{{res.value}}/{{res.max}}</div>
{{/each}}
<div class="item-field flex1 right">
</div>
</li>
{{/each}}
<li class="item flexrow item-header">
<div class="item-field item-name item-name-fixed-medium">{{localize "BOL.ui.npcname"}}</div>
{{#each config.attackAttributes as |attr key|}}
<div class="item-field flex2 item-field-fixed-short">{{abbrev3 (localize attr)}}</div>
{{/each}}
{{#each config.aptitudes as |apt key|}}
<div class="item-field flex2 item-field-fixed-short">{{abbrev3 (localize apt)}}</div>
{{/each}}
{{#each config.resources as |res key|}}
<div class="item-field flex2 item-field-fixed-short">{{abbrev3 (localize res)}}</div>
{{/each}}
<div class="item-field flex1 right">
</div>
</li>
{{#each npcs as |pc key|}}
<li class="item flexrow" data-actor-id="{{pc.id}}">
<div class="item-field item-name item-name-fixed-medium">
<a class="actor-open character-summary-rollable">{{pc.name}}</a>
</div>
{{#each pc.system.attributes as |attr key|}}
<div class="item-field flex2 item-field-fixed-short">
<a class="summary-roll character-summary-rollable" data-type="attribute" data-key="{{key}}">{{attr.value}}</a>
</div>
{{/each}}
{{#each pc.system.aptitudes as |apt key|}}
<div class="item-field flex item-field-fixed-short">
<a class="summary-roll character-summary-rollable" data-type="aptitude" data-key="{{key}}">{{apt.value}}</a>
</div>
{{/each}}
{{#each pc.system.resources as |res key|}}
<div class="item-field flex2 item-field-fixed-short">{{res.value}}/{{res.max}}</div>
{{/each}}
<div class="item-field flex1 right">
<a class="item-control actor-delete" title="{{localize "BOL.ui.delete"}}"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ol>
</form>

View File

@ -0,0 +1,19 @@
<div>
<img class="chat-icon" src="{{weapon.img}}" alt="{{weapon.name}}"/>
<h2 class="bad"><strong>{{localize "BOL.chat.rangetitle"}}</strong></h2>
</div>
<div class="flexrow">
{{localize "BOL.chat.rangeinfo" attackerName=attackerName defenderName=defenderName}}
{{#if visible}}
<br>{{localize "BOL.chat.rangevisible"}}
{{else}}
<br>{{localize "BOL.chat.rangenotvisible"}}
{{/if}}
<br>{{localize "BOL.chat.rangeweaponinfo" weaponName=weapon.name weaponRange=weaponRange}} m.
<br>{{localize "BOL.chat.rangeprefix"}} {{distance}} m.
<br>{{localize rangeMsg}}
</div>

View File

@ -1,7 +1,7 @@
<button class="chat-damage-roll" data-damage-mode="normal-damage" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage"}}</button> <button class="chat-damage-roll bol-margin-tb-2" data-damage-mode="normal-damage" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage"}}</button>
{{#if isCritical}} {{#if isCritical}}
<button class="chat-damage-roll" data-damage-mode="damage-plus-6" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage6"}}</button> <button class="chat-damage-roll bol-margin-tb-2 " data-damage-mode="damage-plus-6" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage6"}}</button>
<button class="chat-damage-roll" data-damage-mode="damage-plus-12" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage12"}}</button> <button class="chat-damage-roll bol-margin-tb-2" data-damage-mode="damage-plus-12" data-attack-id="{{id}}">{{localize "BOL.chat.rolldamage12"}}</button>
{{/if}} {{/if}}

View File

@ -4,6 +4,12 @@
<h3><strong>{{localize "BOL.chat.damagetarget" target=defender.name}}</strong></h3> <h3><strong>{{localize "BOL.chat.damagetarget" target=defender.name}}</strong></h3>
{{/if}} {{/if}}
{{#if weapon.system.properties.damageReroll1}}
<div>
<label>{{localize "BOL.chat.weaponreroll1"}}</label>
</div>
{{/if}}
<div class="actions-section"> <div class="actions-section">
{{#if targetId}} {{#if targetId}}
<div id="{{applyId}}"> <div id="{{applyId}}">

View File

@ -24,13 +24,43 @@
<h3><strong>{{description}}</strong></h3> <h3><strong>{{description}}</strong></h3>
<div class="actions-section"> <div class="actions-section">
{{#if isFumble}}
{{localize "BOL.chat.fumblemessage"}}
{{/if}}
{{#if fightOption}} {{#if fightOption}}
<div> <div>
{{localize "BOL.chat.fightoption"}} : {{fightOption.name}} {{localize "BOL.chat.fightoption"}} : {{fightOption.name}}
</div> </div>
{{/if}} {{/if}}
{{#if initiativeRank}}
<div>
{{localize "BOL.chat.initiative"}}: {{initiativeRank}}
</div>
{{/if}}
{{#if (eq mode "bougette")}}
<div>
{{localize "BOL.chat.rollbougette"}} :
{{#if isSuccess}}
{{localize "BOL.chat.bougettesuccess"}}
{{else}}
{{localize "BOL.chat.bougettefailure"}}
{{/if}}
</div>
{{/if}}
<div id="{{optionsId}}"> <div id="{{optionsId}}">
{{#if isRealCritical}}
<div class="bol-margin-tb-2">
<a class="content-link" draggable="true" data-uuid="Compendium.bol.aides-de-jeu.Yl1RKQb0BjVUtilk" data-id="Yl1RKQb0BjVUtilk" data-type="JournalEntry" data-pack="bol.aides-de-jeu" data-tooltip="un journal"><i class="fas fa-book-open"></i>Succès Héroïque</a>
</div>
{{/if}}
{{#if (and isSuccess weapon)}} {{#if (and isSuccess weapon)}}
{{> "systems/bol/templates/chat/rolls/attack-damage-card.hbs"}} {{> "systems/bol/templates/chat/rolls/attack-damage-card.hbs"}}
{{/if}} {{/if}}
@ -42,16 +72,18 @@
{{/if}} {{/if}}
{{#if reroll}} {{#if reroll}}
<button class="chat-button button hero-reroll" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">{{localize "BOL.chat.reroll"}}</button> <button class="chat-button button hero-reroll bol-margin-tb-2" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">{{localize "BOL.chat.reroll"}}</button>
{{/if}} {{/if}}
{{#if (and isSuccess (not isCritical))}} {{#if (and isSuccess (not isCritical))}}
<button class="chat-button button transform-heroic-roll" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">{{localize "BOL.chat.toheroic"}}</button> <button class="chat-button button transform-heroic-roll bol-margin-tb-2" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">{{localize "BOL.chat.toheroic"}}</button>
{{/if}} {{/if}}
{{#if isRealCritical}} {{#if isRealCritical}}
<button class="chat-button button transform-legendary-roll" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">{{localize "BOL.chat.tolegend"}}</button> <button class="chat-button button transform-legendary-roll bol-margin-tb-2" data-roll-id=="{{rollId}}" data-actor-id="{{actor.id}}">{{localize "BOL.chat.tolegend"}}</button>
{{/if}} {{/if}}
<br> <br>
</div> </div>
</div> </div>

View File

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

View File

@ -5,7 +5,15 @@
<div class="flex1 center cell"> <div class="flex1 center cell">
<input type="radio" class="bdice" name="adv" value="1" {{#if (eq adv "1B")}}checked{{/if}}/>+1dB<br /> <input type="radio" class="bdice" name="adv" value="1" {{#if (eq adv "1B")}}checked{{/if}}/>+1dB<br />
<input type="radio" class="bdice" name="adv" value="2" {{#if (eq adv "2B")}}checked{{/if}}/>+2dB<br /> <input type="radio" class="bdice" name="adv" value="2" {{#if (eq adv "2B")}}checked{{/if}}/>+2dB<br />
<input type="radio" class="bdice" name="adv" value="0" {{#if (eq adv "0")}}checked{{/if}}/>0<br />
<input type="radio" class="mdice" name="adv" value="1" {{#if (eq adv "1M")}}checked{{/if}}/>+1dM<br /> <input type="radio" class="mdice" name="adv" value="1" {{#if (eq adv "1M")}}checked{{/if}}/>+1dM<br />
<input type="radio" class="mdice" name="adv" value="2" {{#if (eq adv "2M")}}checked{{/if}}/>+2dM<br /> <input type="radio" class="mdice" name="adv" value="2" {{#if (eq adv "2M")}}checked{{/if}}/>+2dM<br />
</div> </div>
</div> </div>
{{#if attackBonusDice}}
<div class="flexrow" style="margin-bottom: 1px;">
<label class="flex-group-center">{{localize 'BOL.ui.weaponbonus'}}</label>
</div>
{{/if}}

View File

@ -35,6 +35,8 @@
{{> "systems/bol/templates/dialogs/flaws-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/flaws-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/effect-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/adv-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/adv-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/mod-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/mod-roll-part.hbs"}}

View File

@ -32,6 +32,8 @@
{{> "systems/bol/templates/dialogs/flaws-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/flaws-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/effect-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/adv-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/adv-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/mod-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/mod-roll-part.hbs"}}

View File

@ -16,6 +16,8 @@
{{> "systems/bol/templates/dialogs/flaws-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/flaws-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/effect-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/adv-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/adv-roll-part.hbs"}}
{{> "systems/bol/templates/dialogs/mod-roll-part.hbs"}} {{> "systems/bol/templates/dialogs/mod-roll-part.hbs"}}

View File

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

View File

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

View File

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

View File

@ -0,0 +1,14 @@
{{#if (count bolEffects)}}
<div class="flexrow roll-box" >
<div class="flex1 center bg-darkred">
<label for="mod">{{localize 'BOL.ui.boleffects'}}</label>
</div>
<div class="flex1 center cell">
<select disabled class="flex1" name="applicable-effects" id="applicable-effects" data-type="String" multiple>
{{#each bolApplicableEffects as |effect id|}}
<option value="{{id}}" selected >{{effect.name}} ({{effect.system.properties.modifier}})</option>
{{/each}}
</select>
</div>
</div>
{{/if}}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,27 @@
<h3 class="form-header">{{localize 'BOL.featureSubtypes.effect'}}</h3>
<div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.attributaptitude"}}</label>
<select name="system.properties.identifier" value="{{item.system.properties.identifier}}">
{{#select item.system.properties.identifier}}
<option value="always">{{localize "BOL.ui.always"}}</option>
{{#each config.attackAttributes as |value id|}}
<option value="system.attributes.{{id}}">{{localize value}}</option>
{{/each}}
{{#each config.aptitudes as |value id|}}
<option value="system.aptitudes.{{id}}">{{localize value}}</option>
{{/each}}
{{/select}}
</select>
</div>
<div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.modifier"}}</label>
<select name="system.properties.modifier" value="{{item.system.properties.modifier}}">
{{#select item.system.properties.modifier}}
{{#each config.bolEffectModifier as |modifier id|}}
<option value="{{id}}">{{localize modifier}}</option>
{{/each}}
{{/select}}
</select>
</div>

View File

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

View File

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

View File

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

View File

@ -2,8 +2,8 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.alchemyType"}}</label> <label class="property-label">{{localize "BOL.ui.alchemyType"}}</label>
<select class="field-value" name="data.properties.alchemytype" data-dtype="String"> <select class="field-value" name="system.properties.alchemytype" data-dtype="String">
{{#select data.properties.alchemytype}} {{#select item.system.properties.alchemytype}}
{{#each config.alchemyType as |value id|}} {{#each config.alchemyType as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -13,8 +13,8 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.difficulty"}}</label> <label class="property-label">{{localize "BOL.ui.difficulty"}}</label>
<select name="data.properties.difficulty" value="{{data.properties.difficulty}}"> <select name="system.properties.difficulty" value="{{item.system.properties.difficulty}}">
{{#select data.properties.difficulty}} {{#select item.system.properties.difficulty}}
<option value="2">{{localize "BOL.dialog.veryeasy"}}</option> <option value="2">{{localize "BOL.dialog.veryeasy"}}</option>
<option value="1">{{localize "BOL.dialog.easy"}}</option> <option value="1">{{localize "BOL.dialog.easy"}}</option>
<option value="0">{{localize "BOL.dialog.moderate"}}</option> <option value="0">{{localize "BOL.dialog.moderate"}}</option>
@ -29,11 +29,11 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.pccost"}}</label> <label class="property-label">{{localize "BOL.ui.pccost"}}</label>
<input class="field-value" type="text" name="data.properties.pccost" value="{{data.properties.pccost}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.pccost" value="{{item.system.properties.pccost}}" data-dtype="Number"/>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.pcnow"}}</label> <label class="property-label">{{localize "BOL.ui.pcnow"}}</label>
<input class="field-value" type="text" name="data.properties.pccurrent" value="{{data.properties.pccurrent}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.pccurrent" value="{{item.system.properties.pccurrent}}" data-dtype="Number"/>
</div> </div>

View File

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

View File

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

View File

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

View File

@ -2,8 +2,8 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.circle"}}</label> <label class="property-label">{{localize "BOL.ui.circle"}}</label>
<select class="field-value" name="data.properties.circle" data-dtype="Number"> <select class="field-value" name="system.properties.circle" data-dtype="Number">
{{#select data.properties.circle}} {{#select item.system.properties.circle}}
{{#each config.spellType as |value id|}} {{#each config.spellType as |value id|}}
<option value="{{id}}">{{localize value}}</option> <option value="{{id}}">{{localize value}}</option>
{{/each}} {{/each}}
@ -13,8 +13,8 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.difficulty"}}</label> <label class="property-label">{{localize "BOL.ui.difficulty"}}</label>
<select name="data.properties.difficulty" value="{{data.properties.difficulty}}"> <select name="system.properties.difficulty" value="{{item.system.properties.difficulty}}">
{{#select data.properties.difficulty}} {{#select item.system.properties.difficulty}}
<option value="2">{{localize "BOL.dialog.veryeasy"}}</option> <option value="2">{{localize "BOL.dialog.veryeasy"}}</option>
<option value="1">{{localize "BOL.dialog.easy"}}</option> <option value="1">{{localize "BOL.dialog.easy"}}</option>
<option value="0">{{localize "BOL.dialog.moderate"}}</option> <option value="0">{{localize "BOL.dialog.moderate"}}</option>
@ -29,18 +29,18 @@
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.ppcost"}}</label> <label class="property-label">{{localize "BOL.ui.ppcost"}}</label>
<input class="field-value" type="text" name="data.properties.ppcost" value="{{data.properties.ppcost}}" data-dtype="Number"/> <input class="field-value" type="text" name="system.properties.ppcost" value="{{item.system.properties.ppcost}}" data-dtype="Number"/>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.duration"}}</label> <label class="property-label">{{localize "BOL.ui.duration"}}</label>
<input class="field-value" type="text" name="data.properties.duration" value="{{data.properties.duration}}" data-dtype="String"/> <input class="field-value" type="text" name="system.properties.duration" value="{{item.system.properties.duration}}" data-dtype="String"/>
</div> </div>
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.mandatoryconditions"}}</label> <label class="property-label">{{localize "BOL.ui.mandatoryconditions"}}</label>
<select class="field-value" name="data.properties.nbmandatoryconditions" data-dtype="Number"> <select class="field-value" name="system.properties.nbmandatoryconditions" data-dtype="Number">
{{#select data.properties.nbmandatoryconditions}} {{#select item.system.properties.nbmandatoryconditions}}
<option value="1">1</option> <option value="1">1</option>
<option value="2">2</option> <option value="2">2</option>
<option value="3">3</option> <option value="3">3</option>
@ -49,19 +49,19 @@
</select> </select>
</div> </div>
{{#each data.properties.mandatoryconditions as |cond idx|}} {{#each item.system.properties.mandatoryconditions as |cond idx|}}
{{#if (lt idx @root.data.properties.nbmandatoryconditions)}} {{#if (lt idx @root.item.system.properties.nbmandatoryconditions)}}
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.mandatoryconditions"}} {{add idx 1}}</label> <label class="property-label">{{localize "BOL.ui.mandatoryconditions"}} {{add idx 1}}</label>
<input class="field-value" type="text" name="data.properties.mandatoryconditions.{{idx}}" value="{{cond}}" data-dtype="String"/> <input class="field-value" type="text" name="system.properties.mandatoryconditions.{{idx}}" value="{{cond}}" data-dtype="String"/>
</div> </div>
{{/if}} {{/if}}
{{/each}} {{/each}}
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.optionnalconditions"}}</label> <label class="property-label">{{localize "BOL.ui.optionnalconditions"}}</label>
<select class="field-value" name="data.properties.nboptionnalconditions" data-dtype="Number"> <select class="field-value" name="system.properties.nboptionnalconditions" data-dtype="Number">
{{#select data.properties.nboptionnalconditions}} {{#select item.system.properties.nboptionnalconditions}}
<option value="1">1</option> <option value="1">1</option>
<option value="2">2</option> <option value="2">2</option>
<option value="3">3</option> <option value="3">3</option>
@ -74,11 +74,11 @@
</select> </select>
</div> </div>
{{#each data.properties.optionnalconditions as |cond idx|}} {{#each item.system.optionnalconditions as |cond idx|}}
{{#if (lt idx @root.data.properties.nboptionnalconditions)}} {{#if (lt idx @root.item.system.properties.nboptionnalconditions)}}
<div class="property flexrow"> <div class="property flexrow">
<label class="property-label">{{localize "BOL.ui.optionnalconditions"}} {{add idx 1}}</label> <label class="property-label">{{localize "BOL.ui.optionnalconditions"}} {{add idx 1}}</label>
<input class="field-value" type="text" name="data.properties.optionnalconditions.{{idx}}" value="{{cond}}" data-dtype="String"/> <input class="field-value" type="text" name="system.properties.optionnalconditions.{{idx}}" value="{{cond}}" data-dtype="String"/>
</div> </div>
{{/if}} {{/if}}
{{/each}} {{/each}}
@ -86,12 +86,12 @@
<div class="property flexrow"> <div class="property flexrow">
<div class="form-fields center"> <div class="form-fields center">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.spellkeep" {{checked data.properties.spellkeep}}> {{localize "BOL.ui.spellkeep"}} <input class="field-value" type="checkbox" name="system.properties.spellkeep" {{checked item.system.properties.spellkeep}}> {{localize "BOL.ui.spellkeep"}}
</label> </label>
</div> </div>
<div class="form-fields center"> <div class="form-fields center">
<label class="checkbox"> <label class="checkbox">
<input class="field-value" type="checkbox" name="data.properties.concentrate" {{checked data.properties.concentrate}}> {{localize "BOL.ui.concentrate"}} <input class="field-value" type="checkbox" name="system.properties.concentrate" {{checked item.system.properties.concentrate}}> {{localize "BOL.ui.concentrate"}}
</label> </label>
</div> </div>
</div> </div>

View File

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

View File

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

View File

@ -0,0 +1,93 @@
<h3 class="form-header">{{localize "BOL.ui.weaponProperties"}}</h3>
<hr/>
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.vehicleDamageType"}}</label>
<div class="form-fields">
<label class="checkbox">
<input class="field-value" type="checkbox" name="system.properties.isfiredamage" {{checked item.system.properties.isfiredamage}}> {{localize "BOL.itemProperty.isfiredamage"}}
</label>
</div>
<div class="form-fields">
<label class="checkbox">
<input class="field-value" type="checkbox" name="system.properties.ishulldamage" {{checked item.system.properties.ishulldamage}}> {{localize "BOL.itemProperty.ishulldamage"}}
</label>
</div>
<div class="form-fields">
<label class="checkbox">
<input class="field-value" type="checkbox" name="system.properties.iscrewdamage" {{checked item.system.properties.iscrewdamage}}> {{localize "BOL.itemProperty.iscrewdamage"}}
</label>
</div>
<div class="form-fields">
<label class="checkbox">
<input class="field-value" type="checkbox" name="system.properties.isboarding" {{checked item.system.properties.isboarding}}> {{localize "BOL.itemProperty.isboarding"}}
</label>
</div>
<div class="form-fields">
<label class="checkbox">
<input class="field-value" type="checkbox" name="system.properties.isspur" {{checked item.system.properties.isspur}}> {{localize "BOL.itemProperty.isspur"}}
</label>
</div>
<div class="form-fields">
<label class="checkbox">
<input class="field-value" type="checkbox" name="system.properties.isbreakrow" {{checked item.system.properties.isbreakrow}}> {{localize "BOL.itemProperty.isbreakrow"}}
</label>
</div>
</div>
{{#if item.system.properties.ishulldamage}}
<hr/>
<h3 class="form-header">{{localize "BOL.itemProperty.hulldamage"}}</h3>
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.hulldamage"}}</label>
<div class="form-fields">
<select class="field-value" name="system.properties.hulldamage" data-dtype="String">
{{#select item.system.properties.hulldamage}}
{{#each config.damageValues as |value id|}}
<option value="{{id}}">{{value}}</option>
{{/each}}
{{/select}}
</select>
</div>
</div>
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.hullDamageMultiplier"}}</label>
<div class="form-fields center">
<select class="field-value" name="system.properties.hullDamageMultiplier" data-dtype="String">
{{#select item.system.properties.hullDamageMultiplier}}
{{#each config.damageMultiplier as |value id|}}
<option value="{{id}}">{{value}}</option>
{{/each}}
{{/select}}
</select>
</div>
</div>
{{/if}}
{{#if item.system.properties.iscrewdamage}}
<hr/>
<h3 class="form-header">{{localize "BOL.itemProperty.crewdamage"}}</h3>
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.crewdamage"}}</label>
<div class="form-fields">
<select class="field-value" name="system.properties.crewdamage" data-dtype="String">
{{#select item.system.properties.crewdamage}}
{{#each config.damageValues as |value id|}}
<option value="{{id}}">{{value}}</option>
{{/each}}
{{/select}}
</select>
</div>
</div>
<div class="form-group">
<label class="property-label">{{localize "BOL.itemProperty.crewDamageMultiplier"}}</label>
<div class="form-fields center">
<select class="field-value" name="system.properties.crewDamageMultiplier" data-dtype="String">
{{#select item.system.properties.crewDamageMultiplier}}
{{#each config.damageMultiplier as |value id|}}
<option value="{{id}}">{{value}}</option>
{{/each}}
{{/select}}
</select>
</div>
</div>
{{/if}}