Upgrade item sheets

This commit is contained in:
LeRatierBretonnien 2024-12-03 13:51:38 +01:00
parent df8995f8b7
commit 9775ec9fa1
38 changed files with 1095 additions and 506 deletions

BIN
assets/lf_logo_01.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View File

@ -1,5 +1,5 @@
:root {
--font-size-standard: 0.8125rem;
--font-size-standard: 1rem;
--background-image-base: url("../assets/parchment.jpg");
--font-secondary: "Amiri", serif;
--logo-standard: url("../assets/lethal-fantasy-logo.webp");
@ -31,7 +31,7 @@ i.lethalfantasy {
}
.application.dialog.lethalfantasy {
font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1.2);
font-size: calc(var(--font-size-standard) * 1);
background-image: var(--background-image-base);
}
.application.dialog.lethalfantasy button:hover {
@ -53,16 +53,28 @@ i.lethalfantasy {
}
.lethalfantasy .character-sheet-common label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1.2);
}
.lethalfantasy .item-sheet-common .form-fields {
padding-top: 5px;
}
.lethalfantasy .item-sheet-common label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1);
flex: 50%;
}
.lethalfantasy .item-sheet-common .align-top {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .item-sheet-common .shift-right {
margin-left: 2rem;
}
.lethalfantasy .character-content {
font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1);
@ -88,32 +100,32 @@ i.lethalfantasy {
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 2);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
.lethalfantasy .character-content fieldset {
margin-bottom: 10px;
margin-bottom: 5px;
border-radius: 5px;
}
.lethalfantasy .character-content .form-fields input,
.lethalfantasy .character-content .form-fields select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .character-content .form-fields select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .character-content legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
.lethalfantasy .character-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1.2);
}
.lethalfantasy .character-main {
display: flex;
@ -433,26 +445,26 @@ i.lethalfantasy {
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 2);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
.lethalfantasy .opponent-content fieldset {
margin-bottom: 10px;
margin-bottom: 5px;
border-radius: 5px;
}
.lethalfantasy .opponent-content .form-fields input,
.lethalfantasy .opponent-content .form-fields select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .opponent-content .form-fields select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .opponent-content legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
@ -547,26 +559,26 @@ i.lethalfantasy {
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 2);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
.lethalfantasy .skill-content fieldset {
margin-bottom: 10px;
margin-bottom: 5px;
border-radius: 5px;
}
.lethalfantasy .skill-content .form-fields input,
.lethalfantasy .skill-content .form-fields select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .skill-content .form-fields select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .skill-content legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
@ -575,9 +587,21 @@ i.lethalfantasy {
}
.lethalfantasy .skill-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1);
flex: 50%;
}
.lethalfantasy .skill-content .align-top {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .skill-content .shift-right {
margin-left: 2rem;
}
.lethalfantasy .skill-content .header {
display: flex;
}
@ -596,7 +620,7 @@ i.lethalfantasy {
.lethalfantasy .skill-content input[type="checkbox"]:checked::after {
color: rgba(0, 0, 0, 0.1);
}
.lethalfantasy .gifts-content {
.lethalfantasy .gift-content {
font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1);
color: var(--color-dark-1);
@ -604,131 +628,82 @@ i.lethalfantasy {
background-repeat: no-repeat;
background-size: 100% 100%;
}
.lethalfantasy .gifts-content input:disabled,
.lethalfantasy .gifts-content select:disabled {
.lethalfantasy .gift-content input:disabled,
.lethalfantasy .gift-content select:disabled {
background-color: rgba(0, 0, 0, 0.2);
border-color: transparent;
color: var(--color-dark-3);
}
.lethalfantasy .gifts-content input,
.lethalfantasy .gifts-content select {
.lethalfantasy .gift-content input,
.lethalfantasy .gift-content select {
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .gifts-content input[name="name"] {
.lethalfantasy .gift-content input[name="name"] {
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 2);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
.lethalfantasy .gifts-content fieldset {
margin-bottom: 10px;
.lethalfantasy .gift-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
}
.lethalfantasy .gifts-content .form-fields input,
.lethalfantasy .gifts-content .form-fields select {
.lethalfantasy .gift-content .form-fields input,
.lethalfantasy .gift-content .form-fields select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .gifts-content .form-fields select {
.lethalfantasy .gift-content .form-fields select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .gifts-content legend {
.lethalfantasy .gift-content legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
.lethalfantasy .gifts-content .form-fields {
.lethalfantasy .gift-content .form-fields {
padding-top: 5px;
}
.lethalfantasy .gifts-content label {
.lethalfantasy .gift-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1);
flex: 50%;
}
.lethalfantasy .gifts-content .path-name {
.lethalfantasy .gift-content .align-top {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .gift-content .shift-right {
margin-left: 2rem;
}
.lethalfantasy .gift-content .header {
display: flex;
justify-content: space-between;
}
.lethalfantasy .gifts-content .path-name .control {
margin: 5px;
}
.lethalfantasy .gifts-content .path-name img {
.lethalfantasy .gift-content .header img {
width: 50px;
height: 50px;
}
.lethalfantasy .gifts-content .path-main {
display: grid;
grid-template-columns: 2fr 2fr 1fr;
/* Optionnel : supprimer le margin-right sur la dernière colonne si vous avez besoin d'un espacement précis */
.lethalfantasy .gift-content input[type="checkbox"] {
font-size: var(--font-size-14);
width: 20px;
padding-top: 0;
}
.lethalfantasy .gifts-content .path-main .profil {
display: grid;
grid-template-columns: repeat(2, 1fr);
.lethalfantasy .gift-content input[type="checkbox"]:checked {
background-color: rgba(0, 0, 0, 0.1);
}
.lethalfantasy .gifts-content .path-main .profil-gauche,
.lethalfantasy .gifts-content .path-main .profil-droite {
flex: 1;
/* Chaque colonne prend la moitié de l'espace disponible */
padding: 10px;
/* Espacement intérieur */
}
.lethalfantasy .gifts-content .path-main .profil-gauche {
margin-right: 10px;
/* Espace entre les deux colonnes */
}
.lethalfantasy .gifts-content .path-main .profil-droite {
margin-right: 0;
}
.lethalfantasy .gifts-content .path-main .biens prose-mirror {
height: 100%;
}
.lethalfantasy .gifts-content .path-main .langues prose-mirror {
height: 100%;
}
.lethalfantasy .gifts-content .path-main .description {
grid-column: span 3;
}
.lethalfantasy .gifts-content .path-main .description prose-mirror.inactive {
min-height: 40px;
}
.lethalfantasy .gifts-content .path-main .description prose-mirror.active {
min-height: 150px;
}
.lethalfantasy .gifts-content .path-talents {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 10px;
}
.lethalfantasy .gifts-content .path-talents .talent {
background-color: #f0f0f0;
padding: 5px;
border-radius: 5px;
}
.lethalfantasy .gifts-content .path-talents .talent .header {
display: flex;
justify-content: space-between;
}
.lethalfantasy .gifts-content .path-talents .talent .header .name {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.5);
padding-left: 20px;
}
.lethalfantasy .gifts-content .path-talents .talent .header .controls {
font-size: calc(var(--font-size-standard) * 0.8);
}
.lethalfantasy .gifts-content .path-talents .talent .progression {
display: flex;
justify-content: space-between;
padding-top: 10px;
}
.lethalfantasy .gifts-content .path-talents .talent .description {
font-size: calc(var(--font-size-standard) * 1);
.lethalfantasy .gift-content input[type="checkbox"]:checked::after {
color: rgba(0, 0, 0, 0.1);
}
.lethalfantasy .weapon-content {
font-family: var(--font-primary);
@ -754,26 +729,26 @@ i.lethalfantasy {
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 2);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
.lethalfantasy .weapon-content fieldset {
margin-bottom: 10px;
margin-bottom: 5px;
border-radius: 5px;
}
.lethalfantasy .weapon-content .form-fields input,
.lethalfantasy .weapon-content .form-fields select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .weapon-content .form-fields select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .weapon-content legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
@ -782,9 +757,21 @@ i.lethalfantasy {
}
.lethalfantasy .weapon-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1);
flex: 50%;
}
.lethalfantasy .weapon-content .align-top {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .weapon-content .shift-right {
margin-left: 2rem;
}
.lethalfantasy .weapon-content .header {
display: flex;
}
@ -819,26 +806,26 @@ i.lethalfantasy {
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 2);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
.lethalfantasy .armor-content fieldset {
margin-bottom: 10px;
margin-bottom: 5px;
border-radius: 5px;
}
.lethalfantasy .armor-content .form-fields input,
.lethalfantasy .armor-content .form-fields select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .armor-content .form-fields select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .armor-content legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
@ -847,9 +834,21 @@ i.lethalfantasy {
}
.lethalfantasy .armor-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1);
flex: 50%;
}
.lethalfantasy .armor-content .align-top {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .armor-content .shift-right {
margin-left: 2rem;
}
.lethalfantasy .armor-content .header {
display: flex;
}
@ -884,26 +883,26 @@ i.lethalfantasy {
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 2);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
.lethalfantasy .spell-content fieldset {
margin-bottom: 10px;
margin-bottom: 5px;
border-radius: 5px;
}
.lethalfantasy .spell-content .form-fields input,
.lethalfantasy .spell-content .form-fields select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .spell-content .form-fields select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .spell-content legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
@ -912,9 +911,21 @@ i.lethalfantasy {
}
.lethalfantasy .spell-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1);
flex: 50%;
}
.lethalfantasy .spell-content .align-top {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .spell-content .shift-right {
margin-left: 2rem;
}
.lethalfantasy .spell-content .header {
display: flex;
}
@ -925,10 +936,6 @@ i.lethalfantasy {
.lethalfantasy .spell-content label {
flex: 10%;
}
.lethalfantasy .spell-content input[name="system.consequenceA"],
.lethalfantasy .spell-content input[name="system.consequenceB"] {
font-size: calc(var(--font-size-standard) * 1.2);
}
.lethalfantasy .vulnerability-content {
font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1);
@ -953,26 +960,26 @@ i.lethalfantasy {
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 2);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
.lethalfantasy .vulnerability-content fieldset {
margin-bottom: 10px;
margin-bottom: 5px;
border-radius: 5px;
}
.lethalfantasy .vulnerability-content .form-fields input,
.lethalfantasy .vulnerability-content .form-fields select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .vulnerability-content .form-fields select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .vulnerability-content legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
@ -981,9 +988,21 @@ i.lethalfantasy {
}
.lethalfantasy .vulnerability-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1);
flex: 50%;
}
.lethalfantasy .vulnerability-content .align-top {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .vulnerability-content .shift-right {
margin-left: 2rem;
}
.lethalfantasy .vulnerability-content .header {
display: flex;
}
@ -1026,26 +1045,26 @@ i.lethalfantasy {
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 2);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
.lethalfantasy .save-content fieldset {
margin-bottom: 10px;
margin-bottom: 5px;
border-radius: 5px;
}
.lethalfantasy .save-content .form-fields input,
.lethalfantasy .save-content .form-fields select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .save-content .form-fields select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .save-content legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
@ -1054,9 +1073,21 @@ i.lethalfantasy {
}
.lethalfantasy .save-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1);
flex: 50%;
}
.lethalfantasy .save-content .align-top {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .save-content .shift-right {
margin-left: 2rem;
}
.lethalfantasy .save-content .header {
display: flex;
}
@ -1105,6 +1136,160 @@ i.lethalfantasy {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.2);
}
.lethalfantasy .equipment-content {
font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1);
color: var(--color-dark-1);
background-image: var(--background-image-base);
background-repeat: no-repeat;
background-size: 100% 100%;
}
.lethalfantasy .equipment-content input:disabled,
.lethalfantasy .equipment-content select:disabled {
background-color: rgba(0, 0, 0, 0.2);
border-color: transparent;
color: var(--color-dark-3);
}
.lethalfantasy .equipment-content input,
.lethalfantasy .equipment-content select {
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .equipment-content input[name="name"] {
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
.lethalfantasy .equipment-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
}
.lethalfantasy .equipment-content .form-fields input,
.lethalfantasy .equipment-content .form-fields select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .equipment-content .form-fields select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .equipment-content legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
.lethalfantasy .equipment-content .form-fields {
padding-top: 5px;
}
.lethalfantasy .equipment-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
flex: 50%;
}
.lethalfantasy .equipment-content .align-top {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .equipment-content .shift-right {
margin-left: 2rem;
}
.lethalfantasy .equipment-content .header {
display: flex;
}
.lethalfantasy .equipment-content .header img {
width: 50px;
height: 50px;
}
.lethalfantasy .equipment-content label {
flex: 10%;
}
.lethalfantasy .shield-content {
font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1);
color: var(--color-dark-1);
background-image: var(--background-image-base);
background-repeat: no-repeat;
background-size: 100% 100%;
}
.lethalfantasy .shield-content input:disabled,
.lethalfantasy .shield-content select:disabled {
background-color: rgba(0, 0, 0, 0.2);
border-color: transparent;
color: var(--color-dark-3);
}
.lethalfantasy .shield-content input,
.lethalfantasy .shield-content select {
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .shield-content input[name="name"] {
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
.lethalfantasy .shield-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
}
.lethalfantasy .shield-content .form-fields input,
.lethalfantasy .shield-content .form-fields select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .shield-content .form-fields select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
}
.lethalfantasy .shield-content legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
.lethalfantasy .shield-content .form-fields {
padding-top: 5px;
}
.lethalfantasy .shield-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
flex: 50%;
}
.lethalfantasy .shield-content .align-top {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .shield-content .shift-right {
margin-left: 2rem;
}
.lethalfantasy .shield-content .header {
display: flex;
}
.lethalfantasy .shield-content .header img {
width: 50px;
height: 50px;
}
.lethalfantasy .shield-content label {
flex: 10%;
}
.application.dialog.lethalfantasy {
color: var(--color-dark-1);
}

View File

@ -12,7 +12,8 @@
"gift": "Gift",
"vulnerability": "Vulnerability",
"save": "Save",
"equipment": "Equipment"
"equipment": "Equipment" ,
"shield": "Shield"
}
},
@ -47,7 +48,26 @@
}
},
"Skill": {
"Category": {
"layperson": "Layperson",
"professional": "Professional",
"weapon": "Weapon",
"armor": "Armor",
"resist": "Resist"
},
"FIELDS": {
"category": {
"label": "Category"
},
"bonus" :{
"label": "Bonus"
},
"base": {
"label": "Base"
},
"cost": {
"label": "Cost"
},
"description": {
"label": "Description"
}
@ -55,6 +75,12 @@
},
"Equipment": {
"FIELDS": {
"cost": {
"label": "Cost"
},
"money": {
"label": "Money unit"
},
"description": {
"label": "Description"
}
@ -62,46 +88,239 @@
},
"Gift": {
"FIELDS": {
"cost": {
"label": "Cost"
},
"description": {
"label": "Description"
}
}
},
"Weapon": {
"WeaponType": {
"melee": "Melee",
"ranged": "Ranged"
},
"FIELDS": {
"category": {
"label": "Category"
"weaponType": {
"label": "Type"
},
"damageType": {
"typeP": {
"label": "Piercing"
},
"typeB": {
"label": "Bashing"
},
"typeS": {
"label": "Slashing"
}
},
"damage": {
"damageS": {
"label": "Small"
},
"damageM": {
"label": "Medium"
}
},
"hands": {
"label": "Hands"
},
"defenseMax": {
"label": "Defense max"
},
"secondsToAttack": {
"label": "Seconds to attack"
},
"speed": {
"simpleAim": {
"label": "Simple aim"
},
"carefulAim": {
"label": "Careful aim"
},
"focusedAim": {
"label": "Focused aim"
}
},
"defense": {
"label": "Defense"
},
"range": {
"pointBlank": {
"label": "Point blank"
},
"short": {
"label": "Short"
},
"medium": {
"label": "Medium"
},
"long": {
"label": "Long"
},
"extreme": {
"label": "Extreme"
},
"outOfSkill": {
"label": "Out of skill"
}
},
"load": {
"label": "Load"
},
"cost": {
"label": "Cost"
},
"money": {
"label": "Money unit"
}
}
},
"Armor": {
"FIELDS": {
"category": {
"label": "Category"
}
},
"Category": {
"sommaire": "Armures sommaires",
"legere": "Armures légères",
"guerre": "Armures de guerre"
"light": "Light",
"medium": "Medium",
"heavy": "Heavy"
},
"FIELDS": {
"armortype": {
"label": "Category"
},
"defense": {
"label": "Defense"
},
"movementreduction": {
"label": "Movement reduction"
},
"hp": {
"label": "HP"
},
"damagereduction": {
"label": "Damage reduction"
},
"load": {
"label": "Load"
},
"cost": {
"label": "Cost"
},
"money": {
"label": "Money unit"
}
}
},
"Shield": {
"FIELDS": {
"defense": {
"label": "Defense"
},
"movementreduction": {
"label": "Movement reduction"
},
"hp": {
"label": "HP"
},
"standing": {
"min":{
"label": "Min"
},
"max":{
"label": "Max"
}
},
"crouching": {
"min":{
"label": "Min"
},
"max":{
"label": "Max"
}
},
"destruction": {
"bashing": {
"label": "Bashing"
},
"slashing": {
"label": "Slashing"
},
"piercing": {
"label": "Piercing"
}
},
"autodestruction": {
"bashing": {
"label": "Bashing"
},
"slashing": {
"label": "Slashing"
},
"piercing": {
"label": "Piercing"
}
},
"damagereduction": {
"label": "Damage reduction"
},
"load": {
"label": "Load"
},
"cost": {
"label": "Cost"
},
"money": {
"label": "Money unit"
}
}
},
"Spell": {
"FIELDS": {
"description": {
"label": "Description"
},
"components": {
"verbal": {
"label": "Verbal"
},
"somatic": {
"label": "Somatic"
},
"material": {
"label": "Material"
}
},
"level": {
"label": "Level"
},
"cost" : {
"label": "Cost"
},
"castingTime": {
"label": "Casting time"
},
"range": {
"label": "Range"
},
"duration": {
"label": "Duration"
},
"areaAffected": {
"label": "Area affected"
},
"savingThrow": {
"label": "Saving throw"
},
"extraAetherPoints": {
"label": "Extra aether points"
}
},
"Range": {
"na": "-",
"contact": "Contact",
"proche": "Proche",
"loin": "Loin",
"distant": "Distant"
}
},
"Vulneravility": {
"Vulnerability": {
"FIELDS": {
"cost": {
"label": "Cost"
},
"description": {
"label": "Description"
}
@ -109,14 +328,24 @@
},
"Save": {
"FIELDS": {
"value": {
"label": "Value"
},
"description": {
"label": "Description"
}
}
},
"Money": {
"Tinbits": "Tin Bits",
"Coppers": "Copper",
"Silvers": "Silver",
"Golds": "Gold",
"Platinums": "Platinum"
},
"Label": {
"description": "Description",
"biens": "Biens",
"total": "Total",
"langues": "Langues",
"profil": "Profil",
"details": "Détails",

View File

@ -44,9 +44,11 @@ Hooks.once("init", function () {
gift: models.LethalFantasyGift,
weapon: models.LethalFantasyWeapon,
armor: models.LethalFantasyArmor,
shield: models.LethalFantasyShield,
spell: models.LethalFantasySpell,
save: models.LethalFantasySave,
vulnerability: models.LethalFantasyVulnerability
vulnerability: models.LethalFantasyVulnerability,
equipment: models.LethalFantasyEquipment
}
// Register sheet application classes
@ -62,6 +64,8 @@ Hooks.once("init", function () {
Items.registerSheet("lethalFantasy", applications.LethalFantasyWeaponSheet, { types: ["weapon"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasySpellSheet, { types: ["spell"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyArmorSheet, { types: ["armor"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyShieldSheet, { types: ["shield"], makeDefault: true })
Items.registerSheet("lethalFantasy", applications.LethalFantasyEquipmentSheet, { types: ["equipment"], makeDefault: true })
// Other Document Configuration
CONFIG.ChatMessage.documentClass = documents.LethalFantasyChatMessage
@ -69,26 +73,6 @@ Hooks.once("init", function () {
// Dice system configuration
CONFIG.Dice.rolls.push(documents.LethalFantasyRoll)
// Register system settings
game.settings.register("lethalFantasy", "displayOpponentMalus", {
name: "TENEBRIS.Setting.displayOpponentMalus",
hint: "TENEBRIS.Setting.displayOpponentMalusHint",
scope: "world",
config: true,
type: Boolean,
default: true,
})
game.settings.register("lethalFantasy", "fortune", {
name: "TENEBRIS.Setting.fortune",
hint: "TENEBRIS.Setting.fortuneHint",
scope: "world",
config: true,
type: Number,
default: 0,
requiresReload: true,
})
game.settings.register("lethalFantasy", "worldKey", {
name: "Unique world key",
scope: "world",
@ -100,9 +84,6 @@ Hooks.once("init", function () {
// Activate socket handler
game.socket.on(`system.${SYSTEM.id}`, handleSocketEvent)
// Pre-localize configuration objects
// TODO : encore d'actualité ?
// preLocalizeConfig()
initControlButtons()
@ -121,7 +102,7 @@ Hooks.once("init", function () {
applications.LethalFantasyManager.askRollForAll(type, target, title, avantage)
})
console.info("CTHULHU TENEBRIS | System Initialized")
console.info("LETHAL FANTASY | System Initialized")
})
/**
@ -146,7 +127,7 @@ Hooks.once("ready", function () {
console.info("LETHAL FANTASY | Ready")
game.system.applicationManager = new applications.LethalFantasyManager()
if (game.user.isGM) {
game.system.applicationManager.render(true)
//game.system.applicationManager.render(true)
}
if (!SYSTEM.DEV_MODE) {

View File

@ -8,4 +8,5 @@ export { default as LethalFantasySaveSheet } from "./sheets/save-sheet.mjs"
export { default as LethalFantasyArmorSheet } from "./sheets/armor-sheet.mjs"
export { default as LethalFantasySpellSheet } from "./sheets/spell-sheet.mjs"
export { default as LethalFantasyEquipmentSheet } from "./sheets/equipment-sheet.mjs"
export { default as LethalFantasyShieldSheet } from "./sheets/shield-sheet.mjs"
export { default as LethalFantasyManager } from "./manager.mjs"

View File

@ -13,8 +13,6 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
contentClasses: ["character-content"],
},
actions: {
deleteVoieMajeure: LethalFantasyCharacterSheet.#onDeleteVoieMajeure,
deleteVoieMineure: LethalFantasyCharacterSheet.#onDeleteVoieMineure,
createEquipment: LethalFantasyCharacterSheet.#onCreateEquipment,
},
}
@ -25,7 +23,7 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
template: "systems/fvtt-lethal-fantasy/templates/character-main.hbs",
},
tabs: {
template: "templates/generic/tab-navigation.hbs",
template: "systems/fvtt-lethal-fantasy/templates/generic/tab-navigation.hbs",
},
items: {
template: "systems/fvtt-lethal-fantasy/templates/character-items.hbs",
@ -46,8 +44,8 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
*/
#getTabs() {
const tabs = {
items: { id: "items", group: "sheet", icon: "fa-solid fa-shapes", label: "TENEBRIS.Character.Label.details" },
biography: { id: "biography", group: "sheet", icon: "fa-solid fa-book", label: "TENEBRIS.Character.Label.biography" },
items: { id: "items", group: "sheet", icon: "fa-solid fa-shapes", label: "LETHALFANTASY.Character.Label.details" },
biography: { id: "biography", group: "sheet", icon: "fa-solid fa-book", label: "LETHALFANTASY.Character.Label.biography" },
}
for (const v of Object.values(tabs)) {
v.active = this.tabGroups[v.group] === v.id
@ -62,105 +60,17 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
context.tabs = this.#getTabs()
context.tooltipsCaracteristiques = {
rob: this._generateTooltip("save", "rob"),
dex: this._generateTooltip("save", "dex"),
int: this._generateTooltip("save", "int"),
per: this._generateTooltip("save", "per"),
vol: this._generateTooltip("save", "vol"),
dmax: this._generateTooltip("other", "dmax"),
}
context.tooltipsRessources = {
san: this._generateTooltip("resource", "san"),
oeil: this._generateTooltip("resource", "oeil"),
verbe: this._generateTooltip("resource", "verbe"),
bourse: this._generateTooltip("resource", "bourse"),
magie: this._generateTooltip("resource", "magie"),
}
context.rollType = {
saveRob: {
action: "roll",
rollType: "save",
rollTarget: "rob",
tooltip: this._generateTooltip("save", "rob"),
},
saveDex: {
action: "roll",
rollType: "save",
rollTarget: "dex",
tooltip: this._generateTooltip("save", "dex"),
},
saveInt: {
action: "roll",
rollType: "save",
rollTarget: "int",
tooltip: this._generateTooltip("save", "int"),
},
savePer: {
action: "roll",
rollType: "save",
rollTarget: "per",
tooltip: this._generateTooltip("save", "per"),
drag: true,
},
saveVol: {
action: "roll",
rollType: "save",
rollTarget: "vol",
tooltip: this._generateTooltip("save", "vol"),
drag: true,
},
resourceSan: {
action: "roll",
rollType: "resource",
rollTarget: "san",
tooltip: this._generateTooltip("resource", "san"),
drag: true,
},
resourceOeil: {
action: "roll",
rollType: "resource",
rollTarget: "oeil",
tooltip: this._generateTooltip("resource", "oeil"),
drag: true,
},
resourceVerbe: {
action: "roll",
rollType: "resource",
rollTarget: "verbe",
tooltip: this._generateTooltip("resource", "verbe"),
drag: true,
},
resourceBourse: {
action: "roll",
rollType: "resource",
rollTarget: "bourse",
tooltip: this._generateTooltip("resource", "bourse"),
drag: true,
},
resourceMagie: {
action: "roll",
rollType: "resource",
rollTarget: "magie",
tooltip: this._generateTooltip("resource", "magie"),
drag: true,
},
}
return context
}
_generateTooltip(type, target) {
if (type === ROLL_TYPE.SAVE) {
const progres = this.document.system.caracteristiques[target].progression.progres
? game.i18n.localize("TENEBRIS.Label.hasProgressed")
: game.i18n.localize("TENEBRIS.Label.noProgress")
return `${game.i18n.localize("TENEBRIS.Label.experience")} : ${this.document.system.caracteristiques[target].progression.experience} <br> ${progres}`
} else if (type === ROLL_TYPE.RESOURCE) {
return `${game.i18n.localize("TENEBRIS.Label.maximum")} : ${this.document.system.ressources[target].max} <br> ${game.i18n.localize("TENEBRIS.Label.experience")} : ${this.document.system.ressources[target].experience}`
} else if (type === "other") {
return `${game.i18n.localize("TENEBRIS.Label.experience")} : ${this.document.system.dmax.experience}`
}
}
/** @override */
@ -172,9 +82,6 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
break
case "items":
context.tab = context.tabs.items
const talents = await this._prepareTalents()
context.talents = talents
context.talentsAppris = talents.filter((talent) => talent.appris)
context.weapons = doc.itemTypes.weapon
context.armors = doc.itemTypes.armor
context.spells = doc.itemTypes.spell
@ -183,40 +90,12 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
case "biography":
context.tab = context.tabs.biography
context.enrichedDescription = await TextEditor.enrichHTML(doc.system.description, { async: true })
context.enrichedLangues = await TextEditor.enrichHTML(doc.system.langues, { async: true })
context.enrichedNotes = await TextEditor.enrichHTML(doc.system.notes, { async: true })
break
}
return context
}
/**
* Prepares the talents for the character sheet.
*
* @returns {Array} An array of talents with their properties.
*/
async _prepareTalents() {
const talents = await Promise.all(
this.document.itemTypes.talent.map(async (talent) => {
const pathName = await talent.system.getPathName()
return {
id: talent.id,
uuid: talent.uuid,
name: talent.name,
img: talent.img,
path: `Obtenu par ${pathName}`,
description: talent.system.improvedDescription,
progression: talent.system.progression,
niveau: talent.system.niveau,
appris: talent.system.appris,
details: talent.system.details,
}
}),
)
talents.sort((a, b) => b.appris - a.appris || a.name.localeCompare(b.name, game.i18n.lang))
return talents
}
// #region Drag-and-Drop Workflow
/**
@ -244,43 +123,6 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
await this.document.addPath(item)
}
// #endregion
// #region Actions
/**
* Suppression de la voie majeure
* @param {Event} event The initiating click event.
* @param {HTMLElement} target The current target of the event listener.
*/
static async #onDeleteVoieMajeure(event, target) {
const proceed = await foundry.applications.api.DialogV2.confirm({
content: game.i18n.localize("TENEBRIS.Dialog.suppressionTalents"),
rejectClose: false,
modal: true,
})
if (!proceed) return
const path = this.document.items.get(this.document.system.voies.majeure.id)
if (!path) return
await this.document.deletePath(path, true)
}
/**
* Suppression de la voie mineure
* @param {Event} event The initiating click event.
* @param {HTMLElement} target The current target of the event listener.
*/
static async #onDeleteVoieMineure(event, target) {
const proceed = await foundry.applications.api.DialogV2.confirm({
content: game.i18n.localize("TENEBRIS.Dialog.suppressionTalents"),
rejectClose: false,
modal: true,
})
if (!proceed) return
const path = this.document.items.get(this.document.system.voies.mineure.id)
if (!path) return
await this.document.deletePath(path, false)
}
/**
* Creates a new attack item directly from the sheet and embeds it into the document.
@ -290,11 +132,11 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
static #onCreateEquipment(event, target) {
// Création d'une armure
if (event.shiftKey) {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("TENEBRIS.Label.newArmor"), type: "armor" }])
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("LETHALFANTASY.Label.newArmor"), type: "armor" }])
}
// Création d'une arme
else {
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("TENEBRIS.Label.newWeapon"), type: "weapon" }])
this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("LETHALFANTASY.Label.newWeapon"), type: "weapon" }])
}
}

View File

@ -22,7 +22,7 @@ export default class LethalFantasyGiftSheet extends LethalFantasyItemSheet {
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.improvedDescription, { async: true })
context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@ -0,0 +1,27 @@
import LethalFantasyItemSheet from "./base-item-sheet.mjs"
export default class LethalFantasyShieldSheet extends LethalFantasyItemSheet {
/** @override */
static DEFAULT_OPTIONS = {
classes: ["shield"],
position: {
width: 620,
},
window: {
contentClasses: ["shield-content"],
},
}
/** @override */
static PARTS = {
main: {
template: "systems/fvtt-lethal-fantasy/templates/shield.hbs",
},
}
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
return context
}
}

View File

@ -5,7 +5,7 @@ export default class LethalFantasyWeaponSheet extends LethalFantasyItemSheet {
static DEFAULT_OPTIONS = {
classes: ["weapon"],
position: {
width: 400,
width: 620,
},
window: {
contentClasses: ["weapon-content"],

View File

@ -1,5 +1,5 @@
export const CATEGORY = Object.freeze({
sommaire: { id: "sommaire", label: "LETHALFANTASY.Armor.Category.sommaire" },
legere: { id: "legere", label: "LETHALFANTASY.Armor.Category.legere" },
guerre: { id: "guerre", label: "LETHALFANTASY.Armor.Category.guerre" },
export const TYPE = Object.freeze({
light: { id: "light", label: "LETHALFANTASY.Armor.Category.light" },
medium: { id: "medium", label: "LETHALFANTASY.Armor.Category.medium" },
heavy: { id: "medium", label: "LETHALFANTASY.Armor.Category.heavy" }
})

View File

@ -0,0 +1,51 @@
export const CATEGORY = Object.freeze({
essentialkit: {
id: "essentialkit",
label: "LETHALFANTASY.EquipmentCategories.EssentialKit",
},
classkit: {
id: "classkit",
label: "LETHALFANTASY.EquipmentCategories.ClassKit",
},
clothing: {
id: "clothing",
label: "LETHALFANTASY.EquipmentCategories.Clothing",
},
music: {
id: "music",
label: "LETHALFANTASY.EquipmentCategories.Music",
},
sleeping: {
id: "sleeping",
label: "LETHALFANTASY.EquipmentCategories.Sleeping",
},
landtransport: {
id: "landtransport",
label: "LETHALFANTASY.EquipmentCategories.LandTransport",
},
watertransport: {
id: "watertransport",
label: "LETHALFANTASY.EquipmentCategories.WaterTransport",
},
mount: {
id: "mount",
label: "LETHALFANTASY.EquipmentCategories.Mount",
},
light: {
id: "light",
label: "LETHALFANTASY.EquipmentCategories.Light",
},
loadbearing: {
id: "loadbearing",
label: "LETHALFANTASY.EquipmentCategories.LoadBearing",
},
misc: {
id: "misc",
label: "LETHALFANTASY.EquipmentCategories.Misc",
},
fooddrink: {
id: "fooddrink",
label: "LETHALFANTASY.EquipmentCategories.FoodDrink",
},
})

View File

@ -3,6 +3,7 @@ import * as WEAPON from "./weapon.mjs"
import * as ARMOR from "./armor.mjs"
import * as SPELL from "./spell.mjs"
import * as SKILL from "./skill.mjs"
import * as EQUIPMENT from "./equipment.mjs"
export const SYSTEM_ID = "fvtt-lethal-fantasy"
export const DEV_MODE = false
@ -81,8 +82,10 @@ export const SYSTEM = {
SKILL_CATEGORY: SKILL.CATEGORY,
WEAPON_CATEGORY: WEAPON.CATEGORY,
WEAPON_DAMAGE: WEAPON.DAMAGE,
ARMOR_CATEGORY: ARMOR.CATEGORY,
ARMOR_TYPE: ARMOR.TYPE,
EQUIPMENT_CATEGORY: EQUIPMENT.CATEGORY,
SPELL_RANGE: SPELL.RANGE,
WEAPON_TYPE: WEAPON.WEAPON_TYPE,
MONEY,
ASCII,
ROLL_TYPE,

View File

@ -21,6 +21,11 @@ export const CATEGORY = Object.freeze({
},
})
export const WEAPON_TYPE = {
"melee": "LETHALFANTASY.Weapon.WeaponType.melee",
"ranged": "LETHALFANTASY.Weapon.WeaponType.ranged"
}
export const DAMAGE = Object.freeze({
UN: "1",
D4: "d4",

View File

@ -4,6 +4,8 @@ export { default as LethalFantasyWeapon } from "./weapon.mjs"
export { default as LethalFantasySpell } from "./spell.mjs"
export { default as LethalFantasySkill } from "./skill.mjs"
export { default as LethalFantasyArmor } from "./armor.mjs"
export { default as LethalFantasyShield } from "./shield.mjs"
export { default as LethalFantasyGift } from "./gift.mjs"
export { default as LethalFantasyVulnerability } from "./vulnerability.mjs"
export { default as LethalFantasySave } from "./save.mjs"
export { default as LethalFantasyEquipment } from "./equipment.mjs"

View File

@ -3,13 +3,17 @@ export default class LethalFantasyArmor extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const schema = {}
const requiredInteger = { required: true, nullable: false, integer: true }
schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.category = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.ARMOR_CATEGORY })
schema.protection = new fields.StringField({
required: true,
initial: ""
})
schema.armortype = new fields.StringField({ required: true, initial: "light", choices: SYSTEM.ARMOR_TYPE })
schema.defense = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: -50 })
schema.movementreduction = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.hp = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.damagereduction = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.load = new fields.StringField({ required: true, initial: "L" })
schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0 })
schema.money = new fields.StringField({ required: true, initial: "tinbit", choices: SYSTEM.MONEY })

View File

@ -7,11 +7,12 @@ export default class LethalFantasyEquipment extends foundry.abstract.TypeDataMod
const requiredInteger = { required: true, nullable: false, integer: true }
schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.category = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_CATEGORY })
schema.damages = new fields.StringField({
required: true,
initial: ""
})
schema.category = new fields.StringField({ required: true, initial: "tinbit", choices: SYSTEM.EQUIPMENT_CATEGORIES })
schema.load = new fields.StringField({ required: true, initial: "L" })
schema.hi = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.medium = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.lo = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.cost = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.money = new fields.StringField({ required: true, initial: "tinbit", choices: SYSTEM.MONEY })
@ -21,7 +22,4 @@ export default class LethalFantasyEquipment extends foundry.abstract.TypeDataMod
/** @override */
static LOCALIZATION_PREFIXES = ["LETHALFANTASY.Equipment"]
get weaponCategory() {
return game.i18n.localize(CATEGORY[this.category].label)
}
}

41
module/models/shield.mjs Normal file
View File

@ -0,0 +1,41 @@
import { SYSTEM } from "../config/system.mjs"
export default class LethalFantasyShield extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const schema = {}
const requiredInteger = { required: true, nullable: false, integer: true }
schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.defense = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: -50 })
schema.movementreduction = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.standing = new fields.SchemaField({
min: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
})
schema.crouching = new fields.SchemaField({
min: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
})
schema.destruction = new fields.SchemaField({
bashing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
slashing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
piercing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
})
schema.autodestruction = new fields.SchemaField({
bashing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
slashing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
piercing: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
})
schema.load = new fields.StringField({ required: true, initial: "L" })
schema.cost = new fields.NumberField({ required: true, initial: 0, min: 0 })
schema.money = new fields.StringField({ required: true, initial: "tinbit", choices: SYSTEM.MONEY })
return schema
}
/** @override */
static LOCALIZATION_PREFIXES = ["LETHALFANTASY.Shield"]
}

View File

@ -21,4 +21,47 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
get skillCategory() {
return game.i18n.localize(CATEGORY[this.category].label)
}
prepareDerivedData() {
super.prepareDerivedData();
this.skillTotal = this.computeBase();
}
computeBase() {
let actor = this.parent?.actor;
if (!actor) {
return `${this.base } + ${ String(this.bonus)}`;
}
// Split the base value per stat : WIS,DEX,STR,INT,CHA (example)
const base = this.base;
let baseSplit = base.split(",");
let baseSplitLength = baseSplit.length;
if ( baseSplitLength > 0) {
// Select the max stat value from the parent actor
let maxStat = 0;
for (let i = 0; i < baseSplitLength; i++) {
const stat = baseSplit[i];
const statValue = actor.system.characteristics[stat.toLowerCase()]?.value || 0;
if (statValue > maxStat) {
maxStat = statValue;
}
}
return maxStat;
} else {
// Split with + calculate the total
baseSplit = base.split("+");
baseSplitLength = baseSplit.length;
if ( baseSplitLength > 0) {
let total = 0;
for (let i = 0; i < baseSplitLength; i++) {
const stat = baseSplit[i];
const statValue = actor.system.characteristics[stat.toLowerCase()]?.value || 0;
total += statValue;
}
return total
}
}
return `${this.base } + ${ String(this.bonus)}`;
}
}

View File

@ -18,6 +18,19 @@ export default class LethalFantasySpell extends foundry.abstract.TypeDataModel {
max: 20,
})
schema.cost = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.components = new fields.SchemaField({
verbal: new fields.BooleanField(),
somatic: new fields.BooleanField(),
material: new fields.BooleanField(),
})
schema.castingTime = new fields.StringField({ required: true, initial: "" })
schema.range = 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: "" })
schema.extraAetherPoints = new fields.StringField({ required: true, initial: "" })
return schema
}

View File

@ -7,11 +7,38 @@ export default class LethalFantasySkill extends foundry.abstract.TypeDataModel {
const requiredInteger = { required: true, nullable: false, integer: true }
schema.description = new fields.HTMLField({ required: true, textSearch: true })
schema.category = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_CATEGORY })
schema.damages = new fields.StringField({
required: true,
initial: ""
schema.weaponType = new fields.StringField({ required: true, initial: "melee", choices: SYSTEM.WEAPON_TYPE })
schema.damageType = new fields.SchemaField({
typeP: new fields.BooleanField(),
typeB: new fields.BooleanField(),
typeS: new fields.BooleanField()
})
schema.damage = new fields.SchemaField({
damageS: new fields.StringField({required: true, initial: ""}),
damageM: new fields.StringField({required: true, initial: ""})
})
schema.hands = new fields.StringField({ required: true, initial: "1", choices: ["1", "2"] })
schema.defenseMax = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.secondsToAttack = new fields.StringField({required: true, initial: ""})
schema.speed = new fields.SchemaField({
simpleAim: new fields.StringField({required: true, initial: ""}),
carefulAim: new fields.StringField({required: true, initial: ""}),
focusedAim: new fields.StringField({required: true, initial: ""})
})
schema.defense = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.range = new fields.SchemaField({
pointBlank: 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 }),
long: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
extreme: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 }),
outOfSkill: new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
})
schema.load = new fields.StringField({ required: true, initial: "L" })
schema.cost = new fields.NumberField({ ...requiredInteger, required: true, initial: 0, min: 0 })
schema.money = new fields.StringField({ required: true, initial: "tinbit", choices: SYSTEM.MONEY })

16
styles/equipment.less Normal file
View File

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

View File

@ -12,6 +12,8 @@
@import "vulnerability.less";
@import "save.less";
@import "chat.less";
@import "equipment.less";
@import "shield.less";
}
@import "roll.less";

View File

@ -1,94 +1,26 @@
.gifts-content {
.gift-content {
.sheet-common();
.item-sheet-common();
.path-name {
.header {
display: flex;
justify-content: space-between;
.control {
margin: 5px;
}
img {
width: 50px;
height: 50px;
}
}
.path-main {
display: grid;
grid-template-columns: 2fr 2fr 1fr;
.profil {
display: grid;
grid-template-columns: repeat(2, 1fr);
}
.profil-gauche,
.profil-droite {
flex: 1; /* Chaque colonne prend la moitié de l'espace disponible */
padding: 10px; /* Espacement intérieur */
}
.profil-gauche {
margin-right: 10px; /* Espace entre les deux colonnes */
}
/* Optionnel : supprimer le margin-right sur la dernière colonne si vous avez besoin d'un espacement précis */
.profil-droite {
margin-right: 0;
}
.biens {
prose-mirror {
height: 100%;
}
}
.langues {
prose-mirror {
height: 100%;
}
}
.description {
prose-mirror.inactive {
min-height: 40px;
}
prose-mirror.active {
min-height: 150px;
}
grid-column: span 3;
}
input[type="checkbox"] {
font-size: var(--font-size-14);
width: 20px;
padding-top: 0;
}
.path-talents {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 10px;
.talent {
background-color: #f0f0f0;
padding: 5px;
border-radius: 5px;
.header {
display: flex;
justify-content: space-between;
.name {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.5);
padding-left: 20px;
}
.controls {
font-size: calc(var(--font-size-standard) * 0.8);
}
}
.progression {
display: flex;
justify-content: space-between;
padding-top: 10px;
}
.description {
font-size: calc(var(--font-size-standard) * 1);
}
}
input[type="checkbox"]:checked {
background-color: rgba(0, 0, 0, 0.1);
}
input[type="checkbox"]:checked::after {
color: rgba(0, 0, 0, 0.1);
}
}

View File

@ -1,5 +1,5 @@
:root {
--font-size-standard: 0.8125rem;
--font-size-standard: 1.0rem;
--background-image-base: url("../assets/parchment.jpg");
--font-secondary: "Amiri", serif;
--logo-standard: url("../assets/lethal-fantasy-logo.webp");
@ -35,7 +35,7 @@ i.lethalfantasy {
.application.dialog.lethalfantasy {
font-family: var(--font-primary);
font-size: calc(var(--font-size-standard) * 1.2);
font-size: calc(var(--font-size-standard) * 1.0);
background-image: var(--background-image-base);
button:hover {
background: var(--color-dark-6);

View File

@ -24,13 +24,13 @@
height: 50px;
margin-right: 10px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 2);
font-size: calc(var(--font-size-standard) * 1);
font-weight: bold;
border: none;
}
fieldset {
margin-bottom: 10px;
margin-bottom: 5px;
border-radius: 5px;
}
@ -38,17 +38,17 @@
input,
select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1.0);
}
select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1.0);
}
}
legend {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
letter-spacing: 1px;
}
@ -57,7 +57,7 @@
.character-sheet-common {
label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.4);
font-size: calc(var(--font-size-standard) * 1.2);
}
}
@ -68,7 +68,21 @@
label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.6);
font-size: calc(var(--font-size-standard) * 1.0);
flex: 50%;
}
.align-top {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.shift-right {
margin-left: 2rem;
}
}

