Start combat management

This commit is contained in:
LeRatierBretonnien 2025-01-12 15:46:36 +01:00
parent 8135a50248
commit 4e70cbfaf8
41 changed files with 896 additions and 543 deletions

View File

@ -8,7 +8,7 @@
}
:root {
--font-primary: "TimesNewRoman", serif;
--font-size-standard: 0.9rem;
--font-size-standard: 0.8rem;
--background-image-base: url("../assets/ui/lethal_fantasy_background.webp");
--font-secondary: "BaskervilleBold", serif;
--logo-standard: url("../assets/ui/lf_logo_small_02.webp");
@ -65,7 +65,7 @@ i.lethalfantasy {
font-size: calc(var(--font-size-standard) * 1.2);
}
.lethalfantasy .item-sheet-common .form-fields {
padding-top: 5px;
padding-top: 4px;
}
.lethalfantasy .item-sheet-common label {
font-family: var(--font-secondary);
@ -101,21 +101,22 @@ i.lethalfantasy {
}
.lethalfantasy .character-content input,
.lethalfantasy .character-content select {
height: 1.5rem;
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .character-content input[name="name"] {
height: 50px;
margin-right: 10px;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
.lethalfantasy .character-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.lethalfantasy .character-content .form-fields input,
.lethalfantasy .character-content .form-fields select {
@ -145,7 +146,8 @@ i.lethalfantasy {
flex: 1;
}
.lethalfantasy .character-main .character-pc .character-left {
min-width: 180px;
min-width: 220px;
max-width: 220px;
display: flex;
flex-direction: column;
}
@ -153,53 +155,27 @@ i.lethalfantasy {
display: flex;
justify-content: center;
align-items: center;
padding-bottom: 20px;
padding-bottom: 8px;
}
.lethalfantasy .character-main .character-pc .character-left .character-left-image .character-img {
height: 140px;
width: 140px;
width: auto;
border: none;
}
.lethalfantasy .character-main .character-pc .character-left .character-hp-edit input {
display: flex;
width: 60px;
font-size: calc(var(--font-size-standard) * 1.4);
align-items: center;
justify-content: center;
padding: 0 5px 0 5px;
text-align: center;
}
.lethalfantasy .character-main .character-pc .character-right {
display: flex;
flex-direction: column;
gap: 5px;
}
.lethalfantasy .character-main .character-pc .character-right .character-name {
display: flex;
}
.lethalfantasy .character-main .character-pc .character-right .character-name input {
width: 400px;
}
.lethalfantasy .character-main .character-pc .character-right .character-infos {
display: flex;
flex-direction: column;
gap: 10px;
}
.lethalfantasy .character-main .character-pc .character-right .character-infos label {
min-width: 120px;
}
.lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp {
.lethalfantasy .character-main .character-pc .character-left .character-hp {
display: flex;
gap: 2px;
align-items: center;
}
.lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .character-hp-value .form-fields input {
.lethalfantasy .character-main .character-pc .character-left .character-hp .character-hp-value .form-fields input {
flex: none;
width: 50px;
min-width: 3rem;
max-width: 3rem;
margin-left: 10px;
font-size: calc(var(--font-size-standard) * 1.4);
}
.lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .character-hp-max {
.lethalfantasy .character-main .character-pc .character-left .character-hp .character-hp-max {
clear: both;
display: flex;
flex-direction: row;
@ -207,27 +183,32 @@ i.lethalfantasy {
margin: 3px 0;
align-items: center;
}
.lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .character-hp-max input {
.lethalfantasy .character-main .character-pc .character-left .character-hp .character-hp-max input {
width: 50px;
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
}
.lethalfantasy .character-main .character-pc .character-right .character-infos .character-hp .hp-separator {
font-size: calc(var(--font-size-standard) * 1.2);
.lethalfantasy .character-main .character-pc .character-right {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 4px;
}
.lethalfantasy .character-main .character-pc .character-right .character-name {
display: flex;
}
.lethalfantasy .character-main .character-pc .character-right .character-name input {
width: 400px;
}
.lethalfantasy .character-main .character-pc-play {
min-width: 500px;
min-width: 400px;
}
.lethalfantasy .character-main .character-pc-edit {
min-width: 650px;
min-width: 400px;
}
.lethalfantasy .character-main .character-characteristics {
display: flex;
flex-direction: column;
gap: 5px;
gap: 4px;
flex: 1;
}
.lethalfantasy .character-main .character-characteristics .character-characteristic {
@ -241,22 +222,22 @@ i.lethalfantasy {
}
.lethalfantasy .character-main .character-characteristics .character-characteristic .form-group {
flex: 1;
padding-left: 5px;
padding-left: 4px;
}
.lethalfantasy .character-main .character-characteristics .character-characteristic .form-group .form-fields {
flex: none;
width: 70px;
width: 3rem;
}
.lethalfantasy .character-main .character-challenges {
display: flex;
flex-direction: column;
gap: 5px;
gap: 4px;
flex: 1;
}
.lethalfantasy .character-main .character-challenges .character-challenge {
display: flex;
align-items: center;
margin-right: 1rem;
margin-right: 0.5rem;
}
.lethalfantasy .character-main .character-challenges .character-challenge .rollable:hover,
.lethalfantasy .character-main .character-challenges .character-challenge .rollable:focus {
@ -270,7 +251,7 @@ i.lethalfantasy {
}
.lethalfantasy .character-main .character-challenges .character-challenge .form-group {
flex: 1;
padding-left: 5px;
padding-left: 4px;
}
.lethalfantasy .character-main .character-challenges .character-challenge .form-group .form-fields {
flex: none;
@ -279,13 +260,13 @@ i.lethalfantasy {
.lethalfantasy .character-main .character-movements {
display: flex;
flex-direction: column;
gap: 5px;
gap: 4px;
flex: 1;
}
.lethalfantasy .character-main .character-movements .character-movement {
display: flex;
align-items: center;
margin-right: 1rem;
margin-right: 0.5rem;
}
.lethalfantasy .character-main .character-movements .character-movement .rollable:hover,
.lethalfantasy .character-main .character-movements .character-movement .rollable:focus {
@ -299,7 +280,7 @@ i.lethalfantasy {
}
.lethalfantasy .character-main .character-movements .character-movement .form-group {
flex: 1;
padding-left: 5px;
padding-left: 4px;
}
.lethalfantasy .character-main .character-movements .character-movement .form-group .form-fields {
flex: none;
@ -308,13 +289,13 @@ i.lethalfantasy {
.lethalfantasy .character-main .character-saves {
display: flex;
flex-direction: column;
gap: 5px;
gap: 4px;
flex: 1;
}
.lethalfantasy .character-main .character-saves .character-save {
display: flex;
align-items: center;
margin-right: 0.2rem;
margin-right: 0.5rem;
}
.lethalfantasy .character-main .character-saves .character-save .rollable:hover,
.lethalfantasy .character-main .character-saves .character-save .rollable:focus {
@ -325,17 +306,17 @@ i.lethalfantasy {
flex: 0;
min-width: 5rem;
max-width: 5rem;
margin-left: 0.7rem;
margin-left: 0.5rem;
}
.lethalfantasy .character-main .character-saves .character-save .name-pain {
flex: 0;
min-width: 3rem;
max-width: 3rem;
margin-left: 0.7rem;
margin-left: 0.5rem;
}
.lethalfantasy .character-main .character-saves .character-save .form-group {
flex: 0;
padding-left: 5px;
padding-left: 4px;
}
.lethalfantasy .character-main .character-saves .character-save .form-group .form-fields {
flex: none;
@ -347,72 +328,20 @@ i.lethalfantasy {
.lethalfantasy .character-main .character-characteristic-edit {
min-width: 400px;
}
.lethalfantasy .character-main .character-resources {
display: flex;
flex-direction: column;
gap: 5px;
flex: 1;
}
.lethalfantasy .character-main .character-resources .character-resource {
display: flex;
align-items: center;
}
.lethalfantasy .character-main .character-resources .character-resource .rollable:hover,
.lethalfantasy .character-main .character-resources .character-resource .rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor: pointer;
}
.lethalfantasy .character-main .character-resources .character-resource .form-group {
flex: 1;
padding-left: 5px;
}
.lethalfantasy .character-main .character-resources .character-resource .form-group .form-fields {
flex: none;
width: 70px;
}
.lethalfantasy .character-main .character-resources .character-resource .character-resource-edit {
display: flex;
align-items: center;
gap: 10px;
margin-left: 10px;
}
.lethalfantasy .character-main .character-resources .character-resource .character-resource-edit input {
display: flex;
width: 70px;
font-size: calc(var(--font-size-standard) * 1.4);
align-items: center;
justify-content: center;
padding: 0 5px 0 5px;
}
.lethalfantasy .character-main .character-resources .character-resource .character-resource-edit input[type="number"] {
text-align: center;
}
.lethalfantasy .character-main .character-resources .character-resource .character-resource-edit select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.5);
text-align: center;
width: 75px;
}
.lethalfantasy .character-main .character-resources-play {
min-width: 235px;
}
.lethalfantasy .character-main .character-resources-edit {
min-width: 400px;
}
.lethalfantasy .tab.character-biography .biodata {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-biography .biodata .biodata-elem {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-biography .biodata .biodata-elem .item-img {
width: 32px;
height: 32px;
margin: 5px 0 0 0;
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
.lethalfantasy .tab.character-biography .biodata .biodata-elem .name {
min-width: 8rem;
@ -429,21 +358,21 @@ i.lethalfantasy {
}
.lethalfantasy .tab.character-skills legend a {
font-size: calc(var(--font-size-standard) * 1);
padding-left: 5px;
padding-left: 4px;
}
.lethalfantasy .tab.character-skills .skills {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-skills .skills .skill {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-skills .skills .skill .item-img {
width: 32px;
height: 32px;
width: 24px;
height: 24px;
}
.lethalfantasy .tab.character-skills .skills .skill .name {
min-width: 12rem;
@ -451,16 +380,16 @@ i.lethalfantasy {
.lethalfantasy .tab.character-skills .gifts {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-skills .gifts .gift {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-skills .gifts .gift .item-img {
width: 32px;
height: 32px;
width: 24px;
height: 24px;
}
.lethalfantasy .tab.character-skills .gifts .gift .name {
min-width: 12rem;
@ -468,16 +397,16 @@ i.lethalfantasy {
.lethalfantasy .tab.character-skills .vulnerabilities {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-skills .vulnerabilities .vulnerability {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-skills .vulnerabilities .vulnerability .item-img {
width: 32px;
height: 32px;
width: 24px;
height: 24px;
}
.lethalfantasy .tab.character-skills .vulnerabilities .vulnerability .name {
min-width: 12rem;
@ -488,27 +417,27 @@ i.lethalfantasy {
}
.lethalfantasy .tab.character-equipment legend a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
padding-left: 4px;
}
.lethalfantasy .tab.character-equipment .moneys {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-equipment .equipments {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-equipment .equipments .equipment {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-equipment .equipments .equipment .item-img {
width: 32px;
height: 32px;
margin: 5px 0 0 0;
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
.lethalfantasy .tab.character-equipment .equipments .equipment .name {
min-width: 12rem;
@ -522,17 +451,20 @@ i.lethalfantasy {
}
.lethalfantasy .tab.character-combat legend a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
padding-left: 4px;
}
.lethalfantasy .tab.character-combat .combat-details {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-combat .combat-details .combat-detail {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-combat .combat-details .combat-detail button {
min-width: 10rem;
}
.lethalfantasy .tab.character-combat .combat-details .combat-detail .armor-hp {
min-width: 20rem;
@ -545,12 +477,12 @@ i.lethalfantasy {
.lethalfantasy .tab.character-combat .wounds {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-combat .wounds .wound {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-combat .wounds .wound .wound-description {
min-width: 16rem;
@ -565,9 +497,9 @@ i.lethalfantasy {
max-width: 3rem;
}
.lethalfantasy .tab.character-combat .wounds .wound .item-img {
width: 32px;
height: 32px;
margin: 5px 0 0 0;
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
.lethalfantasy .tab.character-combat .wounds .wound .name {
min-width: 12rem;
@ -575,17 +507,17 @@ i.lethalfantasy {
.lethalfantasy .tab.character-combat .weapons {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-combat .weapons .weapon {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-combat .weapons .weapon .item-img {
width: 32px;
height: 32px;
margin: 5px 0 0 0;
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
.lethalfantasy .tab.character-combat .weapons .weapon .name {
min-width: 12rem;
@ -597,17 +529,17 @@ i.lethalfantasy {
.lethalfantasy .tab.character-combat .armors {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-combat .armors .armor {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-combat .armors .armor .item-img {
width: 32px;
height: 32px;
margin: 5px 0 0 0;
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
.lethalfantasy .tab.character-combat .armors .name {
min-width: 12rem;
@ -618,21 +550,21 @@ i.lethalfantasy {
}
.lethalfantasy .tab.character-spells legend a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
padding-left: 4px;
}
.lethalfantasy .tab.character-spells .spells {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-spells .spells .spell {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-spells .spells .spell .item-img {
width: 32px;
height: 32px;
width: 24px;
height: 24px;
}
.lethalfantasy .tab.character-spells .spells .spell .name {
min-width: 12rem;
@ -649,21 +581,21 @@ i.lethalfantasy {
}
.lethalfantasy .tab.character-miracles legend a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
padding-left: 4px;
}
.lethalfantasy .tab.character-miracles .miracles {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-miracles .miracles .miracle {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
}
.lethalfantasy .tab.character-miracles .miracles .miracle .item-img {
width: 32px;
height: 32px;
width: 24px;
height: 24px;
}
.lethalfantasy .tab.character-miracles .miracles .miracle .name {
min-width: 12rem;
@ -691,21 +623,22 @@ i.lethalfantasy {
}
.lethalfantasy .opponent-content input,
.lethalfantasy .opponent-content select {
height: 1.5rem;
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .opponent-content input[name="name"] {
height: 50px;
margin-right: 10px;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
.lethalfantasy .opponent-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.lethalfantasy .opponent-content .form-fields input,
.lethalfantasy .opponent-content .form-fields select {
@ -805,21 +738,22 @@ i.lethalfantasy {
}
.lethalfantasy .skill-content input,
.lethalfantasy .skill-content select {
height: 1.5rem;
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .skill-content input[name="name"] {
height: 50px;
margin-right: 10px;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
.lethalfantasy .skill-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.lethalfantasy .skill-content .form-fields input,
.lethalfantasy .skill-content .form-fields select {
@ -837,7 +771,7 @@ i.lethalfantasy {
letter-spacing: 1px;
}
.lethalfantasy .skill-content .form-fields {
padding-top: 5px;
padding-top: 4px;
}
.lethalfantasy .skill-content label {
font-family: var(--font-secondary);
@ -890,21 +824,22 @@ i.lethalfantasy {
}
.lethalfantasy .gift-content input,
.lethalfantasy .gift-content select {
height: 1.5rem;
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .gift-content input[name="name"] {
height: 50px;
margin-right: 10px;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
.lethalfantasy .gift-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.lethalfantasy .gift-content .form-fields input,
.lethalfantasy .gift-content .form-fields select {
@ -922,7 +857,7 @@ i.lethalfantasy {
letter-spacing: 1px;
}
.lethalfantasy .gift-content .form-fields {
padding-top: 5px;
padding-top: 4px;
}
.lethalfantasy .gift-content label {
font-family: var(--font-secondary);
@ -975,21 +910,22 @@ i.lethalfantasy {
}
.lethalfantasy .weapon-content input,
.lethalfantasy .weapon-content select {
height: 1.5rem;
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .weapon-content input[name="name"] {
height: 50px;
margin-right: 10px;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
.lethalfantasy .weapon-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.lethalfantasy .weapon-content .form-fields input,
.lethalfantasy .weapon-content .form-fields select {
@ -1007,7 +943,7 @@ i.lethalfantasy {
letter-spacing: 1px;
}
.lethalfantasy .weapon-content .form-fields {
padding-top: 5px;
padding-top: 4px;
}
.lethalfantasy .weapon-content label {
font-family: var(--font-secondary);
@ -1052,21 +988,22 @@ i.lethalfantasy {
}
.lethalfantasy .armor-content input,
.lethalfantasy .armor-content select {
height: 1.5rem;
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .armor-content input[name="name"] {
height: 50px;
margin-right: 10px;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
.lethalfantasy .armor-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.lethalfantasy .armor-content .form-fields input,
.lethalfantasy .armor-content .form-fields select {
@ -1084,7 +1021,7 @@ i.lethalfantasy {
letter-spacing: 1px;
}
.lethalfantasy .armor-content .form-fields {
padding-top: 5px;
padding-top: 4px;
}
.lethalfantasy .armor-content label {
font-family: var(--font-secondary);
@ -1129,21 +1066,22 @@ i.lethalfantasy {
}
.lethalfantasy .spell-content input,
.lethalfantasy .spell-content select {
height: 1.5rem;
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .spell-content input[name="name"] {
height: 50px;
margin-right: 10px;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
.lethalfantasy .spell-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.lethalfantasy .spell-content .form-fields input,
.lethalfantasy .spell-content .form-fields select {
@ -1161,7 +1099,7 @@ i.lethalfantasy {
letter-spacing: 1px;
}
.lethalfantasy .spell-content .form-fields {
padding-top: 5px;
padding-top: 4px;
}
.lethalfantasy .spell-content label {
font-family: var(--font-secondary);
@ -1206,21 +1144,22 @@ i.lethalfantasy {
}
.lethalfantasy .vulnerability-content input,
.lethalfantasy .vulnerability-content select {
height: 1.5rem;
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .vulnerability-content input[name="name"] {
height: 50px;
margin-right: 10px;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
.lethalfantasy .vulnerability-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.lethalfantasy .vulnerability-content .form-fields input,
.lethalfantasy .vulnerability-content .form-fields select {
@ -1238,7 +1177,7 @@ i.lethalfantasy {
letter-spacing: 1px;
}
.lethalfantasy .vulnerability-content .form-fields {
padding-top: 5px;
padding-top: 4px;
}
.lethalfantasy .vulnerability-content label {
font-family: var(--font-secondary);
@ -1329,21 +1268,22 @@ i.lethalfantasy {
}
.lethalfantasy .equipment-content input,
.lethalfantasy .equipment-content select {
height: 1.5rem;
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;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
.lethalfantasy .equipment-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.lethalfantasy .equipment-content .form-fields input,
.lethalfantasy .equipment-content .form-fields select {
@ -1361,7 +1301,7 @@ i.lethalfantasy {
letter-spacing: 1px;
}
.lethalfantasy .equipment-content .form-fields {
padding-top: 5px;
padding-top: 4px;
}
.lethalfantasy .equipment-content label {
font-family: var(--font-secondary);
@ -1406,21 +1346,22 @@ i.lethalfantasy {
}
.lethalfantasy .shield-content input,
.lethalfantasy .shield-content select {
height: 1.5rem;
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;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
.lethalfantasy .shield-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.lethalfantasy .shield-content .form-fields input,
.lethalfantasy .shield-content .form-fields select {
@ -1438,7 +1379,7 @@ i.lethalfantasy {
letter-spacing: 1px;
}
.lethalfantasy .shield-content .form-fields {
padding-top: 5px;
padding-top: 4px;
}
.lethalfantasy .shield-content label {
font-family: var(--font-secondary);
@ -1483,21 +1424,22 @@ i.lethalfantasy {
}
.lethalfantasy .miracle-content input,
.lethalfantasy .miracle-content select {
height: 1.5rem;
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
.lethalfantasy .miracle-content input[name="name"] {
height: 50px;
margin-right: 10px;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
.lethalfantasy .miracle-content fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.lethalfantasy .miracle-content .form-fields input,
.lethalfantasy .miracle-content .form-fields select {
@ -1515,7 +1457,7 @@ i.lethalfantasy {
letter-spacing: 1px;
}
.lethalfantasy .miracle-content .form-fields {
padding-top: 5px;
padding-top: 4px;
}
.lethalfantasy .miracle-content label {
font-family: var(--font-secondary);

View File

@ -1,4 +1,9 @@
{
"COMBAT": {
"Round": "Second",
"Rounds": "Seconds",
"RoundNext": "Next second"
},
"LETHALFANTASY": {
"Armor": {
"Category": {
@ -178,7 +183,10 @@
}
},
"Label": {
"initiative": "Initiative",
"maxInitiativeWisdom": "Max initiative (from wisdom)",
"combat": "Combat",
"rollInitiative": "Roll initiative",
"money": "Money",
"favorResult": "Favor result",
"disfavorResult": "Disfavor result",
@ -233,7 +241,10 @@
"jog": "Jog",
"run": "Run",
"sprint": "Sprint",
"walk": "Walk"
"walk": "Walk",
"jumpBroad": "Broad jump",
"jumpRunning": "Running jump",
"jumpVertical": "Vertical jump"
},
"newArmor": "New armor",
"newWeapon": "New weapon",

View File

@ -11,6 +11,7 @@ import * as models from "./module/models/_module.mjs"
import * as documents from "./module/documents/_module.mjs"
import * as applications from "./module/applications/_module.mjs"
import { LethalFantasyCombatTracker, LethalFantasyCombat} from "./module/applications/combat.mjs"
import { handleSocketEvent } from "./module/socket.mjs"
import { Macros } from "./module/macros.mjs"
import { initControlButtons } from "./module/control-buttons.mjs"
@ -33,6 +34,9 @@ Hooks.once("init", function () {
documents,
}
CONFIG.ui.combat = LethalFantasyCombatTracker
CONFIG.Combat.documentClass = LethalFantasyCombat;
CONFIG.Actor.documentClass = documents.LethalFantasyActor
CONFIG.Actor.dataModels = {
character: models.LethalFantasyCharacter,

View File

@ -0,0 +1,191 @@
/* -------------------------------------------- */
export class LethalFantasyCombatTracker extends CombatTracker {
/* -------------------------------------------- */
static get defaultOptions() {
let path = "systems/fvtt-lethal-fantasy/templates/combat-tracker.hbs";
return foundry.utils.mergeObject(super.defaultOptions, {
template: path,
});
}
}
export class LethalFantasyCombat extends Combat {
/**
* Return the Array of combatants sorted into initiative order, breaking ties alphabetically by name.
* @returns {Combatant[]}
*/
setupTurns() {
console?.log("Setup Turns....");
this.turns ||= [];
// Determine the turn order and the current turn
const turns = this.combatants.contents.sort(this.sortCombatantsLF);
if (this.turn !== null) this.turn = Math.clamp(this.turn, 0, turns.length - 1);
// Update state tracking
let c = turns[this.turn];
this.current = this._getCurrentState(c);
if (!this.previous) this.previous = this.current;
// Return the array of prepared turns
return this.turns = turns;
}
async rollInitiative(ids, options) {
console.log("%%%%%%%%% Roll Initiative", ids, options);
await this.setFlag("acks", "lock-turns", true);
ids = typeof ids === "string" ? [ids] : ids;
let messages = [];
let rollMode = game.settings.get("core", "rollMode");
// Get current groups
let groups = this.getFlag('acks', 'groups') || [];
let maxInit = { value: -1, cId: "" }
let updates = [];
for (let cId of ids) {
const c = this.combatants.get(cId);
//console.log("Init for combattant", cId, c, ids)
let id = c._id || c.id
// get the associated token
let tokenId = c.token.id;
// Check if the current token ID is in a group
let groupData = groups.find((groupData) => groupData.tokens.includes(tokenId));
let initValue = -1;
let showMessage = true
let roll
if (groupData && groupData.initiative > 0) {
initValue = groupData.initiative;
showMessage = false
} else {
roll = c.getInitiativeRoll();
await roll.evaluate();
initValue = roll.total;
}
if (groupData) {
groupData.initiative = initValue
}
updates.push({ _id: id, initiative: initValue });
if (initValue > maxInit.value) {
maxInit.value = initValue;
maxInit.cId = id;
}
if (showMessage) {
// Determine the roll mode
if ((c.token.hidden || c.hidden)
&& (rollMode === "roll")) {
rollMode = "gmroll";
}
// Construct chat message data
const messageData = foundry.utils.mergeObject({
speaker: {
scene: canvas.scene._id,
actor: c.actor?.id || null,
token: c.token.id,
alias: c.token.name
},
flavor: game.i18n.format('ACKS.roll.individualInit', {
name: c.token.name,
}),
}, {});
const chatData = await roll.toMessage(messageData, {
rollMode,
create: false,
});
if (messages.length > 0) {
chatData.sound = null;
}
messages.push(chatData);
}
}
await CONFIG.ChatMessage.documentClass.create(messages);
this.pools = AcksCombat.getCombatantsPool();
await this.processOutNumbering();
await this.setFlag("acks", "lock-turns", false);
await this.updateEmbeddedDocuments("Combatant", updates);
setTimeout(function () {
const updateData = { turn: 0 };
game.combat.update(updateData);
}, 200);
return this;
}
async startCombat() {
console.log("Start Combat 1 !")
// Send chat message to all players to roll for initiative
ChatMessage.create({
user: game.user.id,
content: await renderTemplate(`systems/fvtt-lethal-fantasy/templates/chat-ask-initiative.hbs`, {
title: "Initiative roll requested",
text: text,
rollType: type,
}),
flags: { "fvtt-lethal-fantasy": { msg: "request-initiative-roll", content: {} } },
})
ChatMessage.create({ content: message, type: CONST.CHAT_MESSAGE_TYPES.GAME });
}
async nextTurn() {
console.log("NEXT TURN");
let turn = this.turn ?? -1;
let skipDefeated = this.settings.skipDefeated;
// Determine the next turn number
let next = null;
for (let [i, t] of this.turns.entries()) {
console.log("Turn", t);
if (i <= turn) continue;
if (skipDefeated && t.isDefeated) continue;
next = i;
break;
}
// Maybe advance to the next round
let round = this.round;
if ((this.round === 0) || (next === null) || (next >= this.turns.length)) {
return this.nextRound();
}
// Update the document, passing data through a hook first
const updateData = { round, turn: next };
const updateOptions = { advanceTime: CONFIG.time.turnTime, direction: 1 };
Hooks.callAll("combatTurn", this, updateData, updateOptions);
return this.update(updateData, updateOptions);
}
async nextRound() {
console.log('NEXT ROUND')
this.turnsDone = false
let turn = this.turn === null ? null : 0; // Preserve the fact that it's no-one's turn currently.
console.log("ROUND", this.round, this.turns);
let advanceTime = Math.max(this.turns.length - this.turn, 0) * CONFIG.time.turnTime;
advanceTime += CONFIG.time.roundTime;
let nextRound = this.round + 1;
// Update the document, passing data through a hook first
const updateData = { round: nextRound, turn };
const updateOptions = { advanceTime, direction: 1 };
Hooks.callAll("combatRound", this, updateData, updateOptions);
return this.update(updateData, updateOptions);
}
sortCombatantsLF(a, b) {
return a.initiative - b.initiative;
}
}

View File

@ -6,7 +6,7 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
static DEFAULT_OPTIONS = {
classes: ["character"],
position: {
width: 1150,
width: 1080,
height: 780,
},
window: {
@ -15,6 +15,7 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
actions: {
createEquipment: LethalFantasyCharacterSheet.#onCreateEquipment,
rangedAttackDefense: LethalFantasyCharacterSheet.#onRangedAttackDefense,
rollInitiative: LethalFantasyCharacterSheet.#onRollInitiative,
armorHitPointsPlus: LethalFantasyCharacterSheet.#onArmorHitPointsPlus,
armorHitPointsMinus: LethalFantasyCharacterSheet.#onArmorHitPointsMinus,
},
@ -149,10 +150,30 @@ export default class LethalFantasyCharacterSheet extends LethalFantasyActorSheet
static async #onRangedAttackDefense(event, target) {
const hasTarget = false
let roll = await LethalFantasyRoll.promptRangedDefense({
actorId: this.actor.id,
actorName: this.actor.name,
actorImage: this.actor.img
actorImage: this.actor.img,
})
if (!roll) return null
await roll.toMessage({}, { rollMode: roll.options.rollMode })
}
static async #onRollInitiative(event, target) {
const hasTarget = false
let actorClass = this.actor.system.biodata.class;
let wisDef = SYSTEM.CHARACTERISTICS_TABLES.wis.find((c) => c.value === this.actor.system.characteristics.wis.value)
let maxInit = Number(wisDef.init_cap) || 1000
let roll = await LethalFantasyRoll.promptInitiative({
actorId: this.actor.id,
actorName: this.actor.name,
actorImage: this.actor.img,
actorClass,
maxInit,
})
if (!roll) return null

View File

@ -85,6 +85,61 @@ export const ATTACKER_AIM_CHOICES = {
"focused": {label: "Focused (-8)", value: "-8"}
}
export const INITIATIVE_DICE_CHOICES_PER_CLASS = {
"untrained": [
{ "name": "Asleep or totally distracted (2D12)", "value": "2D12" },
{ "name": "Awake but unsuspecting (2D8)", "value": "2D8" },
{ "name": "Declared Ready on Alert (2D6)", "value": "2D6" },
{ "name": "Aware of the enemy, can hear them but not see (2D4)", "value": "2D4" },
{ "name": "Aware and know exactly where the enemy is (2D3)", "value": "2D3" }
],
"fighter": [
{ "name": "Asleep or totally distracted (1D12)", "value": "1D12" },
{ "name": "Awake but unsuspecting (1D8)", "value": "1D8" },
{ "name": "Declared Ready on Alert (1D6)", "value": "1D6" },
{ "name": "Aware of the enemy, can hear them but not see (1D4)", "value": "1D4" },
{ "name": "Aware and know exactly where the enemy is (1D3)", "value": "1D3" }
],
"rogue": [
{ "name": "Asleep or totally distracted (1D10)", "value": "1D10" },
{ "name": "Awake but unsuspecting (1D8)", "value": "1D8" },
{ "name": "Declared Ready on Alert (1D6)", "value": "1D6" },
{ "name": "Aware of the enemy, can hear them but not see (1D3)", "value": "1D3" },
{ "name": "Aware and know exactly where the enemy is (1D2)", "value": "1D2" }
],
"ranger": [
{ "name": "Asleep or totally distracted (1D10)", "value": "1D10" },
{ "name": "Awake but unsuspecting (1D8)", "value": "1D8" },
{ "name": "Declared Ready on Alert (1D6)", "value": "1D6" },
{ "name": "Aware of the enemy, can hear them but not see (1D4)", "value": "1D4" },
{ "name": "Aware and know exactly where the enemy is (1D3)", "value": "1D3"}
],
"cleric": [
{ "name": "Asleep or totally distracted (1D2)", "value": "1D12" },
{ "name": "Awake but unsuspecting (1D10)", "value": "1D10" },
{ "name": "Declared Ready on Alert (1D8)", "value": "1D8" },
{ "name": "Aware of the enemy, can hear them but not see (1D6)", "value": "1D6" },
{ "name": "Aware and know exactly where the enemy is (1D4)", "value": "1D4" }
],
"magicuser": [
{ "name": "Sleeping to recover Aether Points (2D20)", "value": "2D20" },
{ "name": "Asleep or totally distracted (1D20)", "value": "1D20" },
{ "name": "Awake but unsuspecting (1D12)", "value": "1D12" },
{ "name": "Declared Ready on Alert (1D10)", "value": "1D10" },
{ "name": "Aware of the enemy, can hear them but not see (1D8)", "value": "1D8" },
{ "name": "Aware and know exactly where the enemy is (1D6)", "value": "1D6" }
]
}
export const CHAR_CLASSES = {
"untrained": "Untrained",
"fighter": "Fighter",
"rogue": "Rogue",
"ranger": "Ranger",
"cleric": "Cleric",
"magicuser": "Magic User"
}
export const DICE_VALUES = {
"d3": "D3",
"d4": "D4",
@ -189,6 +244,8 @@ export const SYSTEM = {
CHARACTERISTIC_ATTACK,
CHARACTERISTIC_DEFENSE,
CHARACTERISTIC_DAMAGE,
INITIATIVE_DICE_CHOICES_PER_CLASS,
CHAR_CLASSES,
MONEY,
ASCII,
CHOICE_MODIFIERS,

View File

@ -1,6 +1,7 @@
import LethalFantasyRoll from "./roll.mjs"
export default class LethalFantasyChatMessage extends ChatMessage {
async _renderRollContent(messageData) {
const data = messageData.message
if (this.rolls[0] instanceof LethalFantasyRoll) {

View File

@ -131,6 +131,7 @@ export default class LethalFantasyRoll extends Roll {
maxValue = Number(options.rollTarget.value.match(/\d+/)[0])
hasModifier = false
hasChangeDice = true
hasFavor = true
} else {
dice = "1D20"
maxValue = 20
@ -302,7 +303,7 @@ export default class LethalFantasyRoll extends Roll {
}
// Specific pain/poison/contagion case
if (options.rollType === "save" && options.rollTarget.rollKey.includes(["pain", "poison", "contagion"])) {
if (options.rollType === "save" && (options.rollTarget.rollKey === "pain" || options.rollTarget.rollKey === "poison" || options.rollTarget.rollKey === "contagion")) {
hasD30 = false
}
@ -428,8 +429,60 @@ export default class LethalFantasyRoll extends Roll {
return rollBase
}
static async promptInitiative(options = {}) {
const rollModes = Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const fieldRollMode = new foundry.data.fields.StringField({
choices: rollModes,
blank: false,
default: "public",
})
if ( SYSTEM.INITIATIVE_DICE_CHOICES_PER_CLASS[options.actorClass] ) {
options.initiativeDiceChoice = SYSTEM.INITIATIVE_DICE_CHOICES_PER_CLASS[options.actorClass]
} else {
options.initiativeDiceChoice = SYSTEM.INITIATIVE_DICE_CHOICES_PER_CLASS["untrained"]
}
let dialogContext = {
actorClass: options.actorClass,
initiativeDiceChoice: options.initiativeDiceChoice,
initiativeDice: "1D20",
maxInit: options.maxInit,
fieldRollMode,
rollModes
}
console.log("CTX", dialogContext)
const content = await renderTemplate("systems/fvtt-lethal-fantasy/templates/roll-initiative-dialog.hbs", dialogContext)
const label = game.i18n.localize("LETHALFANTASY.Label.initiative")
const rollContext = await foundry.applications.api.DialogV2.wait({
window: { title: "Initiative Roll" },
classes: ["lethalfantasy"],
content,
buttons: [
{
label: label,
callback: (event, button, dialog) => {
const output = Array.from(button.form.elements).reduce((obj, input) => {
if (input.name) obj[input.name] = input.value
return obj
}, {})
return output
},
},
],
rejectClose: false // Click on Close button will not launch an error
})
let initRoll = new Roll(`min(${rollContext.initiativeDice}, ${options.maxInit})`, options.data, rollContext)
await initRoll.evaluate()
initRoll.toMessage( {flavor: `Initiative for ${options.actorName}`}, {rollMode: rollContext.visibility} )
}
static async promptRangedDefense(rollTarget) {
const rollModes = Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const fieldRollMode = new foundry.data.fields.StringField({
choices: rollModes,

View File

@ -65,8 +65,8 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
}
schema.hp = new fields.SchemaField({
value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
value: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
max: new fields.NumberField({ ...requiredInteger, initial: 1, min: 0 }),
painDamage: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
wounds: new fields.ArrayField(new fields.SchemaField(woundFieldSchema ) , { initial: [{description:"", value:0, duration:0},{description:"", value:0, duration:0},
{description:"", value:0, duration:0},{description:"", value:0, duration:0},{description:"", value:0, duration:0},{description:"", value:0, duration:0},
@ -93,8 +93,13 @@ export default class LethalFantasyCharacter extends foundry.abstract.TypeDataMod
run: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
armorAdjust: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
})
schema.jump = new fields.SchemaField({
broad: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
running: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
vertical: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }),
})
schema.biodata = new fields.SchemaField({
class: new fields.StringField({ required: true, nullable: false, initial: "" }),
class: new fields.StringField({required: true, initial: "untrained", choices: SYSTEM.CHAR_CLASSES}),
level: new fields.NumberField({ ...requiredInteger, initial: 1, min: 1 }),
mortal: new fields.StringField({ required: true, nullable: false, initial: "" }),
alignment: new fields.StringField({ required: true, nullable: false, initial: "" }),

View File

@ -1 +1 @@
MANIFEST-000010
MANIFEST-000026

View File

@ -1,7 +1,7 @@
2025/01/09-22:31:28.606227 7f0abbfff6c0 Recovering log #8
2025/01/09-22:31:28.615890 7f0abbfff6c0 Delete type=3 #6
2025/01/09-22:31:28.615953 7f0abbfff6c0 Delete type=0 #8
2025/01/09-22:43:31.203725 7f0ab9bff6c0 Level-0 table #13: started
2025/01/09-22:43:31.203752 7f0ab9bff6c0 Level-0 table #13: 0 bytes OK
2025/01/09-22:43:31.296594 7f0ab9bff6c0 Delete type=0 #11
2025/01/09-22:43:31.296887 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2025/01/12-15:30:20.575853 7f0abaffd6c0 Recovering log #24
2025/01/12-15:30:20.585410 7f0abaffd6c0 Delete type=3 #22
2025/01/12-15:30:20.585495 7f0abaffd6c0 Delete type=0 #24
2025/01/12-15:39:07.053127 7f0ab9bff6c0 Level-0 table #29: started
2025/01/12-15:39:07.053167 7f0ab9bff6c0 Level-0 table #29: 0 bytes OK
2025/01/12-15:39:07.059547 7f0ab9bff6c0 Delete type=0 #27
2025/01/12-15:39:07.066140 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2025/01/09-22:06:01.230631 7f0abbfff6c0 Recovering log #4
2025/01/09-22:06:01.239976 7f0abbfff6c0 Delete type=3 #2
2025/01/09-22:06:01.240081 7f0abbfff6c0 Delete type=0 #4
2025/01/09-22:26:22.511134 7f0ab9bff6c0 Level-0 table #9: started
2025/01/09-22:26:22.511166 7f0ab9bff6c0 Level-0 table #9: 0 bytes OK
2025/01/09-22:26:22.540103 7f0ab9bff6c0 Delete type=0 #7
2025/01/09-22:26:22.609664 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2025/01/12-10:35:21.828083 7f0abaffd6c0 Recovering log #20
2025/01/12-10:35:21.838218 7f0abaffd6c0 Delete type=3 #18
2025/01/12-10:35:21.838276 7f0abaffd6c0 Delete type=0 #20
2025/01/12-10:41:38.476442 7f0ab9bff6c0 Level-0 table #25: started
2025/01/12-10:41:38.476474 7f0ab9bff6c0 Level-0 table #25: 0 bytes OK
2025/01/12-10:41:38.511873 7f0ab9bff6c0 Delete type=0 #23
2025/01/12-10:41:38.546259 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000010
MANIFEST-000026

View File

@ -1,7 +1,7 @@
2025/01/09-22:31:28.618153 7f0abb7fe6c0 Recovering log #8
2025/01/09-22:31:28.629092 7f0abb7fe6c0 Delete type=3 #6
2025/01/09-22:31:28.629179 7f0abb7fe6c0 Delete type=0 #8
2025/01/09-22:43:31.034575 7f0ab9bff6c0 Level-0 table #13: started
2025/01/09-22:43:31.034610 7f0ab9bff6c0 Level-0 table #13: 0 bytes OK
2025/01/09-22:43:31.125906 7f0ab9bff6c0 Delete type=0 #11
2025/01/09-22:43:31.296849 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2025/01/12-15:30:20.587864 7f0abbfff6c0 Recovering log #24
2025/01/12-15:30:20.598665 7f0abbfff6c0 Delete type=3 #22
2025/01/12-15:30:20.598718 7f0abbfff6c0 Delete type=0 #24
2025/01/12-15:39:07.046715 7f0ab9bff6c0 Level-0 table #29: started
2025/01/12-15:39:07.046747 7f0ab9bff6c0 Level-0 table #29: 0 bytes OK
2025/01/12-15:39:07.052973 7f0ab9bff6c0 Delete type=0 #27
2025/01/12-15:39:07.066129 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2025/01/09-22:06:01.242474 7f0abb7fe6c0 Recovering log #4
2025/01/09-22:06:01.252331 7f0abb7fe6c0 Delete type=3 #2
2025/01/09-22:06:01.252401 7f0abb7fe6c0 Delete type=0 #4
2025/01/09-22:26:22.580727 7f0ab9bff6c0 Level-0 table #9: started
2025/01/09-22:26:22.580760 7f0ab9bff6c0 Level-0 table #9: 0 bytes OK
2025/01/09-22:26:22.609536 7f0ab9bff6c0 Delete type=0 #7
2025/01/09-22:26:22.609684 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2025/01/12-10:35:21.840236 7f0abb7fe6c0 Recovering log #20
2025/01/12-10:35:21.850711 7f0abb7fe6c0 Delete type=3 #18
2025/01/12-10:35:21.850769 7f0abb7fe6c0 Delete type=0 #20
2025/01/12-10:41:38.512028 7f0ab9bff6c0 Level-0 table #25: started
2025/01/12-10:41:38.512054 7f0ab9bff6c0 Level-0 table #25: 0 bytes OK
2025/01/12-10:41:38.546064 7f0ab9bff6c0 Delete type=0 #23
2025/01/12-10:41:38.546272 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000010
MANIFEST-000026

View File

@ -1,7 +1,7 @@
2025/01/09-22:31:28.593009 7f0aba7fc6c0 Recovering log #8
2025/01/09-22:31:28.603392 7f0aba7fc6c0 Delete type=3 #6
2025/01/09-22:31:28.603450 7f0aba7fc6c0 Delete type=0 #8
2025/01/09-22:43:30.943627 7f0ab9bff6c0 Level-0 table #13: started
2025/01/09-22:43:30.943704 7f0ab9bff6c0 Level-0 table #13: 0 bytes OK
2025/01/09-22:43:31.034381 7f0ab9bff6c0 Delete type=0 #11
2025/01/09-22:43:31.296823 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2025/01/12-15:30:20.563784 7f0abb7fe6c0 Recovering log #24
2025/01/12-15:30:20.573785 7f0abb7fe6c0 Delete type=3 #22
2025/01/12-15:30:20.573842 7f0abb7fe6c0 Delete type=0 #24
2025/01/12-15:39:07.059698 7f0ab9bff6c0 Level-0 table #29: started
2025/01/12-15:39:07.059727 7f0ab9bff6c0 Level-0 table #29: 0 bytes OK
2025/01/12-15:39:07.066010 7f0ab9bff6c0 Delete type=0 #27
2025/01/12-15:39:07.066153 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2025/01/09-22:06:01.218155 7f0abaffd6c0 Recovering log #4
2025/01/09-22:06:01.228492 7f0abaffd6c0 Delete type=3 #2
2025/01/09-22:06:01.228577 7f0abaffd6c0 Delete type=0 #4
2025/01/09-22:26:22.540188 7f0ab9bff6c0 Level-0 table #9: started
2025/01/09-22:26:22.540210 7f0ab9bff6c0 Level-0 table #9: 0 bytes OK
2025/01/09-22:26:22.580587 7f0ab9bff6c0 Delete type=0 #7
2025/01/09-22:26:22.609674 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2025/01/12-10:35:21.813613 7f0abbfff6c0 Recovering log #20
2025/01/12-10:35:21.823625 7f0abbfff6c0 Delete type=3 #18
2025/01/12-10:35:21.823728 7f0abbfff6c0 Delete type=0 #20
2025/01/12-10:41:38.447331 7f0ab9bff6c0 Level-0 table #25: started
2025/01/12-10:41:38.447362 7f0ab9bff6c0 Level-0 table #25: 0 bytes OK
2025/01/12-10:41:38.476202 7f0ab9bff6c0 Delete type=0 #23
2025/01/12-10:41:38.546247 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000010
MANIFEST-000026

View File

@ -1,7 +1,7 @@
2025/01/09-22:31:28.631702 7f0abaffd6c0 Recovering log #8
2025/01/09-22:31:28.641622 7f0abaffd6c0 Delete type=3 #6
2025/01/09-22:31:28.641694 7f0abaffd6c0 Delete type=0 #8
2025/01/09-22:43:31.126046 7f0ab9bff6c0 Level-0 table #13: started
2025/01/09-22:43:31.126074 7f0ab9bff6c0 Level-0 table #13: 0 bytes OK
2025/01/09-22:43:31.203593 7f0ab9bff6c0 Delete type=0 #11
2025/01/09-22:43:31.296871 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2025/01/12-15:30:20.600324 7f0aba7fc6c0 Recovering log #24
2025/01/12-15:30:20.611083 7f0aba7fc6c0 Delete type=3 #22
2025/01/12-15:30:20.611177 7f0aba7fc6c0 Delete type=0 #24
2025/01/12-15:39:07.039586 7f0ab9bff6c0 Level-0 table #29: started
2025/01/12-15:39:07.039637 7f0ab9bff6c0 Level-0 table #29: 0 bytes OK
2025/01/12-15:39:07.046575 7f0ab9bff6c0 Delete type=0 #27
2025/01/12-15:39:07.066113 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2025/01/09-22:06:01.254140 7f0aba7fc6c0 Recovering log #4
2025/01/09-22:06:01.264214 7f0aba7fc6c0 Delete type=3 #2
2025/01/09-22:06:01.264273 7f0aba7fc6c0 Delete type=0 #4
2025/01/09-22:26:22.480492 7f0ab9bff6c0 Level-0 table #9: started
2025/01/09-22:26:22.480548 7f0ab9bff6c0 Level-0 table #9: 0 bytes OK
2025/01/09-22:26:22.511014 7f0ab9bff6c0 Delete type=0 #7
2025/01/09-22:26:22.609652 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2025/01/12-10:35:21.852854 7f0aba7fc6c0 Recovering log #20
2025/01/12-10:35:21.862623 7f0aba7fc6c0 Delete type=3 #18
2025/01/12-10:35:21.862679 7f0aba7fc6c0 Delete type=0 #20
2025/01/12-10:41:38.411505 7f0ab9bff6c0 Level-0 table #25: started
2025/01/12-10:41:38.411560 7f0ab9bff6c0 Level-0 table #25: 0 bytes OK
2025/01/12-10:41:38.447140 7f0ab9bff6c0 Delete type=0 #23
2025/01/12-10:41:38.546228 7f0ab9bff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -6,14 +6,15 @@
.character-main {
display: flex;
.character-pc {
display: flex;
gap: 10px;
flex: 1;
.character-left {
min-width: 180px;
min-width: 220px;
max-width: 220px;
display: flex;
flex-direction: column;
@ -21,23 +22,39 @@
display: flex;
justify-content: center;
align-items: center;
padding-bottom: 20px;
padding-bottom: 8px;
.character-img {
height: 140px;
width: 140px;
width: auto;
border: none;
}
}
.character-hp-edit {
input {
.character-hp {
display: flex;
gap: 2px;
align-items: center;
.character-hp-value {
.form-fields input {
flex: none;
min-width: 3rem;
max-width: 3rem;
margin-left: 10px;
font-size: calc(var(--font-size-standard) * 1.4);
}
}
.character-hp-max {
clear: both;
display: flex;
width: 60px;
font-size: calc(var(--font-size-standard) * 1.4);
flex-direction: row;
flex-wrap: wrap;
margin: 3px 0;
align-items: center;
justify-content: center;
padding: 0 5px 0 5px;
text-align: center;
input {
width: 50px;
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
}
}
}
}
@ -45,7 +62,7 @@
.character-right {
display: flex;
flex-direction: column;
gap: 5px;
gap: 4px;
.character-name {
display: flex;
@ -53,63 +70,21 @@
width: 400px;
}
}
.character-infos {
display: flex;
flex-direction: column;
gap: 10px;
label {
min-width: 120px;
}
.character-hp {
display: flex;
gap: 2px;
align-items: center;
.character-hp-value {
.form-fields input {
flex: none;
width: 50px;
margin-left: 10px;
font-size: calc(var(--font-size-standard) * 1.4);
}
}
.character-hp-max {
clear: both;
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin: 3px 0;
align-items: center;
input {
width: 50px;
text-align: center;
font-size: calc(var(--font-size-standard) * 1.4);
}
}
.hp-separator {
font-size: calc(var(--font-size-standard) * 1.2);
display: flex;
align-items: center;
justify-content: center;
}
}
}
}
}
.character-pc-play {
min-width: 500px;
min-width: 400px;
}
.character-pc-edit {
min-width: 650px;
min-width: 400px;
}
.character-characteristics {
display: flex;
flex-direction: column;
gap: 5px;
gap: 4px;
flex: 1;
.character-characteristic {
@ -122,10 +97,10 @@
}
.form-group {
flex: 1;
padding-left: 5px;
padding-left: 4px;
.form-fields {
flex: none;
width: 70px;
width: 3rem;
}
}
}
@ -133,13 +108,13 @@
.character-challenges {
display: flex;
flex-direction: column;
gap: 5px;
gap: 4px;
flex: 1;
.character-challenge {
display: flex;
align-items: center;
margin-right: 1rem;
margin-right: 0.5rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
@ -152,7 +127,7 @@
}
.form-group {
flex: 1;
padding-left: 5px;
padding-left: 4px;
.form-fields {
flex: none;
width: 50px;
@ -164,13 +139,13 @@
.character-movements {
display: flex;
flex-direction: column;
gap: 5px;
gap: 4px;
flex: 1;
.character-movement {
display: flex;
align-items: center;
margin-right: 1rem;
margin-right: 0.5rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
@ -183,7 +158,7 @@
}
.form-group {
flex: 1;
padding-left: 5px;
padding-left: 4px;
.form-fields {
flex: none;
width: 50px;
@ -195,13 +170,13 @@
.character-saves {
display: flex;
flex-direction: column;
gap: 5px;
gap: 4px;
flex: 1;
.character-save {
display: flex;
align-items: center;
margin-right: 0.2rem;
margin-right: 0.5rem;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
@ -211,17 +186,17 @@
flex: 0;
min-width: 5rem;
max-width: 5rem;
margin-left: 0.7rem;
}
margin-left: 0.5rem;
}
.name-pain {
flex: 0;
min-width: 3rem;
max-width: 3rem;
margin-left: 0.7rem;
margin-left: 0.5rem;
}
.form-group {
flex: 0;
padding-left: 5px;
padding-left: 4px;
.form-fields {
flex: none;
width: 50px;
@ -237,78 +212,21 @@
.character-characteristic-edit {
min-width: 400px;
}
.character-resources {
display: flex;
flex-direction: column;
gap: 5px;
flex: 1;
.character-resource {
display: flex;
align-items: center;
.rollable:hover,
.rollable:focus {
text-shadow: 0 0 8px var(--color-shadow-primary);
cursor:
pointer;
}
.form-group {
flex: 1;
padding-left: 5px;
.form-fields {
flex: none;
width: 70px;
}
}
.character-resource-edit {
display: flex;
align-items: center;
gap: 10px;
margin-left: 10px;
input {
display: flex;
width: 70px;
font-size: calc(var(--font-size-standard) * 1.4);
align-items: center;
justify-content: center;
padding: 0 5px 0 5px;
}
input[type="number"] {
text-align: center;
}
select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.5);
text-align: center;
width: 75px;
}
}
}
}
.character-resources-play {
min-width: 235px;
}
.character-resources-edit {
min-width: 400px;
}
}
.tab.character-biography {
.biodata {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
gap: 4px;
.biodata-elem {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
.item-img {
width: 32px;
height: 32px;
margin: 5px 0 0 0;
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
.name {
min-width: 8rem;
@ -331,21 +249,21 @@
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.0);
padding-left: 5px;
font-size: calc(var(--font-size-standard) * 1);
padding-left: 4px;
}
}
.skills {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
.skill {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
.item-img {
width: 32px;
height: 32px;
width: 24px;
height: 24px;
}
.name {
min-width: 12rem;
@ -355,14 +273,14 @@
.gifts {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
.gift {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
.item-img {
width: 32px;
height: 32px;
width: 24px;
height: 24px;
}
.name {
min-width: 12rem;
@ -372,14 +290,14 @@
.vulnerabilities {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
.vulnerability {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
.item-img {
width: 32px;
height: 32px;
width: 24px;
height: 24px;
}
.name {
min-width: 12rem;
@ -394,28 +312,28 @@
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
padding-left: 4px;
}
}
.moneys {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 10px;
gap: 4px;
}
.equipments {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
.equipment{
gap: 4px;
.equipment {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
.item-img {
width: 32px;
height: 32px;
margin: 5px 0 0 0;
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
.name {
min-width: 12rem;
@ -428,30 +346,33 @@
}
.tab.character-combat {
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
}
display: grid;
grid-template-columns: 1fr;
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 4px;
}
}
.combat-details {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
gap: 4px;
.combat-detail {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
button {
min-width: 10rem;
}
.armor-hp {
min-width: 20rem;
max-width: 20rem;
.input {
min-width: 3rem;
max-width: 3rem;
}
}
}
}
}
@ -459,11 +380,11 @@
.wounds {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
gap: 4px;
.wound {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
.wound-description {
min-width: 16rem;
max-width: 16rem;
@ -477,9 +398,9 @@
max-width: 3rem;
}
.item-img {
width: 32px;
height: 32px;
margin: 5px 0 0 0;
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
.name {
min-width: 12rem;
@ -490,15 +411,15 @@
.weapons {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
gap: 4px;
.weapon {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
.item-img {
width: 32px;
height: 32px;
margin: 5px 0 0 0;
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
.name {
min-width: 12rem;
@ -512,15 +433,15 @@
.armors {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
.armor {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
.item-img {
width: 32px;
height: 32px;
margin: 5px 0 0 0;
width: 24px;
height: 24px;
margin: 4px 0 0 0;
}
}
.name {
@ -535,21 +456,21 @@
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
padding-left: 4px;
}
}
.spells {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
.spell {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
.item-img {
width: 32px;
height: 32px;
width: 24px;
height: 24px;
}
.name {
min-width: 12rem;
@ -557,7 +478,6 @@
}
}
prose-mirror.inactive {
min-height: 40px;
}
@ -572,21 +492,21 @@
legend {
a {
font-size: calc(var(--font-size-standard) * 1.4);
padding-left: 5px;
padding-left: 4px;
}
}
.miracles {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
gap: 4px;
.miracle {
display: flex;
align-items: center;
gap: 10px;
gap: 4px;
.item-img {
width: 32px;
height: 32px;
width: 24px;
height: 24px;
}
.name {
min-width: 12rem;

View File

@ -1,6 +1,6 @@
:root {
--font-primary: "TimesNewRoman", serif;
--font-size-standard: 0.9rem;
--font-size-standard: 0.8rem;
--background-image-base: url("../assets/ui/lethal_fantasy_background.webp");
--font-secondary: "BaskervilleBold", serif;
--logo-standard: url("../assets/ui/lf_logo_small_02.webp");

View File

@ -15,23 +15,24 @@
input,
select {
height: 1.5rem;
background-color: rgba(0, 0, 0, 0.1);
border-color: var(--color-dark-6);
color: var(--color-dark-2);
}
input[name="name"] {
height: 50px;
margin-right: 10px;
height: 2.5rem;
margin-right: 4px;
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
font-size: calc(var(--font-size-standard) * 1.2);
font-weight: bold;
border: none;
}
fieldset {
margin-bottom: 5px;
border-radius: 5px;
margin-bottom: 4px;
border-radius: 4px;
}
.form-fields {
@ -63,7 +64,7 @@
.item-sheet-common {
.form-fields {
padding-top: 5px;
padding-top: 4px;
}
label {

View File

@ -4,8 +4,14 @@
<legend>{{localize "LETHALFANTASY.Label.combatDetails"}}</legend>
<div class="combat-details">
<div class="combat-detail">
<button class="action" data-action="rangedAttackDefense">{{localize
"LETHALFANTASY.Label.rangedAttackDefense"}}</button>
<button class="action" data-action="rangedAttackDefense">
{{localize "LETHALFANTASY.Label.rangedAttackDefense"}}
</button>
<button class="action" data-action="rollInitiative">
{{localize "LETHALFANTASY.Label.rollInitiative"}}
</button>
{{formField systemFields.combat.fields.armorHitPoints value=system.combat.armorHitPoints localize=true classes="armor-hp"}}
<a data-action="armorHitPointsPlus"><i class="fa-solid fa-hexagon-plus"></i></a>
@ -20,8 +26,8 @@
{{#each system.hp.wounds as |wound idx|}}
<div class="wound">
Name:<input class="wound-description wound-data" type="text" data-type="String" data-index="{{@index}}" value="{{wound.description}}" data-name="description" >
HP:<input class="wound-value wound-data" type="text" data-type="Number" data-index="{{@index}}" value="{{wound.value}}" data-name="value" >
Duration:<input class="wound-duration wound-data" type="text" data-type="Number" data-index="{{@index}}" value="{{wound.duration}}" data-name="duration" >
HP:<input class="wound-value wound-data" type="text" data-type="Number" data-index="{{@index}}" value="{{wound.value}}" data-name="value" >
</div>
{{/each}}
</div>

View File

@ -13,9 +13,9 @@
<fieldset class="character-characteristics character-characteristics-{{ifThen isPlayMode 'play' 'edit'}}">
<div class="flexrow character-hp">
<span class="name">{{localize "LETHALFANTASY.Label.HP"}}</span>
{{formInput systemFields.hp.fields.value value=system.hp.value disabled=isPlayMode classes="character-hp"}}
{{formInput systemFields.hp.fields.value value=system.hp.value disabled=isPlayMode classes="character-hp-value"}}
&nbsp;/&nbsp;
{{formInput systemFields.hp.fields.max value=system.hp.max disabled=isPlayMode classes="character-hp"}}
{{formInput systemFields.hp.fields.max value=system.hp.max disabled=isPlayMode classes="character-hp-value"}}
</div>
<div class="flexrow character-hp">
<span class="name">{{localize "LETHALFANTASY.Label.perception"}}</span>
@ -108,6 +108,10 @@
</a>
</span>
{{formField systemFields.saves.fields.pain.fields.value value=system.saves.pain.value disabled=true}}
<span data-tooltip="Pain save if wound exceeds">
{{formField systemFields.hp.fields.painDamage value=system.hp.painDamage disabled=isPlayMode tooltip="Pain Damage"}}
</span>
</div>
</div>
</fieldset>
@ -150,6 +154,14 @@
<span class="name">{{localize "LETHALFANTASY.Label.movement.sprint"}}</span>
{{formField systemFields.movement.fields.sprint value=system.movement.sprint disabled=isPlayMode}}
</div>
<div class="character-movement">
<span class="name">{{localize "LETHALFANTASY.Label.movement.jumpBroad"}}</span>
{{formField systemFields.jump.fields.broad value=system.jump.broad disabled=isPlayMode}}
<span class="name">{{localize "LETHALFANTASY.Label.movement.jumpRunning"}}</span>
{{formField systemFields.jump.fields.running value=system.jump.running disabled=isPlayMode}}
<span class="name">{{localize "LETHALFANTASY.Label.movement.jumpVertical"}}</span>
{{formField systemFields.jump.fields.vertical value=system.jump.vertical disabled=isPlayMode}}
</div>
</div>
</fieldset>
@ -162,14 +174,14 @@
<div class="character-characteristic">
{{localize "LETHALFANTASY.Label.str"}}
{{formField systemFields.characteristics.fields.str.fields.value value=system.characteristics.str.value
disabled=isPlayMode classes="rollable" data-char-id="str" }}
disabled=isPlayMode data-char-id="str" }}
{{formField systemFields.characteristics.fields.str.fields.percent value=system.characteristics.str.percent
disabled=isPlayMode type="number"}}
</div>
<div class="character-characteristic">
{{localize "LETHALFANTASY.Label.int"}}
{{formField systemFields.characteristics.fields.int.fields.value value=system.characteristics.int.value
disabled=isPlayMode classes="rollable" data-char-id="int" }}
disabled=isPlayMode data-char-id="int" }}
{{formField systemFields.characteristics.fields.int.fields.percent value=system.characteristics.int.percent
disabled=isPlayMode type="number" }}
@ -177,7 +189,7 @@
<div class="character-characteristic">
{{localize "LETHALFANTASY.Label.wis"}}
{{formField systemFields.characteristics.fields.wis.fields.value value=system.characteristics.wis.value
disabled=isPlayMode classes="rollable" data-char-id="wis" }}
disabled=isPlayMode data-char-id="wis" }}
{{formField systemFields.characteristics.fields.wis.fields.percent value=system.characteristics.wis.percent
disabled=isPlayMode type="number"}}
@ -185,7 +197,7 @@
<div class="character-characteristic">
{{localize "LETHALFANTASY.Label.dex"}}
{{formField systemFields.characteristics.fields.dex.fields.value value=system.characteristics.dex.value
disabled=isPlayMode classes="rollable" data-char-id="wis" }}
disabled=isPlayMode data-char-id="wis" }}
{{formField systemFields.characteristics.fields.dex.fields.percent value=system.characteristics.dex.percent
disabled=isPlayMode type="number" }}
@ -193,7 +205,7 @@
<div class="character-characteristic">
{{localize "LETHALFANTASY.Label.con"}}
{{formField systemFields.characteristics.fields.con.fields.value value=system.characteristics.con.value
disabled=isPlayMode classes="rollable" data-char-id="con" }}
disabled=isPlayMode data-char-id="con" }}
{{formField systemFields.characteristics.fields.con.fields.percent value=system.characteristics.con.percent
disabled=isPlayMode type="number"}}
@ -201,7 +213,7 @@
<div class="character-characteristic">
{{localize "LETHALFANTASY.Label.cha"}}
{{formField systemFields.characteristics.fields.cha.fields.value value=system.characteristics.cha.value
disabled=isPlayMode classes="rollable" data-char-id="cha" }}
disabled=isPlayMode data-char-id="cha" }}
{{formField systemFields.characteristics.fields.cha.fields.percent value=system.characteristics.cha.percent
disabled=isPlayMode type="number"}}
@ -209,7 +221,7 @@
<div class="character-characteristic">
{{localize "LETHALFANTASY.Label.luc"}}
{{formField systemFields.characteristics.fields.luc.fields.value value=system.characteristics.luc.value
disabled=isPlayMode classes="rollable" data-char-id="luc" }}
disabled=isPlayMode data-char-id="luc" }}
{{formField systemFields.characteristics.fields.luc.fields.percent value=system.characteristics.luc.percent
disabled=isPlayMode type="number"}}
@ -217,7 +229,7 @@
<div class="character-characteristic">
{{localize "LETHALFANTASY.Label.app"}}
{{formField systemFields.characteristics.fields.app.fields.value value=system.characteristics.app.value
disabled=isPlayMode classes="rollable" data-char-id="app" }}
disabled=isPlayMode data-char-id="app" }}
{{formField systemFields.characteristics.fields.app.fields.percent value=system.characteristics.app.percent
disabled=isPlayMode type="number"}}

View File

@ -0,0 +1,148 @@
<section class="{{cssClass}} directory flexcol" id="{{cssId}}" data-tab="{{tabName}}">
<header class="combat-tracker-header">
{{#if user.isGM}}
<nav class="encounters flexrow" aria-label="{{localize 'COMBAT.NavLabel'}}">
<a class="combat-button combat-create" aria-label="{{localize 'COMBAT.Create'}}" role="button"
data-tooltip="COMBAT.Create">
<i class="fas fa-plus"></i>
</a>
{{#if combatCount}}
<a class="combat-button combat-cycle" aria-label="{{localize 'COMBAT.EncounterPrevious'}}" role="button"
data-tooltip="COMBAT.EncounterPrevious" {{#if previousId}}data-document-id="{{previousId}}"
{{else}}disabled{{/if}}>
<i class="fas fa-caret-left"></i>
</a>
<h4 class="encounter">{{localize "COMBAT.Encounter"}} {{currentIndex}} / {{combatCount}}</h4>
<a class="combat-button combat-cycle" aria-label="{{localize 'COMBAT.EncounterNext'}}" role="button"
data-tooltip="COMBAT.EncounterNext" {{#if nextId}}data-document-id="{{nextId}}" {{else}}disabled{{/if}}>
<i class="fas fa-caret-right"></i>
</a>
{{/if}}
<a class="combat-button combat-control" aria-label="{{localize 'COMBAT.Delete'}}" role="button"
data-tooltip="COMBAT.Delete" data-control="endCombat" {{#unless combatCount}}disabled{{/unless}}>
<i class="fas fa-trash"></i>
</a>
</nav>
{{/if}}
<div class="encounter-controls flexrow {{#if hasCombat}}combat{{/if}}">
{{#if user.isGM}}
<a class="combat-button combat-control" aria-label="{{localize 'COMBAT.RollAll'}}" role="button"
data-tooltip="COMBAT.RollAll" data-control="rollAll" {{#unless turns}}disabled{{/unless}}>
<i class="fas fa-users"></i>
</a>
<a class="combat-button combat-control" aria-label="{{localize 'COMBAT.RollNPC'}}" role="button"
data-tooltip="COMBAT.RollNPC" data-control="rollNPC" {{#unless turns}}disabled{{/unless}}>
<i class="fas fa-users-cog"></i>
</a>
{{/if}}
{{#if combatCount}}
{{#if combat.round}}
<h3 class="encounter-title noborder">{{localize 'COMBAT.Round'}} {{combat.round}}</h3>
{{else}}
<h3 class="encounter-title noborder">{{localize 'COMBAT.NotStarted'}}</h3>
{{/if}}
{{else}}
<h3 class="encounter-title noborder">{{localize "COMBAT.None"}}</h3>
{{/if}}
{{#if user.isGM}}
<a class="combat-button combat-control" aria-label="{{localize 'COMBAT.InitiativeReset'}}" role="button"
data-tooltip="COMBAT.InitiativeReset" data-control="resetAll" {{#unless hasCombat}}disabled{{/unless}}>
<i class="fas fa-undo"></i>
</a>
<a class="combat-button combat-control" aria-label="{{localize 'labels.scope'}}" role="button"
data-tooltip="{{labels.scope}}" data-control="toggleSceneLink" {{#unless hasCombat}}disabled{{/unless}}>
<i class="fas fa-{{#unless linked}}un{{/unless}}link"></i>
</a>
{{/if}}
<a class="combat-button combat-settings" aria-label="{{localize 'COMBAT.Settings'}}" role="button"
data-tooltip="COMBAT.Settings" data-control="trackerSettings">
<i class="fas fa-cog"></i>
</a>
</div>
</header>
<ol id="combat-tracker" class="directory-list">
{{#each turns}}
<li class="combatant actor directory-item flexrow {{this.css}}" data-combatant-id="{{this.id}}">
<img class="token-image" data-src="{{this.img}}" alt="{{this.name}}" />
<div class="token-name flexcol">
<h4>{{this.name}}</h4>
<div class="combatant-controls flexrow">
{{#if ../user.isGM}}
<a class="combatant-control {{#if this.hidden}}active{{/if}}" aria-label="{{localize 'COMBAT.ToggleVis'}}"
role="button" data-tooltip="COMBAT.ToggleVis" data-control="toggleHidden">
<i class="fas fa-eye-slash"></i>
</a>
<a class="combatant-control {{#if this.defeated}}active{{/if}}" aria-label="{{localize 'COMBAT.ToggleDead'}}"
role="button" data-tooltip="COMBAT.ToggleDead" data-control="toggleDefeated">
<i class="fas fa-skull"></i>
</a>
{{/if}}
{{#if this.canPing}}
<a class="combatant-control" aria-label="{{localize 'COMBAT.PingCombatant'}}" role="button"
data-tooltip="COMBAT.PingCombatant" data-control="pingCombatant">
<i class="fa-solid fa-bullseye-arrow"></i>
</a>
{{/if}}
<div class="token-effects">
{{#each this.effects}}
<img class="token-effect" src="{{this}}" />
{{/each}}
</div>
</div>
</div>
{{#if this.hasResource}}
<div class="token-resource">
<span class="resource">{{this.resource}}</span>
</div>
{{/if}}
<div class="token-initiative">
{{#if this.hasRolled}}
<span class="initiative">{{this.initiative}}</span>
{{else if this.owner}}
<a class="combatant-control roll" aria-label="{{localize 'COMBAT.InitiativeRoll'}}" role="button"
data-tooltip="COMBAT.InitiativeRoll" data-control="rollInitiative"></a>
{{/if}}
</div>
</li>
{{/each}}
</ol>
<nav id="combat-controls" class="directory-footer flexrow" data-tooltip-direction="UP">
{{#if hasCombat}}
{{#if user.isGM}}
{{#if round}}
<!-- <a class="combat-control" aria-label="{{localize 'COMBAT.RoundPrev'}}" role="button" data-tooltip="COMBAT.RoundPrev"
data-control="previousRound"><i class="fas fa-step-backward"></i></a>
<a class="combat-control" aria-label="{{localize 'COMBAT.TurnPrev'}}" role="button" data-tooltip="COMBAT.TurnPrev"
data-control="previousTurn"><i class="fas fa-arrow-left"></i></a>
-->
<a class="combat-control" aria-label="{{localize 'COMBAT.End'}}" role="button"
data-control="endCombat">{{localize 'COMBAT.End'}}</a>
<!-- <a class="combat-control" aria-label="{{localize 'COMBAT.TurnNext'}}" role="button" data-tooltip="COMBAT.TurnNext"
data-control="nextTurn"><i class="fas fa-arrow-right"></i></a> -->
<a class="combat-control" aria-label="{{localize 'COMBAT.RoundNext'}}" role="button" data-tooltip="COMBAT.RoundNext"
data-control="nextRound"><i class="fas fa-step-forward"></i></a>
{{else}}
<a class="combat-control center" aria-label="{{localize 'COMBAT.Begin'}}" role="button"
data-control="startCombat">{{localize 'COMBAT.Begin'}}</a>
{{/if}}
{{else if control}}
<!--
<a class="combat-control" aria-label="{{localize 'COMBAT.TurnPrev'}}" role="button" data-tooltip="COMBAT.TurnPrev"
data-control="previousTurn"><i class="fas fa-arrow-left"></i></a>
<a class="combat-control center" aria-label="{{localize 'COMBAT.TurnEnd'}}" role="button"
data-control="nextTurn">{{localize 'COMBAT.TurnEnd'}}</a>
<a class="combat-control" aria-label="{{localize 'COMBAT.TurnNext'}}" role="button" data-tooltip="COMBAT.TurnNext"
data-control="nextTurn"><i class="fas fa-arrow-right"></i></a>
-->
{{/if}}
{{/if}}
</nav>
</section>

View File

@ -1,39 +0,0 @@
<table class="tenebris-table">
<thead>
<tr>
<th>{{localize "TENEBRIS.Manager.player"}}</th>
<th>{{localize "TENEBRIS.Manager.character"}}</th>
<th>{{localize "TENEBRIS.Manager.pv"}}</th>
<td data-action="saveAll" data-save="rob">{{localize "TENEBRIS.Manager.rob"}}</td>
<td data-action="saveAll" data-save="dex">{{localize "TENEBRIS.Manager.dex"}}</td>
<td data-action="saveAll" data-save="int">{{localize "TENEBRIS.Manager.int"}}</td>
<td data-action="saveAll" data-save="per">{{localize "TENEBRIS.Manager.per"}}</td>
<td data-action="saveAll" data-save="vol">{{localize "TENEBRIS.Manager.vol"}}</td>
<td data-action="resourceAll" data-resource="san">{{localize "TENEBRIS.Manager.san"}}</td>
<td data-action="resourceAll" data-resource="oeil">{{localize "TENEBRIS.Manager.oeil"}}</td>
<td data-action="resourceAll" data-resource="verbe">{{localize "TENEBRIS.Manager.verbe"}}</td>
<td data-action="resourceAll" data-resource="bourse">{{localize "TENEBRIS.Manager.bourse"}}</td>
<td data-action="resourceAll" data-resource="magie">{{localize "TENEBRIS.Manager.magie"}}</td>
</tr>
</thead>
<tbody>
{{#each players as |player|}}
{{!log "player" this}}
<tr class="player" data-user-id="{{player.id}}" data-character-name="{{player.character.name}}" data-character-id="{{player.character.id}}">
<td>{{player.name}}</td>
<td data-action="openSheet" data-character-id="{{player.character.id}}">{{player.character.name}}</td>
<td>{{player.character.system.pv.value}}</td>
<td data-action="saveOne" data-save="rob">{{player.character.system.caracteristiques.rob.valeur}}</td>
<td data-action="saveOne" data-save="dex">{{player.character.system.caracteristiques.dex.valeur}}</td>
<td data-action="saveOne" data-save="int">{{player.character.system.caracteristiques.int.valeur}}</td>
<td data-action="saveOne" data-save="per">{{player.character.system.caracteristiques.per.valeur}}</td>
<td data-action="saveOne" data-save="vol">{{player.character.system.caracteristiques.vol.valeur}}</td>
<td data-action="resourceOne" data-resource="san">{{player.character.system.ressources.san.valeur}}</td>
<td data-action="resourceOne" data-resource="oeil">{{player.character.system.ressources.oeil.valeur}}</td>
<td data-action="resourceOne" data-resource="verbe">{{player.character.system.ressources.verbe.valeur}}</td>
<td data-action="resourceOne" data-resource="bourse">{{player.character.system.ressources.bourse.valeur}}</td>
<td data-action="resourceOne" data-resource="magie">{{player.character.system.ressources.magie.valeur}}</td>
</tr>
{{/each}}
</tbody>
</table>

View File

@ -0,0 +1,20 @@
<div class="lethalfantasy-roll-initiative-dialog">
<fieldSet class="">
<legend>{{localize "LETHALFANTASY.Label.initiative"}}</legend>
<select name="initiativeDice" data-tooltip-direction="UP">
{{selectOptions initiativeDiceChoice selected=initiativeDice valueAttr="value" labelAttr="name"}}
</select>
<label>{{localize "LETHALFANTASY.Label.maxInitiativeWisdom"}} : {{maxInit}}</label>
</fieldSet>
<fieldSet>
<legend>{{localize "LETHALFANTASY.Roll.visibility"}}</legend>
<select name="visibility">
{{selectOptions rollModes selected=visibility}}
</select>
</fieldSet>
</div>