Various items fixes and enhancements

This commit is contained in:
LeRatierBretonnien 2024-12-09 16:02:40 +01:00
parent 9775ec9fa1
commit 1de2927d93
51 changed files with 2102 additions and 574 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

BIN
assets/icons/icon_gift.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

BIN
assets/icons/icon_save.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
assets/ui/lf_logo_02.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View File

@ -1,8 +1,9 @@
:root { :root {
--font-primary: "TimesNewRoman", serif;
--font-size-standard: 1rem; --font-size-standard: 1rem;
--background-image-base: url("../assets/parchment.jpg"); --background-image-base: url("../assets/ui/lethal_fantasy_background.webp");
--font-secondary: "Amiri", serif; --font-secondary: "BaskervilleBold", serif;
--logo-standard: url("../assets/lethal-fantasy-logo.webp"); --logo-standard: url("../assets/ui/lf_logo_small_02.webp");
} }
#logo { #logo {
content: var(--logo-standard); content: var(--logo-standard);
@ -130,32 +131,28 @@ i.lethalfantasy {
.lethalfantasy .character-main { .lethalfantasy .character-main {
display: flex; display: flex;
} }
.lethalfantasy .character-main .character-personnage { .lethalfantasy .character-main .character-pc {
display: flex; display: flex;
gap: 10px; gap: 10px;
flex: 1; flex: 1;
} }
.lethalfantasy .character-main .character-personnage .character-gauche { .lethalfantasy .character-main .character-pc .character-left {
min-width: 180px; min-width: 180px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
.lethalfantasy .character-main .character-personnage .character-gauche .character-gauche-image { .lethalfantasy .character-main .character-pc .character-left .character-left-image {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
padding-bottom: 20px; padding-bottom: 20px;
} }
.lethalfantasy .character-main .character-personnage .character-gauche .character-gauche-image .character-img { .lethalfantasy .character-main .character-pc .character-left .character-left-image .character-img {
height: 140px; height: 140px;
width: auto; width: auto;
border: none; border: none;
} }
.lethalfantasy .character-main .character-personnage .character-gauche .character-dv .form-fields, .lethalfantasy .character-main .character-pc .character-left .character-hp-edit input {
.lethalfantasy .character-main .character-personnage .character-gauche .character-dmax .form-fields {
flex: none;
}
.lethalfantasy .character-main .character-personnage .character-gauche .character-dmax-edit input {
display: flex; display: flex;
width: 60px; width: 60px;
font-size: calc(var(--font-size-standard) * 1.4); font-size: calc(var(--font-size-standard) * 1.4);
@ -164,55 +161,37 @@ i.lethalfantasy {
padding: 0 5px 0 5px; padding: 0 5px 0 5px;
text-align: center; text-align: center;
} }
.lethalfantasy .character-main .character-personnage .character-droite { .lethalfantasy .character-main .character-pc .character-right {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 5px; gap: 5px;
} }
.lethalfantasy .character-main .character-personnage .character-droite .character-name { .lethalfantasy .character-main .character-pc .character-right .character-name {
display: flex; display: flex;
} }
.lethalfantasy .character-main .character-personnage .character-droite .character-name input { .lethalfantasy .character-main .character-pc .character-right .character-name input {
width: 400px; width: 400px;
} }
.lethalfantasy .character-main .character-personnage .character-droite .character-infos { .lethalfantasy .character-main .character-pc .character-right .character-infos {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 10px; gap: 10px;
} }
.lethalfantasy .character-main .character-personnage .character-droite .character-infos label { .lethalfantasy .character-main .character-pc .character-right .character-infos label {
min-width: 120px; min-width: 120px;
} }
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-majeure, .lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp {
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-mineure {
display: flex;
}
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-majeure input,
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-mineure input {
width: 280px;
}
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-majeure .controls,
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-voie-mineure .controls {
padding-left: 5px;
}
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-commanditaire {
display: flex;
}
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-commanditaire input {
width: 280px;
}
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-pv {
display: flex; display: flex;
gap: 2px; gap: 2px;
align-items: center; align-items: center;
} }
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-pv .character-pv-value .form-fields input { .lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .character-hp-value .form-fields input {
flex: none; flex: none;
width: 50px; width: 50px;
margin-left: 10px; margin-left: 10px;
font-size: calc(var(--font-size-standard) * 1.4); font-size: calc(var(--font-size-standard) * 1.4);
} }
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-pv .character-pv-max { .lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .character-hp-max {
clear: both; clear: both;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -220,53 +199,53 @@ i.lethalfantasy {
margin: 3px 0; margin: 3px 0;
align-items: center; align-items: center;
} }
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-pv .character-pv-max input { .lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .character-hp-max input {
width: 50px; width: 50px;
text-align: center; text-align: center;
font-size: calc(var(--font-size-standard) * 1.4); font-size: calc(var(--font-size-standard) * 1.4);
} }
.lethalfantasy .character-main .character-personnage .character-droite .character-infos .character-pv .pv-separator { .lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .hp-separator {
font-size: calc(var(--font-size-standard) * 1.2); font-size: calc(var(--font-size-standard) * 1.2);
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.lethalfantasy .character-main .character-personnage-play { .lethalfantasy .character-main .character-pc-play {
min-width: 500px; min-width: 500px;
} }
.lethalfantasy .character-main .character-personnage-edit { .lethalfantasy .character-main .character-pc-edit {
min-width: 650px; min-width: 650px;
} }
.lethalfantasy .character-main .character-caracteristiques { .lethalfantasy .character-main .character-characteristics {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 5px; gap: 5px;
flex: 1; flex: 1;
} }
.lethalfantasy .character-main .character-caracteristiques .character-caracteristique { .lethalfantasy .character-main .character-characteristics .character-characteristic {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .rollable:hover, .lethalfantasy .character-main .character-characteristics .character-characteristic .rollable:hover,
.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .rollable:focus { .lethalfantasy .character-main .character-characteristics .character-characteristic .rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary); text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer; cursor: pointer;
} }
.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .form-group { .lethalfantasy .character-main .character-characteristics .character-characteristic .form-group {
flex: 1; flex: 1;
padding-left: 5px; padding-left: 5px;
} }
.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .form-group .form-fields { .lethalfantasy .character-main .character-characteristics .character-characteristic .form-group .form-fields {
flex: none; flex: none;
width: 70px; width: 70px;
} }
.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience { .lethalfantasy .character-main .character-characteristics .character-characteristic .experience {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
margin-left: 10px; margin-left: 10px;
} }
.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience input { .lethalfantasy .character-main .character-characteristics .character-characteristic .experience input {
display: flex; display: flex;
width: 70px; width: 70px;
font-size: calc(var(--font-size-standard) * 1.4); font-size: calc(var(--font-size-standard) * 1.4);
@ -274,54 +253,54 @@ i.lethalfantasy {
justify-content: center; justify-content: center;
padding: 0 5px 0 5px; padding: 0 5px 0 5px;
} }
.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience input[type="number"] { .lethalfantasy .character-main .character-characteristics .character-characteristic .experience input[type="number"] {
text-align: center; text-align: center;
} }
.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience input[type="checkbox"] { .lethalfantasy .character-main .character-characteristics .character-characteristic .experience input[type="checkbox"] {
width: 20px; width: 20px;
} }
.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience input[type="checkbox"]:checked { .lethalfantasy .character-main .character-characteristics .character-characteristic .experience input[type="checkbox"]:checked {
background-color: rgba(0, 0, 0, 0.1); background-color: rgba(0, 0, 0, 0.1);
} }
.lethalfantasy .character-main .character-caracteristiques .character-caracteristique .experience input[type="checkbox"]:checked::after { .lethalfantasy .character-main .character-characteristics .character-characteristic .experience input[type="checkbox"]:checked::after {
color: rgba(0, 0, 0, 0.1); color: rgba(0, 0, 0, 0.1);
} }
.lethalfantasy .character-main .character-caracteristiques-play { .lethalfantasy .character-main .character-characteristics-play {
min-width: 225px; min-width: 225px;
} }
.lethalfantasy .character-main .character-caracteristiques-edit { .lethalfantasy .character-main .character-characteristic-edit {
min-width: 400px; min-width: 400px;
} }
.lethalfantasy .character-main .character-ressources { .lethalfantasy .character-main .character-resources {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 5px; gap: 5px;
flex: 1; flex: 1;
} }
.lethalfantasy .character-main .character-ressources .character-ressource { .lethalfantasy .character-main .character-resources .character-resource {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.lethalfantasy .character-main .character-ressources .character-ressource .rollable:hover, .lethalfantasy .character-main .character-resources .character-resource .rollable:hover,
.lethalfantasy .character-main .character-ressources .character-ressource .rollable:focus { .lethalfantasy .character-main .character-resources .character-resource .rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary); text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer; cursor: pointer;
} }
.lethalfantasy .character-main .character-ressources .character-ressource .form-group { .lethalfantasy .character-main .character-resources .character-resource .form-group {
flex: 1; flex: 1;
padding-left: 5px; padding-left: 5px;
} }
.lethalfantasy .character-main .character-ressources .character-ressource .form-group .form-fields { .lethalfantasy .character-main .character-resources .character-resource .form-group .form-fields {
flex: none; flex: none;
width: 70px; width: 70px;
} }
.lethalfantasy .character-main .character-ressources .character-ressource .character-ressource-edit { .lethalfantasy .character-main .character-resources .character-resource .character-resource-edit {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
margin-left: 10px; margin-left: 10px;
} }
.lethalfantasy .character-main .character-ressources .character-ressource .character-ressource-edit input { .lethalfantasy .character-main .character-resources .character-resource .character-resource-edit input {
display: flex; display: flex;
width: 70px; width: 70px;
font-size: calc(var(--font-size-standard) * 1.4); font-size: calc(var(--font-size-standard) * 1.4);
@ -329,19 +308,19 @@ i.lethalfantasy {
justify-content: center; justify-content: center;
padding: 0 5px 0 5px; padding: 0 5px 0 5px;
} }
.lethalfantasy .character-main .character-ressources .character-ressource .character-ressource-edit input[type="number"] { .lethalfantasy .character-main .character-resources .character-resource .character-resource-edit input[type="number"] {
text-align: center; text-align: center;
} }
.lethalfantasy .character-main .character-ressources .character-ressource .character-ressource-edit select { .lethalfantasy .character-main .character-resources .character-resource .character-resource-edit select {
font-family: var(--font-secondary); font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.5); font-size: calc(var(--font-size-standard) * 1.5);
text-align: center; text-align: center;
width: 75px; width: 75px;
} }
.lethalfantasy .character-main .character-ressources-play { .lethalfantasy .character-main .character-resources-play {
min-width: 235px; min-width: 235px;
} }
.lethalfantasy .character-main .character-ressources-edit { .lethalfantasy .character-main .character-resources-edit {
min-width: 400px; min-width: 400px;
} }
.lethalfantasy .character-biography prose-mirror.inactive { .lethalfantasy .character-biography prose-mirror.inactive {
@ -350,74 +329,118 @@ i.lethalfantasy {
.lethalfantasy .character-biography prose-mirror.active { .lethalfantasy .character-biography prose-mirror.active {
min-height: 150px; min-height: 150px;
} }
.lethalfantasy .tab.character-items { .lethalfantasy .tab.character-skills {
display: grid; display: grid;
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
.lethalfantasy .tab.character-items legend a { .lethalfantasy .tab.character-skills legend a {
font-size: calc(var(--font-size-standard) * 1.4); font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px; padding-left: 5px;
} }
.lethalfantasy .tab.character-items .talents { .lethalfantasy .tab.character-skills .skills {
display: grid; display: grid;
grid-template-columns: repeat(5, 1fr); grid-template-columns: repeat(5, 1fr);
gap: 10px; gap: 10px;
} }
.lethalfantasy .tab.character-items .talents .talent { .lethalfantasy .tab.character-skills .skills .skill {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
} }
.lethalfantasy .tab.character-items .talents .talent .item-img { .lethalfantasy .tab.character-skills .skills .skill .item-img {
width: 50px; width: 50px;
height: 50px; height: 50px;
} }
.lethalfantasy .tab.character-items .weapons { .lethalfantasy .tab.character-skills .gifts {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 10px;
}
.lethalfantasy .tab.character-skills .gifts .gift {
display: flex;
align-items: center;
gap: 10px;
}
.lethalfantasy .tab.character-skills .gifts .gift .item-img {
width: 50px;
height: 50px;
}
.lethalfantasy .tab.character-skills .vulnerabilities {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 10px;
}
.lethalfantasy .tab.character-skills .vulnerabilities .vulnerability {
display: flex;
align-items: center;
gap: 10px;
}
.lethalfantasy .tab.character-skills .vulnerabilities .vulnerability .item-img {
width: 50px;
height: 50px;
}
.lethalfantasy .tab.character-weapons {
display: grid;
grid-template-columns: 1fr;
}
.lethalfantasy .tab.character-weapons legend a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
.lethalfantasy .tab.character-weapons .weapons {
display: grid; display: grid;
grid-template-columns: repeat(4, 1fr); grid-template-columns: repeat(4, 1fr);
gap: 10px; gap: 10px;
} }
.lethalfantasy .tab.character-items .weapons .weapon { .lethalfantasy .tab.character-weapons .weapons .weapon {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
} }
.lethalfantasy .tab.character-items .weapons .weapon .item-img { .lethalfantasy .tab.character-weapons .weapons .weapon .item-img {
width: 50px; width: 50px;
height: 50px; height: 50px;
margin: 5px 0 0 0; margin: 5px 0 0 0;
} }
.lethalfantasy .tab.character-items .armors { .lethalfantasy .tab.character-weapons .armors {
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);
gap: 10px; gap: 10px;
} }
.lethalfantasy .tab.character-items .armors .armor { .lethalfantasy .tab.character-weapons .armors .armor {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
} }
.lethalfantasy .tab.character-items .armors .armor .item-img { .lethalfantasy .tab.character-weapons .armors .armor .item-img {
width: 50px; width: 50px;
height: 50px; height: 50px;
margin: 5px 0 0 0; margin: 5px 0 0 0;
} }
.lethalfantasy .tab.character-items .spells { .lethalfantasy .tab.character-spells {
display: grid;
grid-template-columns: 1fr;
}
.lethalfantasy .tab.character-spells legend a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
.lethalfantasy .tab.character-spells .spells {
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);
gap: 10px; gap: 10px;
} }
.lethalfantasy .tab.character-items .spells .spell { .lethalfantasy .tab.character-spells .spells .spell {
display: flex; display: flex;
gap: 10px; gap: 10px;
} }
.lethalfantasy .tab.character-items .appris { .lethalfantasy .tab.character-spells .appris {
font-weight: bold; font-weight: bold;
} }
.lethalfantasy .tab.character-items prose-mirror.inactive { .lethalfantasy .tab.character-spells prose-mirror.inactive {
min-height: 40px; min-height: 40px;
} }
.lethalfantasy .tab.character-items prose-mirror.active { .lethalfantasy .tab.character-spells prose-mirror.active {
min-height: 150px; min-height: 150px;
} }
.lethalfantasy .opponent-content { .lethalfantasy .opponent-content {

View File

@ -13,11 +13,54 @@
"vulnerability": "Vulnerability", "vulnerability": "Vulnerability",
"save": "Save", "save": "Save",
"equipment": "Equipment" , "equipment": "Equipment" ,
"shield": "Shield" "shield": "Shield",
"miracle": "Miracle"
} }
}, },
"LETHALFANTASY": { "LETHALFANTASY": {
"Miracle": {
"FIELDS": {
"description": {
"label": "Description"
},
"components": {
"verbal": {
"label": "Verbal"
},
"somatic": {
"label": "Somatic"
},
"material": {
"label": "Material"
},
"catalyst": {
"label": "Catalyst"
},
"religious": {
"label": "Religious"
}
},
"level": {
"label": "Level"
},
"prayerTime": {
"label": "Prayer time"
},
"miracleRange": {
"label": "Range"
},
"duration": {
"label": "Duration"
},
"areaAffected": {
"label": "Area affected"
},
"savingThrow": {
"label": "Saving throw"
}
}
},
"Character": { "Character": {
"FIELDS": { "FIELDS": {
"str": { "str": {
@ -59,6 +102,20 @@
"category": { "category": {
"label": "Category" "label": "Category"
}, },
"weaponClass": {
"label": "Class"
},
"weaponBonus": {
"attack": {
"label": "Attack Bonus"
},
"damage": {
"label": "Damage Bonus"
},
"defense": {
"label": "Defense Bonus"
}
},
"bonus" :{ "bonus" :{
"label": "Bonus" "label": "Bonus"
}, },
@ -101,6 +158,20 @@
"melee": "Melee", "melee": "Melee",
"ranged": "Ranged" "ranged": "Ranged"
}, },
"WeaponClass": {
"longblade": "Long blade",
"shortblade": "Short blade",
"mediumblade": "Medium blade",
"axe": "Axe",
"hammer": "Hammer",
"polearm": "Polearm",
"thrown": "Thrown",
"bow": "Bow",
"flail": "Flail",
"sling": "Sling",
"unarmed": "Unarmed",
"mace": "Mace"
},
"FIELDS": { "FIELDS": {
"weaponType": { "weaponType": {
"label": "Type" "label": "Type"
@ -147,7 +218,7 @@
"defense": { "defense": {
"label": "Defense" "label": "Defense"
}, },
"range": { "weaponRange": {
"pointBlank": { "pointBlank": {
"label": "Point blank" "label": "Point blank"
}, },
@ -299,7 +370,7 @@
"castingTime": { "castingTime": {
"label": "Casting time" "label": "Casting time"
}, },
"range": { "spellRange": {
"label": "Range" "label": "Range"
}, },
"duration": { "duration": {
@ -344,54 +415,45 @@
"Platinums": "Platinum" "Platinums": "Platinum"
}, },
"Label": { "Label": {
"characteristics": "Characteristics",
"characteristic": "Characteristic",
"description": "Description", "description": "Description",
"notes": "Notes",
"total": "Total", "total": "Total",
"langues": "Langues", "details": "Details",
"profil": "Profil", "skills": "Skills",
"details": "Détails", "equipment": "Equipment",
"talents": "Talents", "weapons": "Weapons",
"progressionPossible": "Progression possible", "spells" : "Spells",
"equipement": "Equipement", "level": "Level",
"spells" : "Sortilèges", "damage": "Damage",
"level": "Niveau", "resource": "Resource",
"degats": "Dégâts", "resources": "Resources",
"ressource": "Ressource", "save": "Save",
"sauvegarde": "Sauvegarde", "newArmor": "New armor",
"newArmor": "Nouvelle armure", "newWeapon": "New weapon",
"newWeapon": "Nouvelle arme", "armor": "Armor",
"armor": "Armure",
"malus": "Malus", "malus": "Malus",
"jet": "Jet de ", "jet": "Roll",
"progress": "Progression", "experience": "Experience",
"hasProgressed": "A progressé dans la caractéristique", "maximum": "Maximum",
"noProgress": "N'a pas progressé dans la caractéristique", "pc": "PC",
"experience": "Expérience", "biography": "Biography",
"experienceDetail": "Expérience {detail}", "gifts": "Gifts",
"maximum": "Maximum" "vulnerabilities": "Vulnerabilities",
"str": "STR",
"wis": "WIS",
"int": "INT",
"con": "CON",
"dex": "DEX",
"luc": "LUC",
"app": "APP",
"cha": "CHA"
}, },
"Edit": "Editer", "Edit": "Edit",
"Delete": "Supprimer", "Delete": "Delete",
"ToggleSheet": "Changer de mode", "ToggleSheet": "Toggle mode",
"Warning": { "Warning": {
"dejaDeuxVoies": "Vous avez déjà choisi deux voies",
"dejaVoieMajeure": "Vous avez déjà choisi cette voie comme voie majeure",
"voieMajeureAjoutee": "Voie majeure ajoutée",
"voieMineureAjoutee": "Voie mineure ajoutée",
"voieMajeureSupprimee": "Voie majeure supprimée",
"voieMineureSupprimee": "Voie mineure supprimée",
"plusDeRessource": "Vous n'avez plus de ressource {ressource}"
},
"Dialog": {
"ajoutVoieMajeure": "Ajouter une voie majeure va automatiquement remplacer les caractéristiques, les ressources, les langues et les biens. Continuer ?",
"ajoutVoieMajeureTitre": "Ajout d'une voie majeure",
"ajoutVoieMineureTitre": "Ajout d'une voie mineure",
"suppressionTalents": "Supprimer cette voie va supprimer les talents associés. Continuer ?",
"talentDansVoie": "Ce talent est présent dans la voie {path}. Voulez-vous vraiment le supprimer ?",
"titleSave": "Jet de sauvegarde",
"titleResource": "Jet de ressource",
"titleDamage": "Jet de dégâts",
"titleAttack": "Jet d'attaque",
"titleStandard": "Jet standard"
}, },
"Roll": { "Roll": {
"save": "Jet de sauvegarde <br> {save}", "save": "Jet de sauvegarde <br> {save}",
@ -415,11 +477,9 @@
"displayArmor": "{targetName} a une armure de {targetArmor}. <br>Dégâts réels : {realDamage}" "displayArmor": "{targetName} a une armure de {targetArmor}. <br>Dégâts réels : {realDamage}"
}, },
"Tooltip": { "Tooltip": {
"learnedTalents": "Les talents appris sont en gras", "skill": "Skills list",
"saveIntroTextTooltip": "Caractéristique : {value} <br> Aide : {aide} <br> Gêne : {gene} <br> Modificateur : {modificateur}", "addEquipment": "New equipment",
"addAttack": "Ajouter une attaque", "addSpell": "New spells"
"addEquipment": "Ajouter une arme, Shift + Click pour ajouter une armure",
"addSpell": "Ajouter un sortilège"
}, },
"Setting": { "Setting": {
"displayOpponentMalus": "Afficher le malus d'adversité", "displayOpponentMalus": "Afficher le malus d'adversité",

View File

@ -48,7 +48,8 @@ Hooks.once("init", function () {
spell: models.LethalFantasySpell, spell: models.LethalFantasySpell,
save: models.LethalFantasySave, save: models.LethalFantasySave,
vulnerability: models.LethalFantasyVulnerability, vulnerability: models.LethalFantasyVulnerability,
equipment: models.LethalFantasyEquipment equipment: models.LethalFantasyEquipment,
miracle: models.LethalFantasyMiracle
} }
// Register sheet application classes // Register sheet application classes
@ -66,6 +67,7 @@ Hooks.once("init", function () {
Items.registerSheet("lethalFantasy", applications.LethalFantasyArmorSheet, { types: ["armor"], makeDefault: true }) Items.registerSheet("lethalFantasy", applications.LethalFantasyArmorSheet, { types: ["armor"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyShieldSheet, { types: ["shield"], makeDefault: true }) Items.registerSheet("lethalFantasy", applications.LethalFantasyShieldSheet, { types: ["shield"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyEquipmentSheet, { types: ["equipment"], makeDefault: true }) Items.registerSheet("lethalFantasy", applications.LethalFantasyEquipmentSheet, { types: ["equipment"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyMiracleSheet, { types: ["miracle"], makeDefault: true })
// Other Document Configuration // Other Document Configuration
CONFIG.ChatMessage.documentClass = documents.LethalFantasyChatMessage CONFIG.ChatMessage.documentClass = documents.LethalFantasyChatMessage
@ -193,8 +195,12 @@ Hooks.on("hotbarDrop", (bar, data, slot) => {
* Register world usage statistics * Register world usage statistics
* @param {string} registerKey * @param {string} registerKey
*/ */
function registerWorldCount(registerKey) { async function registerWorldCount(registerKey) {
if (game.user.isGM) { if (game.user.isGM) {
ClassCounter.registerUsageCount(game.system.id, {}) try {
ClassCounter.registerUsageCount(game.system.id, {})
} catch {
console.log("No usage log ")
}
} }
} }

View File

@ -9,4 +9,6 @@ export { default as LethalFantasyArmorSheet } from "./sheets/armor-sheet.mjs"
export { default as LethalFantasySpellSheet } from "./sheets/spell-sheet.mjs" export { default as LethalFantasySpellSheet } from "./sheets/spell-sheet.mjs"
export { default as LethalFantasyEquipmentSheet } from "./sheets/equipment-sheet.mjs" export { default as LethalFantasyEquipmentSheet } from "./sheets/equipment-sheet.mjs"
export { default as LethalFantasyShieldSheet } from "./sheets/shield-sheet.mjs" export { default as LethalFantasyShieldSheet } from "./sheets/shield-sheet.mjs"
export { default as LethalFantasyMiracleSheet } from "./sheets/miracle-sheet.mjs"
export { default as LethalFantasyManager } from "./manager.mjs" export { default as LethalFantasyManager } from "./manager.mjs"

View File

@ -23,10 +23,16 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
template: "systems/fvtt-lethal-fantasy/templates/character-main.hbs", template: "systems/fvtt-lethal-fantasy/templates/character-main.hbs",
}, },
tabs: { tabs: {
template: "systems/fvtt-lethal-fantasy/templates/generic/tab-navigation.hbs", template: "templates/generic/tab-navigation.hbs",
}, },
items: { skills: {
template: "systems/fvtt-lethal-fantasy/templates/character-items.hbs", template: "systems/fvtt-lethal-fantasy/templates/character-skills.hbs",
},
weapons: {
template: "systems/fvtt-lethal-fantasy/templates/character-weapons.hbs",
},
spells: {
template: "systems/fvtt-lethal-fantasy/templates/character-spells.hbs",
}, },
biography: { biography: {
template: "systems/fvtt-lethal-fantasy/templates/character-biography.hbs", template: "systems/fvtt-lethal-fantasy/templates/character-biography.hbs",
@ -35,7 +41,7 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
/** @override */ /** @override */
tabGroups = { tabGroups = {
sheet: "items", sheet: "skills",
} }
/** /**
@ -44,8 +50,10 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
*/ */
#getTabs() { #getTabs() {
const tabs = { const tabs = {
items: { id: "items", group: "sheet", icon: "fa-solid fa-shapes", label: "LETHALFANTASY.Character.Label.details" }, skills: { id: "skills", group: "sheet", icon: "fa-solid fa-shapes", label: "LETHALFANTASY.Label.skills" },
biography: { id: "biography", group: "sheet", icon: "fa-solid fa-book", label: "LETHALFANTASY.Character.Label.biography" }, weapons: { id: "weapons", group: "sheet", icon: "fa-solid fa-swords", label: "LETHALFANTASY.Label.weapons" },
spells: { id: "spells", group: "sheet", icon: "fa-sharp-duotone fa-solid fa-wand-magic-sparkles", label: "LETHALFANTASY.Label.spells" },
biography: { id: "biography", group: "sheet", icon: "fa-solid fa-book", label: "LETHALFANTASY.Label.biography" },
} }
for (const v of Object.values(tabs)) { for (const v of Object.values(tabs)) {
v.active = this.tabGroups[v.group] === v.id v.active = this.tabGroups[v.group] === v.id
@ -78,15 +86,24 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
const doc = this.document const doc = this.document
switch (partId) { switch (partId) {
case "main": case "main":
context.enrichedBiens = await TextEditor.enrichHTML(doc.system.biens, { async: true })
break break
case "items": case "skills":
context.tab = context.tabs.items context.tab = context.tabs.skills
context.weapons = doc.itemTypes.weapon context.skills = doc.itemTypes.skill
context.armors = doc.itemTypes.armor context.gifts = doc.itemTypes.gifts
context.vulnerabilities = doc.itemTypes.vulnerability
break
case "spells":
context.tab = context.tabs.spells
context.spells = doc.itemTypes.spell context.spells = doc.itemTypes.spell
context.hasSpells = context.spells.length > 0 context.hasSpells = context.spells.length > 0
break break
case "weapons":
context.tab = context.tabs.weapons
context.weapons = doc.itemTypes.weapon
context.armors = doc.itemTypes.armor
context.equipments = doc.itemTypes.equipment
break
case "biography": case "biography":
context.tab = context.tabs.biography context.tab = context.tabs.biography
context.enrichedDescription = await TextEditor.enrichHTML(doc.system.description, { async: true }) context.enrichedDescription = await TextEditor.enrichHTML(doc.system.description, { async: true })
@ -111,11 +128,7 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
switch (data.type) { switch (data.type) {
case "Item": case "Item":
const item = await fromUuid(data.uuid) const item = await fromUuid(data.uuid)
if (!["path", "weapon", "armor", "spell"].includes(item.type)) return return this._onDropItem(item)
if (item.type === "path") return this.#onDropPathItem(item)
if (item.type === "weapon") return super._onDropItem(item)
if (item.type === "armor") return this._onDropItem(item)
if (item.type === "spell") return this._onDropItem(item)
} }
} }

View File

@ -0,0 +1,21 @@
import LethalFantasyItemSheet from "./base-item-sheet.mjs"
export default class LethalFantasyMiracleSheet extends LethalFantasyItemSheet {
/** @override */
static DEFAULT_OPTIONS = {
classes: ["miracle"],
position: {
width: 450,
},
window: {
contentClasses: ["miracle-content"],
},
}
/** @override */
static PARTS = {
main: {
template: "systems/fvtt-lethal-fantasy/templates/miracle.hbs",
},
}
}

View File

@ -1,7 +1,7 @@
export const CHARACTERISTICS = Object.freeze({ export const CHARACTERISTICS = Object.freeze({
str: { str: {
id: "str", id: "str",
label: "LETHALFANTASY.Character.str.label" label: "LETHALFANTASY.Label.str"
}, },
int: { int: {
id: "int", id: "int",
@ -23,6 +23,10 @@ export const CHARACTERISTICS = Object.freeze({
id: "cha", id: "cha",
label: "LETHALFANTASY.Character.cha.label" label: "LETHALFANTASY.Character.cha.label"
}, },
luc: {
id: "luc",
label: "LETHALFANTASY.Character.luc.label"
},
app: { app: {
id: "app", id: "app",
label: "LETHALFANTASY.Character.app.label" label: "LETHALFANTASY.Character.app.label"

File diff suppressed because it is too large Load Diff

View File

@ -4,20 +4,11 @@ import * as ARMOR from "./armor.mjs"
import * as SPELL from "./spell.mjs" import * as SPELL from "./spell.mjs"
import * as SKILL from "./skill.mjs" import * as SKILL from "./skill.mjs"
import * as EQUIPMENT from "./equipment.mjs" import * as EQUIPMENT from "./equipment.mjs"
import * as CHARACTERISTICS from "./characteristic-tables.mjs"
export const SYSTEM_ID = "fvtt-lethal-fantasy" export const SYSTEM_ID = "fvtt-lethal-fantasy"
export const DEV_MODE = false export const DEV_MODE = false
export const DICE_VALUE = Object.freeze({
D4: "d4",
D6: "d6",
D8: "d8",
D10: "d10",
D12: "d12",
})
export const DICE_VALUES = ["0", "d4", "d6", "d8", "d10", "d12"]
export const ROLL_TYPE = Object.freeze({ export const ROLL_TYPE = Object.freeze({
SAVE: "save", SAVE: "save",
RESOURCE: "resource", RESOURCE: "resource",
@ -77,15 +68,15 @@ export const ASCII = `
export const SYSTEM = { export const SYSTEM = {
id: SYSTEM_ID, id: SYSTEM_ID,
CHARACTERISTICS: CHARACTER.CHARACTERISTICS, CHARACTERISTICS: CHARACTER.CHARACTERISTICS,
RESOURCES: CHARACTER.RESOURCES, CHARACTERISTICS_TABLES: CHARACTERISTICS.TABLES,
CHARACTERISTICS_MAJOR: CHARACTERISTICS.MAJOR,
SAVES: CHARACTER.SAVES, SAVES: CHARACTER.SAVES,
SKILL_CATEGORY: SKILL.CATEGORY, SKILL_CATEGORY: SKILL.CATEGORY,
WEAPON_CATEGORY: WEAPON.CATEGORY,
WEAPON_DAMAGE: WEAPON.DAMAGE,
ARMOR_TYPE: ARMOR.TYPE, ARMOR_TYPE: ARMOR.TYPE,
EQUIPMENT_CATEGORY: EQUIPMENT.CATEGORY, EQUIPMENT_CATEGORY: EQUIPMENT.CATEGORY,
SPELL_RANGE: SPELL.RANGE, SPELL_RANGE: SPELL.RANGE,
WEAPON_TYPE: WEAPON.WEAPON_TYPE, WEAPON_TYPE: WEAPON.WEAPON_TYPE,
WEAPON_CLASS: WEAPON.WEAPON_CLASS,
MONEY, MONEY,
ASCII, ASCII,
ROLL_TYPE, ROLL_TYPE,

View File

@ -1,35 +1,20 @@
export const CATEGORY = Object.freeze({
mains: {
id: "mains",
label: "LETHALFANTASY.Weapon.Category.main",
},
improvisee: {
id: "improvisee",
label: "LETHALFANTASY.Weapon.Category.improvisee",
},
courte: {
id: "courte",
label: "LETHALFANTASY.Weapon.Category.courte",
},
longue: {
id: "longue",
label: "LETHALFANTASY.Weapon.Category.longue",
},
lourde: {
id: "lourde",
label: "LETHALFANTASY.Weapon.Category.lourde",
},
})
export const WEAPON_TYPE = { export const WEAPON_TYPE = {
"melee": "LETHALFANTASY.Weapon.WeaponType.melee", "melee": "LETHALFANTASY.Weapon.WeaponType.melee",
"ranged": "LETHALFANTASY.Weapon.WeaponType.ranged" "ranged": "LETHALFANTASY.Weapon.WeaponType.ranged"
} }
export const DAMAGE = Object.freeze({ export const WEAPON_CLASS = {
UN: "1", "longblade": "LETHALFANTASY.Weapon.WeaponClass.longblade",
D4: "d4", "shortblade": "LETHALFANTASY.Weapon.WeaponClass.shortblade",
D6: "d6", "mediumblade": "LETHALFANTASY.Weapon.WeaponClass.mediumblade",
D8: "d8", "axe": "LETHALFANTASY.Weapon.WeaponClass.axe",
D10: "d10", "hammer": "LETHALFANTASY.Weapon.WeaponClass.hammer",
}) "mace": "LETHALFANTASY.Weapon.WeaponClass.mace",
"flail": "LETHALFANTASY.Weapon.WeaponClass.flail",
"bow": "LETHALFANTASY.Weapon.WeaponClass.bow",
"sling": "LETHALFANTASY.Weapon.WeaponClass.sling",
"thrown": "LETHALFANTASY.Weapon.WeaponClass.thrown",
"polearm": "LETHALFANTASY.Weapon.WeaponClass.polearm",
"unarmed" : "LETHALFANTASY.Weapon.WeaponClass.unarmed"
}

View File

@ -1 +1,19 @@
export default class LethalFantasyItem extends Item {} export const defaultItemImg = {
weapon: "systems/fvtt-lethal-fantasy/assets/icons/icon_weapon.webp",
armor: "systems/fvtt-lethal-fantasy/assets/icons/icon_armor.webp",
equipment: "systems/fvtt-lethal-fantasy/assets/icons/icon_equipment.webp",
skill: "systems/fvtt-lethal-fantasy/assets/icons/icon_skill.webp",
gift: "systems/fvtt-lethal-fantasy/assets/icons/icon_gift.webp",
invulnerability: "systems/fvtt-lethal-fantasy/assets/icons/icon_invulnerability.webp",
shield: "systems/fvtt-lethal-fantasy/assets/icons/icon_shield.webp",
spell: "systems/fvtt-lethal-fantasy/assets/icons/icon_spell.webp"
}
export default class LethalFantasyItem extends Item {
constructor(data, context) {
if (!data.img) {
data.img = defaultItemImg[data.type];
}
super(data, context);
}
}

View File

@ -9,3 +9,4 @@ export { default as LethalFantasyGift } from "./gift.mjs"
export { default as LethalFantasyVulnerability } from "./vulnerability.mjs" export { default as LethalFantasyVulnerability } from "./vulnerability.mjs"
export { default as LethalFantasySave } from "./save.mjs" export { default as LethalFantasySave } from "./save.mjs"
export { default as LethalFantasyEquipment } from "./equipment.mjs" export { default as LethalFantasyEquipment } from "./equipment.mjs"
export { default as LethalFantasyMiracle } from "./miracle.mjs"

View File

@ -52,6 +52,7 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
bonus: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) bonus: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
}) })
schema.grit = new fields.SchemaField({ schema.grit = new fields.SchemaField({
starting: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
earned: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), earned: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
current: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) current: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 })
}) })
@ -87,6 +88,17 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
/** @override */ /** @override */
static LOCALIZATION_PREFIXES = ["LETHALFANTASY.Character"] static LOCALIZATION_PREFIXES = ["LETHALFANTASY.Character"]
prepareDerivedData() {
super.prepareDerivedData();
let grit = 0
for (let c in this.characteristics) {
if (SYSTEM.CHARACTERISTICS_MAJOR[c.id]) {
grit += this.characteristics[c].value
}
}
this.grit.starting = Math.round(grit / 6)
}
/** /**
* Rolls a dice for a character. * Rolls a dice for a character.
* @param {("save"|"resource|damage")} rollType The type of the roll. * @param {("save"|"resource|damage")} rollType The type of the roll.

View File

@ -1,5 +1,5 @@
import { SYSTEM } from "../config/system.mjs" import { SYSTEM } from "../config/system.mjs"
import { CATEGORY } from "../config/weapon.mjs"
export default class LethalFantasyEquipment extends foundry.abstract.TypeDataModel { export default class LethalFantasyEquipment extends foundry.abstract.TypeDataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields const fields = foundry.data.fields

38
module/models/miracle.mjs Normal file
View File

@ -0,0 +1,38 @@
import { SYSTEM } from "../config/system.mjs"
export default class LethalFantasyMiracle extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const requiredInteger = { required: true, nullable: false, integer: true }
const schema = {}
schema.description = new fields.HTMLField({
required: false,
blank: true,
initial: "",
textSearch: true,
})
schema.level = new fields.NumberField({
...requiredInteger,
initial: 1,
min: 1,
max: 20,
})
schema.components = new fields.SchemaField({
verbal: new fields.BooleanField(),
somatic: new fields.BooleanField(),
material: new fields.BooleanField(),
catalyst: new fields.BooleanField(),
religious: new fields.BooleanField()
})
schema.prayerTime = new fields.StringField({ required: true, initial: "" })
schema.miracleRange = new fields.StringField({ required: true, initial: "" })
schema.areaAffected = new fields.StringField({ required: true, initial: "" })
schema.duration = new fields.StringField({ required: true, initial: "" })
schema.savingThrow = new fields.StringField({ required: true, initial: "" })
return schema
}
/** @override */
static LOCALIZATION_PREFIXES = ["LETHALFANTASY.Miracle"]
}

View File

@ -12,6 +12,13 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
schema.bonus = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) schema.bonus = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.cost = new fields.NumberField({ ...requiredInteger,required: true, initial: 0, min: 0 }) schema.cost = new fields.NumberField({ ...requiredInteger,required: true, initial: 0, min: 0 })
schema.weaponClass = new fields.StringField({ required: true, initial: "shortblade", choices: SYSTEM.WEAPON_CLASS })
schema.weaponBonus = new fields.SchemaField({
attack: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
defense: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
damage: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
})
return schema return schema
} }
@ -21,10 +28,30 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
get skillCategory() { get skillCategory() {
return game.i18n.localize(CATEGORY[this.category].label) return game.i18n.localize(CATEGORY[this.category].label)
} }
validate(options) {
let isError = super.validate(options)
console.log(this)
let bonus = this._source.weaponBonus.attack + this._source.weaponBonus.defense + this._source.weaponBonus.damage
console.log(bonus, this._source.skillTotal)
if ( bonus > Math.floor(this._source.skillTotal / 10) ) {
ui.notifications.error(game.i18n.localize("LETHALFANTASY.Skill.error.weaponBonus"))
isError = true
}
return isError
}
prepareDerivedData() { prepareDerivedData() {
super.prepareDerivedData(); super.prepareDerivedData();
this.skillTotal = this.computeBase(); this.skillTotal = this.computeBase();
if( this.category === "weapon" ) {
this.totalBonus = this.weaponBonus.attack + this.weaponBonus.defense + this.weaponBonus.damage;
if ( Number(this.skillTotal) ) {
this.availableBonus = Math.max( Math.floor(this.skillTotal / 10) - 1, 0 )
} else {
this.availableBonus = "N/A"
}
}
} }
computeBase() { computeBase() {
@ -47,7 +74,7 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
maxStat = statValue; maxStat = statValue;
} }
} }
return maxStat; return maxStat + this.bonus
} else { } else {
// Split with + calculate the total // Split with + calculate the total
baseSplit = base.split("+"); baseSplit = base.split("+");
@ -59,9 +86,9 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
const statValue = actor.system.characteristics[stat.toLowerCase()]?.value || 0; const statValue = actor.system.characteristics[stat.toLowerCase()]?.value || 0;
total += statValue; total += statValue;
} }
return total return total + this.bonus
} }
} }
return `${this.base } + ${ String(this.bonus)}`; return `${this.base} + ${String(this.bonus)}`;
} }
} }

View File

@ -25,7 +25,7 @@ export default class LethalFantasySpell extends foundry.abstract.TypeDataModel {
material: new fields.BooleanField(), material: new fields.BooleanField(),
}) })
schema.castingTime = new fields.StringField({ required: true, initial: "" }) schema.castingTime = new fields.StringField({ required: true, initial: "" })
schema.range = new fields.StringField({ required: true, initial: "" }) schema.spellRange = new fields.StringField({ required: true, initial: "" })
schema.areaAffected = new fields.StringField({ required: true, initial: "" }) schema.areaAffected = new fields.StringField({ required: true, initial: "" })
schema.duration = new fields.StringField({ required: true, initial: "" }) schema.duration = new fields.StringField({ required: true, initial: "" })
schema.savingThrow = new fields.StringField({ required: true, initial: "" }) schema.savingThrow = new fields.StringField({ required: true, initial: "" })

View File

@ -1,5 +1,5 @@
import { SYSTEM } from "../config/system.mjs" import { SYSTEM } from "../config/system.mjs"
import { CATEGORY } from "../config/weapon.mjs"
export default class LethalFantasySkill extends foundry.abstract.TypeDataModel { export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields const fields = foundry.data.fields
@ -8,6 +8,8 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
schema.description = new fields.HTMLField({ required: true, textSearch: true }) schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.weaponType = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_TYPE }) schema.weaponType = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_TYPE })
schema.weaponClass = new fields.StringField({ required: true, initial: "shortblade", choices: SYSTEM.WEAPON_CLASS })
schema.damageType = new fields.SchemaField({ schema.damageType = new fields.SchemaField({
typeP: new fields.BooleanField(), typeP: new fields.BooleanField(),
typeB: new fields.BooleanField(), typeB: new fields.BooleanField(),
@ -29,7 +31,7 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
}) })
schema.defense = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }) schema.defense = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.range = new fields.SchemaField({ schema.weaponRange = new fields.SchemaField({
pointBlank: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), pointBlank: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
short: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), short: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
medium: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }), medium: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
@ -49,6 +51,6 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
static LOCALIZATION_PREFIXES = ["LETHALFANTASY.Weapon"] static LOCALIZATION_PREFIXES = ["LETHALFANTASY.Weapon"]
get weaponCategory() { get weaponCategory() {
return game.i18n.localize(CATEGORY[this.category].label) return game.i18n.localize(CATEGORY[this.weaponType].label)
} }
} }

View File

@ -1,23 +1,13 @@
import { DICE_VALUES } from "./config/system.mjs"
export default class LethalFantasyUtils { export default class LethalFantasyUtils {
// Return the maximum damage limited by the maximum damage of the character // Return the maximum damage limited by the maximum damage of the character
static maxDamage(damage, damageMax) { static maxDamage(damage, damageMax) {
const damageIndex = DICE_VALUES.indexOf(damage)
const damageMaxIndex = DICE_VALUES.indexOf(damageMax)
// If damage exceeds damageMax, return damageMax
if (damageIndex > damageMaxIndex) {
return damageMax
}
// Otherwise, return damage (as it is less than or equal to damageMax) // Otherwise, return damage (as it is less than or equal to damageMax)
return damage return 0
} }
// Used when a ressource is lost to find the next lower dice // Used when a ressource is lost to find the next lower dice
static findLowerDice(dice) { static findLowerDice(dice) {
let index = DICE_VALUES.indexOf(dice) return 0
return DICE_VALUES[index - 1]
} }
} }

View File

@ -7,17 +7,17 @@
.character-main { .character-main {
display: flex; display: flex;
.character-personnage { .character-pc {
display: flex; display: flex;
gap: 10px; gap: 10px;
flex: 1; flex: 1;
.character-gauche { .character-left {
min-width: 180px; min-width: 180px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.character-gauche-image { .character-left-image {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
@ -29,13 +29,7 @@
} }
} }
.character-dv, .character-hp-edit {
.character-dmax {
.form-fields {
flex: none;
}
}
.character-dmax-edit {
input { input {
display: flex; display: flex;
width: 60px; width: 60px;
@ -48,7 +42,7 @@
} }
} }
.character-droite { .character-right {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 5px; gap: 5px;
@ -68,30 +62,11 @@
label { label {
min-width: 120px; min-width: 120px;
} }
.character-hp {
.character-voie-majeure,
.character-voie-mineure {
display: flex;
input {
width: 280px;
}
.controls {
padding-left: 5px;
}
}
.character-commanditaire {
display: flex;
input {
width: 280px;
}
}
.character-pv {
display: flex; display: flex;
gap: 2px; gap: 2px;
align-items: center; align-items: center;
.character-pv-value { .character-hp-value {
.form-fields input { .form-fields input {
flex: none; flex: none;
width: 50px; width: 50px;
@ -99,7 +74,7 @@
font-size: calc(var(--font-size-standard) * 1.4); font-size: calc(var(--font-size-standard) * 1.4);
} }
} }
.character-pv-max { .character-hp-max {
clear: both; clear: both;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@ -112,7 +87,7 @@
font-size: calc(var(--font-size-standard) * 1.4); font-size: calc(var(--font-size-standard) * 1.4);
} }
} }
.pv-separator { .hp-separator {
font-size: calc(var(--font-size-standard) * 1.2); font-size: calc(var(--font-size-standard) * 1.2);
display: flex; display: flex;
align-items: center; align-items: center;
@ -123,21 +98,21 @@
} }
} }
.character-personnage-play { .character-pc-play {
min-width: 500px; min-width: 500px;
} }
.character-personnage-edit { .character-pc-edit {
min-width: 650px; min-width: 650px;
} }
.character-caracteristiques { .character-characteristics {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 5px; gap: 5px;
flex: 1; flex: 1;
.character-caracteristique { .character-characteristic {
display: flex; display: flex;
align-items: center; align-items: center;
.rollable:hover, .rollable:hover,
@ -182,21 +157,21 @@
} }
} }
.character-caracteristiques-play { .character-characteristics-play {
min-width: 225px; min-width: 225px;
} }
.character-caracteristiques-edit { .character-characteristic-edit {
min-width: 400px; min-width: 400px;
} }
.character-ressources { .character-resources {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 5px; gap: 5px;
flex: 1; flex: 1;
.character-ressource { .character-resource {
display: flex; display: flex;
align-items: center; align-items: center;
.rollable:hover, .rollable:hover,
@ -213,7 +188,7 @@
width: 70px; width: 70px;
} }
} }
.character-ressource-edit { .character-resource-edit {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
@ -239,11 +214,11 @@
} }
} }
.character-ressources-play { .character-resources-play {
min-width: 235px; min-width: 235px;
} }
.character-ressources-edit { .character-resources-edit {
min-width: 400px; min-width: 400px;
} }
} }
@ -257,7 +232,7 @@
} }
} }
.tab.character-items { .tab.character-skills {
display: grid; display: grid;
grid-template-columns: 1fr; grid-template-columns: 1fr;
legend { legend {
@ -266,11 +241,11 @@
padding-left: 5px; padding-left: 5px;
} }
} }
.talents { .skills {
display: grid; display: grid;
grid-template-columns: repeat(5, 1fr); grid-template-columns: repeat(5, 1fr);
gap: 10px; gap: 10px;
.talent { .skill {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 10px;
@ -280,6 +255,45 @@
} }
} }
} }
.gifts {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 10px;
.gift {
display: flex;
align-items: center;
gap: 10px;
.item-img {
width: 50px;
height: 50px;
}
}
}
.vulnerabilities {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 10px;
.vulnerability {
display: flex;
align-items: center;
gap: 10px;
.item-img {
width: 50px;
height: 50px;
}
}
}
}
.tab.character-weapons {
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
}
.weapons { .weapons {
display: grid; display: grid;
grid-template-columns: repeat(4, 1fr); grid-template-columns: repeat(4, 1fr);
@ -310,6 +324,18 @@
} }
} }
} }
}
.tab.character-spells {
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
}
.spells { .spells {
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);

View File

@ -1,24 +1,10 @@
@font-face { @font-face {
font-family: "Cat Franken"; font-family: "TimesNewRoman";
src: url("../fonts/catfranken-deutsch.ttf") format("truetype"); src: url("../assets/fonts/times-new-roman-regular.ttf") format("truetype");
} }
@font-face { @font-face {
font-family: "Caslon"; font-family: "BaskervilleBold";
src: url("../fonts/caslonpro-regular.otf") format("truetype"); src: url("../fonts/baskerville-bold.ttf") format("truetype");
} }
@font-face {
font-family: "Caslon Bold";
src: url("../fonts/caslonpro-bold.otf") format("truetype");
}
@font-face {
font-family: "Caslon Bold Italic";
src: url("../fonts/caslonpro-bolditalic.otf") format("truetype");
}
@font-face {
font-family: "Caslon Italic";
src: url("../fonts/caslonpro-italic.otf") format("truetype");
}

View File

@ -14,6 +14,7 @@
@import "chat.less"; @import "chat.less";
@import "equipment.less"; @import "equipment.less";
@import "shield.less"; @import "shield.less";
@import "miracle.less";
} }
@import "roll.less"; @import "roll.less";

View File

@ -1,8 +1,9 @@
:root { :root {
--font-primary: "TimesNewRoman", serif;
--font-size-standard: 1.0rem; --font-size-standard: 1.0rem;
--background-image-base: url("../assets/parchment.jpg"); --background-image-base: url("../assets/ui/lethal_fantasy_background.webp");
--font-secondary: "Amiri", serif; --font-secondary: "BaskervilleBold", serif;
--logo-standard: url("../assets/lethal-fantasy-logo.webp"); --logo-standard: url("../assets/ui/lf_logo_small_02.webp");
} }
#logo { #logo {

17
styles/miracle.less Normal file
View File

@ -0,0 +1,17 @@
.miracle-content {
.sheet-common();
.item-sheet-common();
.header {
display: flex;
img {
width: 50px;
height: 50px;
}
}
label {
flex: 10%;
}
}

View File

@ -51,5 +51,20 @@
"socket": true, "socket": true,
"background": "systems/fvtt-lethal-fantasy/assets/background.webp", "background": "systems/fvtt-lethal-fantasy/assets/background.webp",
"packs": [ "packs": [
] ],
"flags": {
"hotReload": {
"extensions": [
"css",
"hbs",
"json"
],
"paths": [
"css/",
"lang/",
"assets/",
"templates/"
]
}
}
} }

View File

@ -1,14 +1,10 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}"> <section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset> <fieldset>
<legend>{{localize "TENEBRIS.Character.Label.description"}}</legend> <legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}} {{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
</fieldset> </fieldset>
<fieldset> <fieldset>
<legend>{{localize "TENEBRIS.Character.Label.langues"}}</legend> <legend>{{localize "LETHALFANTASY.Label.notes"}}</legend>
{{formInput systemFields.langues enriched=enrichedLangues value=system.langues name="system.langues" toggled=true}}
</fieldset>
<fieldset>
<legend>{{localize "TENEBRIS.Character.Label.notes"}}</legend>
{{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}} {{formInput systemFields.notes enriched=enrichedNotes value=system.notes name="system.notes" toggled=true}}
</fieldset> </fieldset>
</section> </section>

View File

@ -1,103 +0,0 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend data-tooltip="{{localize "TENEBRIS.Tooltip.learnedTalents"}}" data-tooltip-direction="UP">{{localize "TENEBRIS.Label.talents"}}</legend>
<div class="talents">
{{#if @root.isEditMode}}
{{#each talents as |item|}}
{{!log "path-talent" this}}
<div class="talent {{#if item.appris}}appris{{/if}}" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.description}}}<br><br>{{item.path}}" data-tooltip-direction="UP">{{item.name}}
{{#if item.progression}}<span data-tooltip="{{localize 'TENEBRIS.Label.progressionPossible'}}"> (P)</span>{{/if}}
{{#if (and item.progression (gt item.niveau 1))}}{{localize 'TENEBRIS.Label.level'}} {{item.niveau}}{{/if}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'TENEBRIS.Edit'}}" data-action="edit" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'TENEBRIS.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
{{else}}
{{#each talentsAppris as |item|}}
{{!log "path-talent appris" this}}
<div class="talent" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-tooltip="{{{item.description}}}<br><br>{{item.path}}">
{{#if (ne item.img "icons/svg/item-bag.svg")}}
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
{{/if}}
{{item.name}} {{item.details}}
</div>
{{/each}}
{{/if}}
</div>
</fieldset>
<fieldset>
<legend>{{localize "TENEBRIS.Label.equipement"}}{{#if isEditMode}}<a class="action" data-tooltip="{{localize "TENEBRIS.Tooltip.addEquipment"}}" data-tooltip-direction="UP"><i class="fas fa-plus" data-action="createEquipment"></i></a>{{/if}}</legend>
<div class="weapons">
{{#each weapons as |item|}}
{{!log 'weapon' this}}
<div class="weapon" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true" data-drag-type="damage">
{{#if (ne item.img "icons/svg/item-bag.svg")}}
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
{{/if}}
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<a {{#if (ne item.system.degats "1")}}class="rollable" data-item-id="{{item.id}}" data-action="roll" data-roll-type="damage" data-roll-value="{{item.system.degats}}"{{/if}}>{{localize "TENEBRIS.Label.degats"}} : {{item.system.degats}}</a>
{{#if @root.isEditMode}}
<div class="controls">
<a data-tooltip="{{localize 'TENEBRIS.Edit'}}" data-action="edit" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'TENEBRIS.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
{{/if}}
</div>
{{/each}}
</div>
<div class="armors">
{{#each armors as |item|}}
{{!log 'armor' this}}
<div class="armor" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
{{localize "TENEBRIS.Label.armor"}} : {{item.system.valeur}} {{localize "TENEBRIS.Label.malus"}} : {{item.system.malus}}
{{#if @root.isEditMode}}
<div class="controls">
<a data-tooltip="{{localize 'TENEBRIS.Edit'}}" data-action="edit" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'TENEBRIS.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
{{/if}}
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend>{{localize "TENEBRIS.Label.biens"}}</legend>
{{formInput systemFields.biens enriched=enrichedBiens value=system.biens name="system.biens" toggled=true }}
</fieldset>
{{#if (or isEditMode (and isPlayMode hasSpells))}}
<fieldset>
<legend>{{localize "TENEBRIS.Label.spells"}}{{#if isEditMode}}<a class="action" data-tooltip="{{localize "TENEBRIS.Tooltip.addSpell"}}" data-tooltip-direction="UP"><i class="fas fa-plus" data-action="createSpell"></i></a>{{/if}}</legend>
<div class="spells">
{{#each spells as |item|}}
{{!log 'weapon' this}}
<div class="spell" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true" data-drag-type="spell">
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
{{#if @root.isEditMode}}
<div class="controls">
<a data-tooltip="{{localize 'TENEBRIS.Edit'}}" data-action="edit" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'TENEBRIS.Delete'}}" data-action="delete" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
{{/if}}
</div>
{{/each}}
</div>
</fieldset>
{{/if}}
</section>

View File

@ -2,185 +2,108 @@
{{!log "character-main" this}} {{!log "character-main" this}}
<fieldset> <fieldset>
<legend>{{localize "TENEBRIS.Character.Label.personnage"}}</legend> <legend>{{localize "LETHALFANTASY.Label.pc"}}</legend>
<div class="character-personnage character-personnage-{{ifThen isPlayMode 'play' 'edit'}}"> <div class="character-pc character-pc-{{ifThen isPlayMode 'play' 'edit'}}">
<div class="character-gauche"> <div class="character-left">
<div class="character-gauche-image"> <div class="character-left-image">
<img class="character-img" src="{{actor.img}}" data-edit="img" data-action="editImage" data-tooltip="{{actor.name}}" /> <img class="character-img" src="{{actor.img}}" data-edit="img" data-action="editImage"
</div> data-tooltip="{{actor.name}}" />
<div class="character-dv"> </div>
{{formField systemFields.dv value=system.dv rootId=partId disabled=isPlayMode classes="character-dv"}} <div class="flexrow character-hp">
{{formInput systemFields.hp.fields.value value=system.hp.value disabled=isPlayMode classes="character-hp"}}
&nbsp;/&nbsp;
{{formInput systemFields.hp.fields.max value=system.hp.max disabled=isPlayMode classes="character-hp"}}
</div> </div>
<div class="character-dmax" data-tooltip="{{tooltipsCaracteristiques.dmax}}">
{{formField systemFields.dmax.fields.valeur value=system.dmax.valeur rootId=partId disabled=isPlayMode classes="character-dmax"}}
{{#if isEditMode}}
<div class="character-dmax-edit">
<div data-tooltip="{{localize "TENEBRIS.Label.experienceDetail" detail='Dégâts max'}}">{{formInput systemFields.dmax.fields.experience value=system.dmax.experience}}</div>
</div>
{{/if}}
</div>
</div> </div>
<div class="character-droite"> <div class="character-right">
<div class="character-name"> <div class="character-name">
{{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}} {{formInput fields.name value=source.name rootId=partId disabled=isPlayMode}}
<a class="control" data-action="toggleSheet" data-tooltip="TENEBRIS.ToggleSheet" data-tooltip-direction="UP"> <a class="control" data-action="toggleSheet" data-tooltip="LETHALFANTASY.ToggleSheet"
<i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i> data-tooltip-direction="UP">
</a> <i class="fa-solid fa-user-{{ifThen isPlayMode 'lock' 'pen'}}"></i>
</a>
</div> </div>
<div class="character-infos"> <div class="character-infos">
{{#if isEditMode}} </div>
<div class="character-voie-majeure"> </div>
{{formField systemFields.voies.fields.majeure.fields.nom value=system.voies.majeure.nom rootId=partId disabled=true}}
{{#if system.hasVoieMajeure}}
<div class="controls">
<a class="control" data-action="edit" data-item-id="{{actor.system.voies.majeure.id}}" data-tooltip="{{localize 'TENEBRIS.Edit'}}"><i class="fas fa-edit"></i></a>
{{#if (not system.hasVoieMineure)}}
<a class="control" data-action="deleteVoieMajeure" data-tooltip="{{localize 'TENEBRIS.Delete'}}"><i class="fas fa-trash"></i></a>
{{/if}}
</div>
{{/if}}
</div>
<div class="character-voie-mineure">
{{formField systemFields.voies.fields.mineure.fields.nom value=system.voies.mineure.nom rootId=partId disabled=true}}
{{#if system.hasVoieMineure}}
<div class="controls">
<a class="control" data-action="edit" data-item-id="{{actor.system.voies.majeure.id}}" data-tooltip="{{localize 'TENEBRIS.Edit'}}"><i class="fas fa-edit"></i></a>
<a class="control" data-action="deleteVoieMineure" data-tooltip="{{localize 'TENEBRIS.Delete'}}"><i class="fas fa-trash"></i></a>
</div>
{{/if}}
</div>
{{else}}
<div class="character-voie-majeure">
{{formField systemFields.voies.fields.majeure.fields.nom value=system.voies.majeure.nom rootId=partId disabled=true}}
</div>
{{#if system.hasVoieMineure}}
<div class="character-voie-mineure">
{{formField systemFields.voies.fields.mineure.fields.nom value=system.voies.mineure.nom rootId=partId disabled=true}}
</div>
{{/if}}
{{/if}}
<div class="character-commanditaire">
{{formField systemFields.commanditaire value=system.commanditaire rootId=partId disabled=isPlayMode classes="character-commanditaire"}}
</div>
<div class="character-pv">
<div class="character-pv-value">
{{formField systemFields.pv.fields.value value=system.pv.value}}
</div>
<div class="pv-separator">/</div>
<div class="character-pv-max">
{{formInput systemFields.pv.fields.max value=system.pv.max rootId=partId disabled=isPlayMode}}
</div>
</div>
</div>
</div>
</div> </div>
</fieldset> </fieldset>
<fieldset class="character-caracteristiques character-caracteristiques-{{ifThen isPlayMode 'play' 'edit'}}"> <fieldset class="character-characteristics character-characteristics-{{ifThen isPlayMode 'play' 'edit'}}">
<legend>{{localize "TENEBRIS.Character.Label.caracteristiques"}}</legend> <legend>{{localize "LETHALFANTASY.Label.characteristics"}}</legend>
<div class="character-caracteristique" data-drag="true" data-drag-type="save"> <div class="character-characteristic" data-drag="true">
<i class="fa fa-question-circle" aria-hidden="true" data-tooltip="{{tooltipsCaracteristiques.rob}}" style="font-size: small;"></i> {{localize "LETHALFANTASY.Label.str"}}
{{formField systemFields.caracteristiques.fields.rob.fields.valeur value=system.caracteristiques.rob.valeur rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.saveRob}} {{formField systemFields.characteristics.fields.str.fields.value value=system.characteristics.str.value
{{#if isEditMode}} disabled=isPlayMode classes="rollable" data-char-id="str" }}
<div class="experience">
<div data-tooltip="{{localize "TENEBRIS.Label.experience"}}">{{formInput systemFields.caracteristiques.fields.rob.fields.progression.fields.experience value=system.caracteristiques.rob.progression.experience}}</div> {{formField systemFields.characteristics.fields.str.fields.percent value=system.characteristics.str.percent
<div class="experience-progress" data-tooltip="{{localize "TENEBRIS.Label.progress"}}">{{formInput systemFields.caracteristiques.fields.rob.fields.progression.fields.progres value=system.caracteristiques.rob.progression.progres}}</div> disabled=isPlayMode }}
</div>
{{/if}}
</div> </div>
<div class="character-caracteristique" data-drag="true" data-drag-type="save"> <div class="character-characteristic" data-drag="true">
<i class="fa fa-question-circle" aria-hidden="true" data-tooltip="{{tooltipsCaracteristiques.dex}}" style="font-size: small;"></i> {{localize "LETHALFANTASY.Label.int"}}
{{formField systemFields.caracteristiques.fields.dex.fields.valeur value=system.caracteristiques.dex.valeur rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.saveDex}} {{formField systemFields.characteristics.fields.int.fields.value value=system.characteristics.int.value
{{#if isEditMode}} disabled=isPlayMode classes="rollable" data-char-id="int" }}
<div class="experience">
<div data-tooltip="{{localize "TENEBRIS.Label.experience"}}">{{formInput systemFields.caracteristiques.fields.dex.fields.progression.fields.experience value=system.caracteristiques.dex.progression.experience}}</div> {{formField systemFields.characteristics.fields.int.fields.percent value=system.characteristics.int.percent
<div class="experience-progress" data-tooltip="{{localize "TENEBRIS.Label.progress"}}">{{formInput systemFields.caracteristiques.fields.dex.fields.progression.fields.progres value=system.caracteristiques.dex.progression.progres}}</div> disabled=isPlayMode }}
</div>
{{/if}}
</div> </div>
<div class="character-caracteristique" data-drag="true" data-drag-type="save"> <div class="character-characteristic" data-drag="true">
<i class="fa fa-question-circle" aria-hidden="true" data-tooltip="{{tooltipsCaracteristiques.int}}" style="font-size: small;"></i> {{localize "LETHALFANTASY.Label.wis"}}
{{formField systemFields.caracteristiques.fields.int.fields.valeur value=system.caracteristiques.int.valeur rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.saveInt}} {{formField systemFields.characteristics.fields.wis.fields.value value=system.characteristics.wis.value
{{#if isEditMode}} disabled=isPlayMode classes="rollable" data-char-id="wis" }}
<div class="experience">
<div data-tooltip="{{localize "TENEBRIS.Label.experience"}}">{{formInput systemFields.caracteristiques.fields.int.fields.progression.fields.experience value=system.caracteristiques.int.progression.experience}}</div> {{formField systemFields.characteristics.fields.wis.fields.percent value=system.characteristics.wis.percent
<div class="experience-progress" data-tooltip="{{localize "TENEBRIS.Label.progress"}}">{{formInput systemFields.caracteristiques.fields.int.fields.progression.fields.progres value=system.caracteristiques.int.progression.progres}}</div> disabled=isPlayMode }}
</div>
{{/if}}
</div> </div>
<div class="character-caracteristique" data-drag="true" data-drag-type="save"> <div class="character-characteristic" data-drag="true">
<i class="fa fa-question-circle" aria-hidden="true" data-tooltip="{{tooltipsCaracteristiques.per}}" style="font-size: small;"></i> {{localize "LETHALFANTASY.Label.dex"}}
{{formField systemFields.caracteristiques.fields.per.fields.valeur value=system.caracteristiques.per.valeur rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.savePer}} {{formField systemFields.characteristics.fields.dex.fields.value value=system.characteristics.dex.value
{{#if isEditMode}} disabled=isPlayMode classes="rollable" data-char-id="wis" }}
<div class="experience">
<div data-tooltip="{{localize "TENEBRIS.Label.experience"}}">{{formInput systemFields.caracteristiques.fields.per.fields.progression.fields.experience value=system.caracteristiques.per.progression.experience}}</div> {{formField systemFields.characteristics.fields.dex.fields.percent value=system.characteristics.dex.percent
<div class="experience-progress" data-tooltip="{{localize "TENEBRIS.Label.progress"}}">{{formInput systemFields.caracteristiques.fields.per.fields.progression.fields.progres value=system.caracteristiques.per.progression.progres}}</div> disabled=isPlayMode }}
</div>
{{/if}}
</div> </div>
<div class="character-caracteristique" data-drag="true" data-drag-type="save"> <div class="character-characteristic" data-drag="true">
<i class="fa fa-question-circle" aria-hidden="true" data-tooltip="{{tooltipsCaracteristiques.vol}}" style="font-size: small;"></i> {{localize "LETHALFANTASY.Label.con"}}
{{formField systemFields.caracteristiques.fields.vol.fields.valeur value=system.caracteristiques.vol.valeur rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.saveVol}} {{formField systemFields.characteristics.fields.con.fields.value value=system.characteristics.con.value
{{#if isEditMode}} disabled=isPlayMode classes="rollable" data-char-id="con" }}
<div class="experience">
<div data-tooltip="{{localize "TENEBRIS.Label.experience"}}">{{formInput systemFields.caracteristiques.fields.vol.fields.progression.fields.experience value=system.caracteristiques.vol.progression.experience}}</div> {{formField systemFields.characteristics.fields.con.fields.percent value=system.characteristics.con.percent
<div class="experience-progress" data-tooltip="{{localize "TENEBRIS.Label.progress"}}">{{formInput systemFields.caracteristiques.fields.vol.fields.progression.fields.progres value=system.caracteristiques.vol.progression.progres}}</div> disabled=isPlayMode }}
</div> </div>
{{/if}} <div class="character-characteristic" data-drag="true">
{{localize "LETHALFANTASY.Label.cha"}}
{{formField systemFields.characteristics.fields.cha.fields.value value=system.characteristics.cha.value
disabled=isPlayMode classes="rollable" data-char-id="cha" }}
{{formField systemFields.characteristics.fields.cha.fields.percent value=system.characteristics.cha.percent
disabled=isPlayMode }}
</div>
<div class="character-characteristic" data-drag="true">
{{localize "LETHALFANTASY.Label.luc"}}
{{formField systemFields.characteristics.fields.luc.fields.value value=system.characteristics.luc.value
disabled=isPlayMode classes="rollable" data-char-id="luc" }}
{{formField systemFields.characteristics.fields.luc.fields.percent value=system.characteristics.luc.percent
disabled=isPlayMode }}
</div>
<div class="character-characteristic" data-drag="true">
{{localize "LETHALFANTASY.Label.app"}}
{{formField systemFields.characteristics.fields.app.fields.value value=system.characteristics.app.value
disabled=isPlayMode classes="rollable" data-char-id="app" }}
{{formField systemFields.characteristics.fields.app.fields.percent value=system.characteristics.app.percent
disabled=isPlayMode }}
</div> </div>
</fieldset> </fieldset>
<fieldset class="character-ressources character-ressources-{{ifThen isPlayMode 'play' 'edit'}}"> <fieldset class="character-resources character-resources-{{ifThen isPlayMode 'play' 'edit'}}">
<legend>{{localize "TENEBRIS.Character.Label.ressources"}}</legend> <legend>{{localize "LETHALFANTASY.Label.resources"}}</legend>
<div class="character-ressource" data-drag="true" data-drag-type="resource"> <div class="character-resource" data-drag="true" data-drag-type="resource">
<i class="fa fa-question-circle" aria-hidden="true" data-tooltip="{{tooltipsRessources.san}}" style="font-size: small;"></i>
{{formField systemFields.ressources.fields.san.fields.valeur value=system.ressources.san.valeur rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.resourceSan}}
{{#if isEditMode}}
<div class="character-ressource-edit">
{{formInput systemFields.ressources.fields.san.fields.max value=system.ressources.san.max}}
<div data-tooltip="{{localize "TENEBRIS.Label.experience"}}">{{formInput systemFields.ressources.fields.san.fields.experience value=system.ressources.san.experience}}</div>
</div>
{{/if}}
</div> </div>
<div class="character-ressource" data-drag="true" data-drag-type="resource"> <div class="character-resource" data-drag="true" data-drag-type="resource">
<i class="fa fa-question-circle" aria-hidden="true" data-tooltip="{{tooltipsRessources.oeil}}" style="font-size: small;"></i>
{{formField systemFields.ressources.fields.oeil.fields.valeur value=system.ressources.oeil.valeur rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.resourceOeil}}
{{#if isEditMode}}
<div class="character-ressource-edit">
{{formInput systemFields.ressources.fields.oeil.fields.max value=system.ressources.oeil.max}}
<div data-tooltip="{{localize "TENEBRIS.Label.experience"}}">{{formInput systemFields.ressources.fields.oeil.fields.experience value=system.ressources.oeil.experience}}</div>
</div>
{{/if}}
</div> </div>
<div class="character-ressource" data-drag="true" data-drag-type="resource"> <div class="character-resource" data-drag="true" data-drag-type="resource">
<i class="fa fa-question-circle" aria-hidden="true" data-tooltip="{{tooltipsRessources.verbe}}" style="font-size: small;"></i>
{{formField systemFields.ressources.fields.verbe.fields.valeur value=system.ressources.verbe.valeur rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.resourceVerbe}}
{{#if isEditMode}}
<div class="character-ressource-edit">
{{formInput systemFields.ressources.fields.verbe.fields.max value=system.ressources.verbe.max}}
<div data-tooltip="{{localize "TENEBRIS.Label.experience"}}">{{formInput systemFields.ressources.fields.verbe.fields.experience value=system.ressources.verbe.experience}}</div>
</div>
{{/if}}
</div>
<div class="character-ressource" data-drag="true" data-drag-type="resource">
<i class="fa fa-question-circle" aria-hidden="true" data-tooltip="{{tooltipsRessources.bourse}}" style="font-size: small;"></i>
{{formField systemFields.ressources.fields.bourse.fields.valeur value=system.ressources.bourse.valeur rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.resourceBourse}}
{{#if isEditMode}}
<div class="character-ressource-edit">
{{formInput systemFields.ressources.fields.bourse.fields.max value=system.ressources.bourse.max}}
<div data-tooltip="{{localize "TENEBRIS.Label.experience"}}">{{formInput systemFields.ressources.fields.bourse.fields.experience value=system.ressources.bourse.experience}}</div>
</div>
{{/if}}
</div>
<div class="character-ressource" data-drag="true" data-drag-type="resource">
<i class="fa fa-question-circle" aria-hidden="true" data-tooltip="{{tooltipsRessources.magie}}" style="font-size: small;"></i>
{{formField systemFields.ressources.fields.magie.fields.valeur value=system.ressources.magie.valeur rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.resourceMagie}}
{{#if isEditMode}}
<div class="character-ressource-edit">
{{formInput systemFields.ressources.fields.magie.fields.max value=system.ressources.magie.max}}
<div data-tooltip="{{localize "TENEBRIS.Label.experience"}}">{{formInput systemFields.ressources.fields.magie.fields.experience value=system.ressources.magie.experience}}</div>
</div>
{{/if}}
</div> </div>
</fieldset> </fieldset>

View File

@ -0,0 +1,66 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend data-tooltip="{{localize " LETHALFANTASY.Tooltip.skills"}}" data-tooltip-direction="UP">{{localize
"LETHALFANTASY.Label.skills"}}</legend>
<div class="skills">
{{#each skills as |item|}}
<div class="skill " data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.description}}}<br><br>{{item.path}}" data-tooltip-direction="UP">
{{item.name}} +{{item.system.skillTotal}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'LETHALFANTASY.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend data-tooltip="{{localize " LETHALFANTASY.Tooltip.gifts"}}" data-tooltip-direction="UP">{{localize
"LETHALFANTASY.Label.gifts"}}</legend>
<div class="gifts">
{{#each gifts as |item|}}
<div class="gift " data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.description}}}<br><br>{{item.path}}" data-tooltip-direction="UP">
{{item.name}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'LETHALFANTASY.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
<fieldset>
<legend data-tooltip="{{localize " LETHALFANTASY.Tooltip.vulnerabilities"}}" data-tooltip-direction="UP">{{localize
"LETHALFANTASY.Label.vulnerabilities"}}</legend>
<div class="vulnerabilities">
{{#each gifts as |item|}}
<div class="vulnerability " data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.description}}}<br><br>{{item.path}}" data-tooltip-direction="UP">
{{item.name}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'LETHALFANTASY.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
</section>

View File

@ -0,0 +1,26 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.spells"}}{{#if isEditMode}}<a class="action" data-tooltip="{{localize "
LETHALFANTASY.Tooltip.addSpell"}}" data-tooltip-direction="UP"><i class="fas fa-plus"
data-action="createSpell"></i></a>{{/if}}</legend>
<div class="spells">
{{#each spells as |item|}}
{{!log 'weapon' this}}
<div class="spell" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true"
data-drag-type="spell">
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'LETHALFANTASY.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
</section>

View File

@ -0,0 +1,48 @@
<section class="tab character-{{tab.id}} {{tab.cssClass}}" data-tab="{{tab.id}}" data-group="{{tab.group}}">
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.equipment"}}{{#if isEditMode}}<a class="action" data-tooltip="{{localize "
LETHALFANTASY.Tooltip.addEquipment"}}" data-tooltip-direction="UP"><i class="fas fa-plus"
data-action="createEquipment"></i></a>{{/if}}</legend>
<div class="weapons">
{{#each weapons as |item|}}
{{!log 'weapon' this}}
<div class="weapon" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true"
data-drag-type="damage">
{{#if (ne item.img "icons/svg/item-bag.svg")}}
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
{{/if}}
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'LETHALFANTASY.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
<div class="armors">
{{#each armors as |item|}}
{{!log 'armor' this}}
<div class="armor" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}">
<img class="item-img" src="{{item.img}}" data-tooltip="{{item.name}}" />
<div class="name" data-tooltip="{{{item.system.description}}}">
{{item.name}}
</div>
<div class="controls">
<a data-tooltip="{{localize 'LETHALFANTASY.Edit'}}" data-action="edit" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
<a data-tooltip="{{localize 'LETHALFANTASY.Delete'}}" data-action="delete" data-item-id="{{item.id}}"
data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>
</div>
</div>
{{/each}}
</div>
</fieldset>
</section>

29
templates/miracle.hbs Normal file
View File

@ -0,0 +1,29 @@
<section>
<div class="header">
<img class="item-img" src="{{item.img}}" data-edit="img" data-action="editImage" data-tooltip="{{item.name}}" />
{{formInput fields.name value=source.name}}
</div>
{{formField systemFields.level value=system.level}}
<label>Components</label>
<div class="shift-right">
{{formField systemFields.components.fields.verbal value=system.components.verbal}}
{{formField systemFields.components.fields.somatic value=system.components.somatic}}
{{formField systemFields.components.fields.material value=system.components.material}}
{{formField systemFields.components.fields.catalyst value=system.components.catalyst}}
{{formField systemFields.components.fields.religious value=system.components.religious}}
</div>
{{formField systemFields.prayerTime value=system.castingTime}}
{{formField systemFields.miracleRange value=system.spellRange}}
{{formField systemFields.areaAffected value=system.areaAffected}}
{{formField systemFields.duration value=system.duration}}
{{formField systemFields.savingThrow value=system.savingThrow}}
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput systemFields.description enriched=description value=system.description name="system.description" toggled=true}}
</fieldset>
</section>

View File

@ -8,6 +8,16 @@
{{formField systemFields.bonus value=system.bonus}} {{formField systemFields.bonus value=system.bonus}}
{{formField systemFields.cost value=system.cost}} {{formField systemFields.cost value=system.cost}}
{{#if (eq system.category "weapon")}}
{{formField systemFields.weaponClass value=system.weaponClass localize=true}}
<span class="flexrow">
<span><strong>Available Bonus : {{system.availableBonus}}</strong></span>
</span>
{{formField systemFields.weaponBonus.fields.attack value=system.weaponBonus.attack}}
{{formField systemFields.weaponBonus.fields.defense value=system.weaponBonus.defense}}
{{formField systemFields.weaponBonus.fields.damage value=system.weaponBonus.damage}}
{{/if}}
<div class="total flexrow"> <div class="total flexrow">
<legend>{{localize "LETHALFANTASY.Label.total"}}</legend> <legend>{{localize "LETHALFANTASY.Label.total"}}</legend>
{{system.skillTotal}} {{system.skillTotal}}

View File

@ -15,7 +15,7 @@
</div> </div>
{{formField systemFields.castingTime value=system.castingTime}} {{formField systemFields.castingTime value=system.castingTime}}
{{formField systemFields.range value=system.range}} {{formField systemFields.spellRange value=system.spellRange}}
{{formField systemFields.areaAffected value=system.areaAffected}} {{formField systemFields.areaAffected value=system.areaAffected}}
{{formField systemFields.duration value=system.duration}} {{formField systemFields.duration value=system.duration}}
{{formField systemFields.savingThrow value=system.savingThrow}} {{formField systemFields.savingThrow value=system.savingThrow}}

View File

@ -8,18 +8,19 @@
<div class="align-top"> <div class="align-top">
{{formField systemFields.weaponType value=system.weaponType localize=true}} {{formField systemFields.weaponType value=system.weaponType localize=true}}
{{formField systemFields.weaponClass value=system.weaponClass localize=true}}
<label>Damage Type</label> <label>Damage Type</label>
<div class="shift-right"> <div class="shift-right">
{{formField systemFields.damageType.fields.typeP value=system.standing.typeP}} {{formField systemFields.damageType.fields.typeP value=system.damageType.typeP}}
{{formField systemFields.damageType.fields.typeB value=system.standing.typeB}} {{formField systemFields.damageType.fields.typeB value=system.damageType.typeB}}
{{formField systemFields.damageType.fields.typeS value=system.standing.typeS}} {{formField systemFields.damageType.fields.typeS value=system.damageType.typeS}}
</div> </div>
<label>Damage</label> <label>Damage</label>
<div class="shift-right"> <div class="shift-right">
{{formField systemFields.damage.fields.damageS value=system.standing.damageS}} {{formField systemFields.damage.fields.damageS value=system.damage.damageS}}
{{formField systemFields.damage.fields.damageM value=system.standing.damageM}} {{formField systemFields.damage.fields.damageM value=system.damage.damageM}}
</div> </div>
{{formField systemFields.hands value=system.hands localize=true}} {{formField systemFields.hands value=system.hands localize=true}}
@ -45,12 +46,12 @@
<label>Range</label> <label>Range</label>
<div class="shift-right"> <div class="shift-right">
{{formField systemFields.range.fields.pointBlank value=system.range.pointBlank}} {{formField systemFields.weaponRange.fields.pointBlank value=system.weaponRange.pointBlank}}
{{formField systemFields.range.fields.short value=system.range.short}} {{formField systemFields.weaponRange.fields.short value=system.weaponRange.short}}
{{formField systemFields.range.fields.medium value=system.range.medium}} {{formField systemFields.weaponRange.fields.medium value=system.weaponRange.medium}}
{{formField systemFields.range.fields.long value=system.range.long}} {{formField systemFields.weaponRange.fields.long value=system.weaponRange.long}}
{{formField systemFields.range.fields.extreme value=system.range.extreme}} {{formField systemFields.weaponRange.fields.extreme value=system.weaponRange.extreme}}
{{formField systemFields.range.fields.outOfSkill value=system.range.outOfSkill}} {{formField systemFields.weaponRange.fields.outOfSkill value=system.weaponRange.outOfSkill}}
</div> </div>
{{/if}} {{/if}}