16
styles/shield.less Normal file
View File

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

View File

@ -14,8 +14,5 @@
flex: 10%;
}
input[name="system.consequenceA"], input[name="system.consequenceB"] {
font-size: calc(var(--font-size-standard) * 1.2);
}
}

View File

@ -38,7 +38,9 @@
"save": { "htmlFields": ["description"] },
"weapon": { "htmlFields": ["description"] },
"armor": { "htmlFields": ["description"] },
"spell": { "htmlFields": ["description"] }
"shield": { "htmlFields": ["description"] },
"spell": { "htmlFields": ["description"] },
"equipment": { "htmlFields": ["description"] }
}
},
"grid": {

View File

@ -4,14 +4,21 @@
{{formInput fields.name value=source.name}}
</div>
{{formField systemFields.category value=system.category localize=true}}
{{formField systemFields.valeur value=system.valeur}}
{{formField systemFields.malus value=system.malus}}
{{formField systemFields.armortype value=system.armortype localize=true}}
{{formField systemFields.defense value=system.defense}}
{{formField systemFields.movementreduction value=system.movementreduction}}
{{formField systemFields.hp value=system.hp}}
{{formField systemFields.damagereduction value=system.damagereduction}}
{{formField systemFields.load value=system.load}}
{{formField systemFields.cost value=system.cost}}
{{formField systemFields.money value=system.money localize=true}}
<fieldset>
<legend>{{localize "TENEBRIS.Label.description"}}</legend>
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput
systemFields.description
enriched=enrichedDescription
enriched=description
value=system.description
name="system.description"
toggled="false"

14
templates/equipment.hbs Normal file
View File

@ -0,0 +1,14 @@
<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.cost value=system.cost}}
{{formField systemFields.money value=system.money localize=true}}
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput systemFields.description enriched=description value=system.description name="system.description" toggled=true}}
</fieldset>
</section>

