Start combat management
This commit is contained in:
parent
8135a50248
commit
4e70cbfaf8
@ -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);
|
||||
|
13
lang/en.json
13
lang/en.json
@ -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",
|
||||
|
@ -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,
|
||||
|
191
module/applications/combat.mjs
Normal file
191
module/applications/combat.mjs
Normal 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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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) {
|
||||
|
@ -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,
|
||||
|
@ -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: "" }),
|
||||
|
@ -1 +1 @@
|
||||
MANIFEST-000010
|
||||
MANIFEST-000026
|
||||
|
@ -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)
|
||||
|
@ -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.
BIN
packs-system/lf-equipment/MANIFEST-000026
Normal file
BIN
packs-system/lf-equipment/MANIFEST-000026
Normal file
Binary file not shown.
@ -1 +1 @@
|
||||
MANIFEST-000010
|
||||
MANIFEST-000026
|
||||
|
@ -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)
|
||||
|
@ -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.
BIN
packs-system/lf-gifts/MANIFEST-000026
Normal file
BIN
packs-system/lf-gifts/MANIFEST-000026
Normal file
Binary file not shown.
@ -1 +1 @@
|
||||
MANIFEST-000010
|
||||
MANIFEST-000026
|
||||
|
@ -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)
|
||||
|
@ -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.
BIN
packs-system/lf-skills/MANIFEST-000026
Normal file
BIN
packs-system/lf-skills/MANIFEST-000026
Normal file
Binary file not shown.
@ -1 +1 @@
|
||||
MANIFEST-000010
|
||||
MANIFEST-000026
|
||||
|
@ -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)
|
||||
|
@ -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.
BIN
packs-system/lf-vulnerabilities/MANIFEST-000026
Normal file
BIN
packs-system/lf-vulnerabilities/MANIFEST-000026
Normal file
Binary file not shown.
@ -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;
|
||||
|
@ -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");
|
||||
|
@ -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 {
|
||||
|
@ -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>
|
||||
|
@ -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"}}
|
||||
/
|
||||
{{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"}}
|
||||
|
148
templates/combat-tracker.hbs
Normal file
148
templates/combat-tracker.hbs
Normal 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>
|
@ -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>
|
20
templates/roll-initiative-dialog.hbs
Normal file
20
templates/roll-initiative-dialog.hbs
Normal 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>
|
Loading…
x
Reference in New Issue
Block a user