View File

@ -3,14 +3,10 @@
<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.appris value=system.appris}}
{{formField systemFields.progression value=system.progression}}
{{#if canProgress}}
{{formField systemFields.niveau value=system.niveau }}
{{/if}}wwww
{{formField systemFields.cost value=system.cost}}
<fieldset>
<legend>{{localize "TENEBRIS.Label.description"}}</legend>
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
</fieldset>

13
templates/save.hbs Normal file
View File

@ -0,0 +1,13 @@
<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.value value=system.value}}
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
</fieldset>
</section>

59
templates/shield.hbs Normal file
View File

@ -0,0 +1,59 @@
<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>
<div class="flexrow">
<div class="align-top">
{{formField systemFields.defense value=system.defense}}
{{formField systemFields.movementreduction value=system.movementreduction}}
<label>Standing</label>
<div class="shift-right">
{{formField systemFields.standing.fields.min value=system.standing.min}}
{{formField systemFields.standing.fields.max value=system.standing.min}}
</div>
<label>Crouching</label>
<div class="shift-right">
{{formField systemFields.crouching.fields.min value=system.crouching.min}}
{{formField systemFields.crouching.fields.max value=system.crouching.min}}
</div>
</div>
<div class="align-top">
<label>Destruction</label>
<div class="shift-right">
{{formField systemFields.destruction.fields.bashing value=system.destruction.bashing}}
{{formField systemFields.destruction.fields.slashing value=system.destruction.slashing}}
{{formField systemFields.destruction.fields.piercing value=system.destruction.piercing}}
</div>
<label>Auto-Destruction</label>
<div class="shift-right">
{{formField systemFields.autodestruction.fields.bashing value=system.autodestruction.bashing}}
{{formField systemFields.autodestruction.fields.slashing value=system.autodestruction.slashing}}
{{formField systemFields.autodestruction.fields.piercing value=system.autodestruction.piercing}}
</div>
{{formField systemFields.load value=system.load}}
{{formField systemFields.cost value=system.cost}}
{{formField systemFields.money value=system.money localize=true}}
</div>
</div>
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput
systemFields.description
enriched=description
value=system.description
name="system.description"
toggled="false"
}}
</fieldset>
</section>

View File

@ -3,7 +3,15 @@
<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.category value=system.category localize=true}}
{{formField systemFields.base value=system.base}}
{{formField systemFields.bonus value=system.bonus}}
{{formField systemFields.cost value=system.cost}}
<div class="total flexrow">
<legend>{{localize "LETHALFANTASY.Label.total"}}</legend>
{{system.skillTotal}}
</div>
<fieldset>
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend>

View File

@ -4,16 +4,26 @@
{{formInput fields.name value=source.name}}
</div>
{{formField systemFields.preparation value=system.preparation}}
{{formField systemFields.cible value=system.cible}}
{{formField systemFields.portee value=system.portee localize=true}}
{{formField systemFields.duree value=system.duree}}
{{formField systemFields.consequenceA value=system.consequenceA}}
{{formField systemFields.consequenceB value=system.consequenceB}}
{{formField systemFields.level value=system.level}}
{{formField systemFields.cost value=system.cost}}
<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}}
</div>
{{formField systemFields.castingTime value=system.castingTime}}
{{formField systemFields.range value=system.range}}
{{formField systemFields.areaAffected value=system.areaAffected}}
{{formField systemFields.duration value=system.duration}}
{{formField systemFields.savingThrow value=system.savingThrow}}
{{formField systemFields.extraAetherPoints value=system.extraAetherPoints}}
<fieldset>
<legend>{{localize "TENEBRIS.Label.description"}}</legend>
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput systemFields.description enriched=description value=system.description name="system.description" toggled=true}}
</fieldset>
</section>

View File

@ -3,15 +3,11 @@
<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.appris value=system.appris}}
{{formField systemFields.progression value=system.progression}}
{{#if canProgress}}
{{formField systemFields.niveau value=system.niveau }}
{{/if}}
{{formField systemFields.cost value=system.cost}}
<fieldset>
<legend>{{localize "TENEBRIS.Label.description"}}</legend>
{{formInput systemFields.description enriched=enrichedDescription value=system.description name="system.description" toggled=true}}
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput systemFields.description enriched=description value=system.description name="system.description" toggled=true}}
</fieldset>
</section>

View File

@ -2,18 +2,73 @@
<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>
</div>
<div class="flexrow">
<div class="align-top">
{{formField systemFields.weaponType value=system.weaponType localize=true}}
<label>Damage Type</label>
<div class="shift-right">
{{formField systemFields.damageType.fields.typeP value=system.standing.typeP}}
{{formField systemFields.damageType.fields.typeB value=system.standing.typeB}}
{{formField systemFields.damageType.fields.typeS value=system.standing.typeS}}
</div>
<label>Damage</label>
<div class="shift-right">
{{formField systemFields.damage.fields.damageS value=system.standing.damageS}}
{{formField systemFields.damage.fields.damageM value=system.standing.damageM}}
</div>
{{formField systemFields.hands value=system.hands localize=true}}
{{#if (eq system.weaponType "melee")}}
{{formField systemFields.defenseMax value=system.defenseMax}}
{{formField systemFields.secondsToAttack value=system.secondsToAttack}}
{{/if}}
{{#if (eq system.weaponType "ranged")}}
<label>Speed</label>
<div class="shift-right">
{{formField systemFields.speed.fields.simpleAim value=system.speed.simpleAim}}
{{formField systemFields.speed.fields.carefulAim value=system.speed.carefulAim}}
{{formField systemFields.speed.fields.focusedAim value=system.speed.focusedAim}}
</div>
{{/if}}
</div>
<div class="align-top">
{{#if (eq system.weaponType "ranged")}}
{{formField systemFields.defense value=system.defense}}
<label>Range</label>
<div class="shift-right">
{{formField systemFields.range.fields.pointBlank value=system.range.pointBlank}}
{{formField systemFields.range.fields.short value=system.range.short}}
{{formField systemFields.range.fields.medium value=system.range.medium}}
{{formField systemFields.range.fields.long value=system.range.long}}
{{formField systemFields.range.fields.extreme value=system.range.extreme}}
{{formField systemFields.range.fields.outOfSkill value=system.range.outOfSkill}}
</div>
{{/if}}
{{formField systemFields.load value=system.load}}
{{formField systemFields.cost value=system.cost}}
{{formField systemFields.money value=system.money localize=true}}
</div>
</div>
{{formField systemFields.categorie value=system.categorie localize=true}}
{{formField systemFields.degats value=system.degats}}
<fieldset>
<legend>{{localize "TENEBRIS.Label.description"}}</legend>
<legend>{{localize "LETHALFANTASY.Label.description"}}</legend>
{{formInput
systemFields.description
enriched=enrichedDescription
value=system.description
name="system.description"
toggled=true
systemFields.description
enriched=description
value=system.description
name="system.description"
toggled=true
}}
</fieldset>
</section>