Compare commits

...

2 Commits
13.0.0 ... main

Author SHA1 Message Date
b5857cb3b7 Various fixes for v13
All checks were successful
Release Creation / build (release) Successful in 53s
2025-06-05 16:14:25 +02:00
7a06e8a5c9 Combat tab for v13
All checks were successful
Release Creation / build (release) Successful in 1m20s
2025-05-29 18:48:33 +02:00
41 changed files with 710 additions and 173 deletions

View File

@ -13,6 +13,16 @@
--font-secondary: "BaskervilleBold", serif;
--logo-standard: url("../assets/ui/lf_logo_small_02.webp");
}
.initiative-area {
min-width: 8rem;
max-width: 8rem;
display: flex;
flex-direction: row;
}
.initiative-area input {
min-width: 3rem;
max-width: 3rem;
}
#logo {
content: var(--logo-standard);
width: 50px;
@ -73,9 +83,33 @@ i.lethalfantasy {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.2);
}
.lethalfantasy .item-sheet-common {
overflow: auto;
}
.lethalfantasy .item-sheet-common .form-fields {
padding-top: 4px;
}
.lethalfantasy .item-sheet-common .form-group {
display: flex;
flex: 1;
flex-direction: row;
}
.lethalfantasy .item-sheet-common .form-group label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
.lethalfantasy .item-sheet-common .form-group select,
.lethalfantasy .item-sheet-common .form-group input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
.lethalfantasy .item-sheet-common .form-group input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
.lethalfantasy .item-sheet-common label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
@ -85,10 +119,6 @@ i.lethalfantasy {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .item-sheet-common .shift-right {
margin-left: 2rem;
@ -102,6 +132,12 @@ i.lethalfantasy {
background-size: 100% 100%;
overflow: scroll;
}
.lethalfantasy .character-content nav.tabs [data-tab] {
color: #636060;
}
.lethalfantasy .character-content nav.tabs [data-tab].active {
color: #252424;
}
.lethalfantasy .character-content input:disabled,
.lethalfantasy .character-content select:disabled {
background-color: rgba(0, 0, 0, 0.2);
@ -720,6 +756,12 @@ i.lethalfantasy {
background-size: 100% 100%;
overflow: scroll;
}
.lethalfantasy .monster-content nav.tabs [data-tab] {
color: #636060;
}
.lethalfantasy .monster-content nav.tabs [data-tab].active {
color: #252424;
}
.lethalfantasy .monster-content input:disabled,
.lethalfantasy .monster-content select:disabled {
background-color: rgba(0, 0, 0, 0.2);
@ -1190,6 +1232,13 @@ i.lethalfantasy {
background-image: var(--background-image-base);
background-repeat: no-repeat;
background-size: 100% 100%;
overflow: auto;
}
.lethalfantasy .skill-content nav.tabs [data-tab] {
color: #636060;
}
.lethalfantasy .skill-content nav.tabs [data-tab].active {
color: #252424;
}
.lethalfantasy .skill-content input:disabled,
.lethalfantasy .skill-content select:disabled {
@ -1234,6 +1283,27 @@ i.lethalfantasy {
.lethalfantasy .skill-content .form-fields {
padding-top: 4px;
}
.lethalfantasy .skill-content .form-group {
display: flex;
flex: 1;
flex-direction: row;
}
.lethalfantasy .skill-content .form-group label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
.lethalfantasy .skill-content .form-group select,
.lethalfantasy .skill-content .form-group input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
.lethalfantasy .skill-content .form-group input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
.lethalfantasy .skill-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
@ -1243,10 +1313,6 @@ i.lethalfantasy {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .skill-content .shift-right {
margin-left: 2rem;
@ -1276,6 +1342,13 @@ i.lethalfantasy {
background-image: var(--background-image-base);
background-repeat: no-repeat;
background-size: 100% 100%;
overflow: auto;
}
.lethalfantasy .gift-content nav.tabs [data-tab] {
color: #636060;
}
.lethalfantasy .gift-content nav.tabs [data-tab].active {
color: #252424;
}
.lethalfantasy .gift-content input:disabled,
.lethalfantasy .gift-content select:disabled {
@ -1320,6 +1393,27 @@ i.lethalfantasy {
.lethalfantasy .gift-content .form-fields {
padding-top: 4px;
}
.lethalfantasy .gift-content .form-group {
display: flex;
flex: 1;
flex-direction: row;
}
.lethalfantasy .gift-content .form-group label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
.lethalfantasy .gift-content .form-group select,
.lethalfantasy .gift-content .form-group input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
.lethalfantasy .gift-content .form-group input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
.lethalfantasy .gift-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
@ -1329,10 +1423,6 @@ i.lethalfantasy {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .gift-content .shift-right {
margin-left: 2rem;
@ -1362,6 +1452,13 @@ i.lethalfantasy {
background-image: var(--background-image-base);
background-repeat: no-repeat;
background-size: 100% 100%;
overflow: auto;
}
.lethalfantasy .weapon-content nav.tabs [data-tab] {
color: #636060;
}
.lethalfantasy .weapon-content nav.tabs [data-tab].active {
color: #252424;
}
.lethalfantasy .weapon-content input:disabled,
.lethalfantasy .weapon-content select:disabled {
@ -1406,6 +1503,27 @@ i.lethalfantasy {
.lethalfantasy .weapon-content .form-fields {
padding-top: 4px;
}
.lethalfantasy .weapon-content .form-group {
display: flex;
flex: 1;
flex-direction: row;
}
.lethalfantasy .weapon-content .form-group label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
.lethalfantasy .weapon-content .form-group select,
.lethalfantasy .weapon-content .form-group input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
.lethalfantasy .weapon-content .form-group input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
.lethalfantasy .weapon-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
@ -1415,10 +1533,6 @@ i.lethalfantasy {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .weapon-content .shift-right {
margin-left: 2rem;
@ -1440,6 +1554,13 @@ i.lethalfantasy {
background-image: var(--background-image-base);
background-repeat: no-repeat;
background-size: 100% 100%;
overflow: auto;
}
.lethalfantasy .armor-content nav.tabs [data-tab] {
color: #636060;
}
.lethalfantasy .armor-content nav.tabs [data-tab].active {
color: #252424;
}
.lethalfantasy .armor-content input:disabled,
.lethalfantasy .armor-content select:disabled {
@ -1484,6 +1605,27 @@ i.lethalfantasy {
.lethalfantasy .armor-content .form-fields {
padding-top: 4px;
}
.lethalfantasy .armor-content .form-group {
display: flex;
flex: 1;
flex-direction: row;
}
.lethalfantasy .armor-content .form-group label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
.lethalfantasy .armor-content .form-group select,
.lethalfantasy .armor-content .form-group input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
.lethalfantasy .armor-content .form-group input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
.lethalfantasy .armor-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
@ -1493,10 +1635,6 @@ i.lethalfantasy {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .armor-content .shift-right {
margin-left: 2rem;
@ -1518,6 +1656,13 @@ i.lethalfantasy {
background-image: var(--background-image-base);
background-repeat: no-repeat;
background-size: 100% 100%;
overflow: auto;
}
.lethalfantasy .spell-content nav.tabs [data-tab] {
color: #636060;
}
.lethalfantasy .spell-content nav.tabs [data-tab].active {
color: #252424;
}
.lethalfantasy .spell-content input:disabled,
.lethalfantasy .spell-content select:disabled {
@ -1562,6 +1707,27 @@ i.lethalfantasy {
.lethalfantasy .spell-content .form-fields {
padding-top: 4px;
}
.lethalfantasy .spell-content .form-group {
display: flex;
flex: 1;
flex-direction: row;
}
.lethalfantasy .spell-content .form-group label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
.lethalfantasy .spell-content .form-group select,
.lethalfantasy .spell-content .form-group input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
.lethalfantasy .spell-content .form-group input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
.lethalfantasy .spell-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
@ -1571,10 +1737,6 @@ i.lethalfantasy {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .spell-content .shift-right {
margin-left: 2rem;
@ -1596,6 +1758,13 @@ i.lethalfantasy {
background-image: var(--background-image-base);
background-repeat: no-repeat;
background-size: 100% 100%;
overflow: auto;
}
.lethalfantasy .vulnerability-content nav.tabs [data-tab] {
color: #636060;
}
.lethalfantasy .vulnerability-content nav.tabs [data-tab].active {
color: #252424;
}
.lethalfantasy .vulnerability-content input:disabled,
.lethalfantasy .vulnerability-content select:disabled {
@ -1640,6 +1809,27 @@ i.lethalfantasy {
.lethalfantasy .vulnerability-content .form-fields {
padding-top: 4px;
}
.lethalfantasy .vulnerability-content .form-group {
display: flex;
flex: 1;
flex-direction: row;
}
.lethalfantasy .vulnerability-content .form-group label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
.lethalfantasy .vulnerability-content .form-group select,
.lethalfantasy .vulnerability-content .form-group input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
.lethalfantasy .vulnerability-content .form-group input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
.lethalfantasy .vulnerability-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
@ -1649,10 +1839,6 @@ i.lethalfantasy {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .vulnerability-content .shift-right {
margin-left: 2rem;
@ -1720,6 +1906,13 @@ i.lethalfantasy {
background-image: var(--background-image-base);
background-repeat: no-repeat;
background-size: 100% 100%;
overflow: auto;
}
.lethalfantasy .equipment-content nav.tabs [data-tab] {
color: #636060;
}
.lethalfantasy .equipment-content nav.tabs [data-tab].active {
color: #252424;
}
.lethalfantasy .equipment-content input:disabled,
.lethalfantasy .equipment-content select:disabled {
@ -1764,6 +1957,27 @@ i.lethalfantasy {
.lethalfantasy .equipment-content .form-fields {
padding-top: 4px;
}
.lethalfantasy .equipment-content .form-group {
display: flex;
flex: 1;
flex-direction: row;
}
.lethalfantasy .equipment-content .form-group label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
.lethalfantasy .equipment-content .form-group select,
.lethalfantasy .equipment-content .form-group input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
.lethalfantasy .equipment-content .form-group input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
.lethalfantasy .equipment-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
@ -1773,10 +1987,6 @@ i.lethalfantasy {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .equipment-content .shift-right {
margin-left: 2rem;
@ -1798,6 +2008,13 @@ i.lethalfantasy {
background-image: var(--background-image-base);
background-repeat: no-repeat;
background-size: 100% 100%;
overflow: auto;
}
.lethalfantasy .shield-content nav.tabs [data-tab] {
color: #636060;
}
.lethalfantasy .shield-content nav.tabs [data-tab].active {
color: #252424;
}
.lethalfantasy .shield-content input:disabled,
.lethalfantasy .shield-content select:disabled {
@ -1842,6 +2059,27 @@ i.lethalfantasy {
.lethalfantasy .shield-content .form-fields {
padding-top: 4px;
}
.lethalfantasy .shield-content .form-group {
display: flex;
flex: 1;
flex-direction: row;
}
.lethalfantasy .shield-content .form-group label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
.lethalfantasy .shield-content .form-group select,
.lethalfantasy .shield-content .form-group input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
.lethalfantasy .shield-content .form-group input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
.lethalfantasy .shield-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
@ -1851,10 +2089,6 @@ i.lethalfantasy {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .shield-content .shift-right {
margin-left: 2rem;
@ -1876,6 +2110,13 @@ i.lethalfantasy {
background-image: var(--background-image-base);
background-repeat: no-repeat;
background-size: 100% 100%;
overflow: auto;
}
.lethalfantasy .miracle-content nav.tabs [data-tab] {
color: #636060;
}
.lethalfantasy .miracle-content nav.tabs [data-tab].active {
color: #252424;
}
.lethalfantasy .miracle-content input:disabled,
.lethalfantasy .miracle-content select:disabled {
@ -1920,6 +2161,27 @@ i.lethalfantasy {
.lethalfantasy .miracle-content .form-fields {
padding-top: 4px;
}
.lethalfantasy .miracle-content .form-group {
display: flex;
flex: 1;
flex-direction: row;
}
.lethalfantasy .miracle-content .form-group label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
.lethalfantasy .miracle-content .form-group select,
.lethalfantasy .miracle-content .form-group input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
.lethalfantasy .miracle-content .form-group input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
.lethalfantasy .miracle-content label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1);
@ -1929,10 +2191,6 @@ i.lethalfantasy {
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.lethalfantasy .miracle-content .shift-right {
margin-left: 2rem;
@ -2109,8 +2367,9 @@ i.lethalfantasy {
padding-bottom: 0;
width: max-content;
margin: 0;
color: #252424;
}
#token-hud .hp-loss-wrap .hud-loss-hp-button-select {
padding-left: 8px;
font-size: 0.7rem;
font-size: 0.9rem;
}

View File

@ -1,6 +1,6 @@
{
"COMBAT": {
"Round": "Second",
"Round": "Second {round}",
"Rounds": "Seconds",
"RoundNext": "Next second"
},

View File

@ -2,17 +2,53 @@
/* -------------------------------------------- */
export class LethalFantasyCombatTracker extends foundry.applications.sidebar.tabs.CombatTracker {
async getData(options) {
let data = await super.getData(options);
for (let u of data.turns) {
static PARTS = {
"header": {
"template": "systems/fvtt-lethal-fantasy/templates/combat-tracker-header-v2.hbs"
},
"tracker": {
"template": "systems/fvtt-lethal-fantasy/templates/combat-tracker-v2.hbs"
},
"footer": {
"template": "systems/fvtt-lethal-fantasy/templates/combat-tracker-footer-v2.hbs"
}
}
static DEFAULT_OPTIONS = foundry.utils.mergeObject(super.DEFAULT_OPTIONS, {
actions: {
initiativePlus: LethalFantasyCombatTracker.#initiativePlus,
initiativeMinus: LethalFantasyCombatTracker.#initiativeMinus,
},
});
async _prepareContext(options) {
let data = await super._prepareContext(options);
console?.log("Combat Tracker Data", data);
/*for (let u of data.turns) {
let c = game.combat.combatants.get(u.id);
u.progressionCount = c.system.progressionCount
u.isMonster = c.actor.type === "monster"
}
console.log("Combat Data", data);
console.log("Combat Data", data);*/
return data;
}
static #initiativePlus(ev) {
ev.preventDefault();
let cId = ev.target.closest(".combatant").dataset.combatantId;
let c = game.combat.combatants.get(cId);
c.update({ 'initiative': c.initiative + 1 });
console.log("Initiative Plus");
}
static #initiativeMinus(ev) {
ev.preventDefault();
let cId = ev.target.closest(".combatant").dataset.combatantId;
let c = game.combat.combatants.get(cId);
let newInit = Math.max(c.initiative - 1, 0);
c.update({ 'initiative': newInit });
}
activateListeners(html) {
super.activateListeners(html);
// Display Combat settings
@ -21,7 +57,6 @@ export class LethalFantasyCombatTracker extends foundry.applications.sidebar.tab
let cId = ev.currentTarget.closest(".combatant").dataset.combatantId;
let c = game.combat.combatants.get(cId);
c.update({ 'initiative': c.initiative + 1 });
console.log("Initiative Plus");
});
html.find(".initiative-minus").click(ev => {
@ -160,10 +195,10 @@ export class LethalFantasyCombat extends Combat {
}
for (let c of this.combatants) {
if ( nextRound >= c.initiative) {
if (nextRound >= c.initiative) {
let user = game.users.find(u => u.active && u.character && u.character.id === c.actor.id);
if (user?.hasPlayerOwner) {
game.socket.emit(`system.${SYSTEM.id}`, { type: "rollProgressionDice", progressionCount: c.system.progressionCount+1, actorId: c.actor.id, combatId: this.id, combatantId: c.id });
game.socket.emit(`system.${SYSTEM.id}`, { type: "rollProgressionDice", progressionCount: c.system.progressionCount + 1, actorId: c.actor.id, combatId: this.id, combatantId: c.id });
} else {
user = game.users.find(u => u.active && u.isGM);
c.actor.system.rollProgressionDice(this.id, c.id);

View File

@ -59,18 +59,15 @@ export default class LethalFantasyItemSheet extends HandlebarsApplicationMixin(f
/** @override */
async _prepareContext() {
let context = await super._prepareContext()
const contextLocal = {
fields: this.document.schema.fields,
systemFields: this.document.system.schema.fields,
item: this.document,
system: this.document.system,
source: this.document.toObject(),
enrichedDescription: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true }),
isEditMode: this.isEditMode,
isPlayMode: this.isPlayMode,
isEditable: this.isEditable,
}
context = mergeObject(context, contextLocal)
context.fields = this.document.schema.fields
context.systemFields = this.document.system.schema.fields
context.item = this.document
context.system = this.document.system
context.source = this.document.toObject()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
context.isEditMode = this.isEditMode
context.isPlayMode = this.isPlayMode
context.isEditable = this.isEditable
return context
}
@ -97,7 +94,7 @@ export default class LethalFantasyItemSheet extends HandlebarsApplicationMixin(f
dragover: this._onDragOver.bind(this),
drop: this._onDrop.bind(this),
}
return new DragDrop(d)
return new foundry.applications.ux.DragDrop.implementation(d)
})
}

View File

@ -19,10 +19,4 @@ export default class LethalFantasyGiftSheet extends LethalFantasyItemSheet {
},
}
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.description, { async: true })
return context
}
}

View File

@ -60,17 +60,16 @@ export const FAVOR_CHOICES = {
}
export const MOVEMENT_CHOICES = {
"none": {label: "None (D8E)", value: "D8"},
"walk": {label: "Walk (D10E)", value: "D10"},
"jog": {label: "Jog (D12E)", value: "D12"},
"run": {label: "Run (D20E)", value: "D20"},
"incombat": {label: "In Combat (D12E)", value: "D12"}
"none": {label: "None (D20E Disfavor)", disfavor: true, value: "2D20kl"},
"walk": {label: "Walk (D20E Disfavor)", disfavor: true, value: "2D20kl"},
"run": {label: "Jog/Run/Sprint (D20E Favor)", favor: true, value: "2D20kh"},
"incombat": {label: "In Combat (D20E)", favor: false, value: "D20"}
}
export const MOVE_DIRECTION_CHOICES = {
"none": {label: "None (+0)", value: "0"},
"away": {label: "Away (+4)", value: "+4"},
"toward": {label: "Toward (+0)", value: "0"},
"toward": {label: "Toward (-5)", value: "-5"},
"lateral": {label: "Lateral (+10)", value: "+10"}
}

View File

@ -913,7 +913,7 @@ export default class LethalFantasyRoll extends Roll {
}
console.log("CTX", dialogContext)
const content = await renderTemplate("systems/fvtt-lethal-fantasy/templates/range-defense-dialog.hbs", dialogContext)
const content = await foundry.applications.handlebars.renderTemplate("systems/fvtt-lethal-fantasy/templates/range-defense-dialog.hbs", dialogContext)
const label = game.i18n.localize("LETHALFANTASY.Label.rangeDefenseRoll")
const rollContext = await foundry.applications.api.DialogV2.wait({
@ -966,7 +966,7 @@ export default class LethalFantasyRoll extends Roll {
options.D30result = rollD30.total
let dice = rollContext.movement
let maxValue = Number(dice.match(/\d+$/)[0]) // Update the max value agains
let maxValue = 20 // As per latest changes (was : Number(dice.match(/\d+$/)[0])
let rollTotal = -1
let diceResults = []
let resultType

View File

@ -238,7 +238,7 @@ export default class LethalFantasyMonster extends foundry.abstract.TypeDataModel
async rollProgressionDice(combatId, combatantId) {
const rollModes = Object.fromEntries(Object.entries(CONFIG.Dice.rollModes).map(([key, value]) => [key, game.i18n.localize(value)]))
const rollModes = foundry.utils.duplicate(CONFIG.Dice.rollModes)
const fieldRollMode = new foundry.data.fields.StringField({
choices: rollModes,
blank: false,

View File

@ -1 +1 @@
MANIFEST-000336
MANIFEST-000368

View File

@ -1,8 +1,8 @@
2025/05/14-09:18:06.447327 7f5ccd7fa6c0 Recovering log #334
2025/05/14-09:18:06.457498 7f5ccd7fa6c0 Delete type=3 #332
2025/05/14-09:18:06.457555 7f5ccd7fa6c0 Delete type=0 #334
2025/05/14-10:01:12.490342 7f5ccb7ff6c0 Level-0 table #339: started
2025/05/14-10:01:12.490385 7f5ccb7ff6c0 Level-0 table #339: 0 bytes OK
2025/05/14-10:01:12.496360 7f5ccb7ff6c0 Delete type=0 #337
2025/05/14-10:01:12.515162 7f5ccb7ff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/05/14-10:01:12.515209 7f5ccb7ff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/06/05-15:50:28.883020 7ff25bfff6c0 Recovering log #366
2025/06/05-15:50:28.892731 7ff25bfff6c0 Delete type=3 #364
2025/06/05-15:50:28.892781 7ff25bfff6c0 Delete type=0 #366
2025/06/05-16:13:09.126587 7ff25a3ff6c0 Level-0 table #371: started
2025/06/05-16:13:09.126654 7ff25a3ff6c0 Level-0 table #371: 0 bytes OK
2025/06/05-16:13:09.133473 7ff25a3ff6c0 Delete type=0 #369
2025/06/05-16:13:09.133695 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/06/05-16:13:09.133722 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2025/05/14-07:47:09.475124 7f5ccd7fa6c0 Recovering log #330
2025/05/14-07:47:09.486681 7f5ccd7fa6c0 Delete type=3 #328
2025/05/14-07:47:09.486812 7f5ccd7fa6c0 Delete type=0 #330
2025/05/14-08:06:15.866972 7f5ccb7ff6c0 Level-0 table #335: started
2025/05/14-08:06:15.867049 7f5ccb7ff6c0 Level-0 table #335: 0 bytes OK
2025/05/14-08:06:15.873425 7f5ccb7ff6c0 Delete type=0 #333
2025/05/14-08:06:15.893680 7f5ccb7ff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/05/14-08:06:15.893803 7f5ccb7ff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/06/05-15:38:54.440152 7ff2609fa6c0 Recovering log #362
2025/06/05-15:38:54.499643 7ff2609fa6c0 Delete type=3 #360
2025/06/05-15:38:54.499716 7ff2609fa6c0 Delete type=0 #362
2025/06/05-15:45:21.522661 7ff25a3ff6c0 Level-0 table #367: started
2025/06/05-15:45:21.522692 7ff25a3ff6c0 Level-0 table #367: 0 bytes OK
2025/06/05-15:45:21.550994 7ff25a3ff6c0 Delete type=0 #365
2025/06/05-15:45:21.618228 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)
2025/06/05-15:45:21.618272 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!ATr9wZhg5uTVTksM' @ 72057594037927935 : 1 .. '!items!zw9RQocTdz3HRjZK' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000335
MANIFEST-000367

View File

@ -1,8 +1,8 @@
2025/05/14-09:18:06.461139 7f5ccdffb6c0 Recovering log #333
2025/05/14-09:18:06.471748 7f5ccdffb6c0 Delete type=3 #331
2025/05/14-09:18:06.471810 7f5ccdffb6c0 Delete type=0 #333
2025/05/14-10:01:12.509221 7f5ccb7ff6c0 Level-0 table #338: started
2025/05/14-10:01:12.509244 7f5ccb7ff6c0 Level-0 table #338: 0 bytes OK
2025/05/14-10:01:12.515073 7f5ccb7ff6c0 Delete type=0 #336
2025/05/14-10:01:12.515202 7f5ccb7ff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/05/14-10:01:12.515252 7f5ccb7ff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/06/05-15:50:28.899788 7ff25affd6c0 Recovering log #365
2025/06/05-15:50:28.910099 7ff25affd6c0 Delete type=3 #363
2025/06/05-15:50:28.910166 7ff25affd6c0 Delete type=0 #365
2025/06/05-16:13:09.075458 7ff25a3ff6c0 Level-0 table #370: started
2025/06/05-16:13:09.075508 7ff25a3ff6c0 Level-0 table #370: 0 bytes OK
2025/06/05-16:13:09.082149 7ff25a3ff6c0 Delete type=0 #368
2025/06/05-16:13:09.102903 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/06/05-16:13:09.102950 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2025/05/14-07:47:09.493325 7f5ccc7f86c0 Recovering log #329
2025/05/14-07:47:09.503988 7f5ccc7f86c0 Delete type=3 #327
2025/05/14-07:47:09.504090 7f5ccc7f86c0 Delete type=0 #329
2025/05/14-08:06:15.873602 7f5ccb7ff6c0 Level-0 table #334: started
2025/05/14-08:06:15.873653 7f5ccb7ff6c0 Level-0 table #334: 0 bytes OK
2025/05/14-08:06:15.879920 7f5ccb7ff6c0 Delete type=0 #332
2025/05/14-08:06:15.893720 7f5ccb7ff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/05/14-08:06:15.893853 7f5ccb7ff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/06/05-15:38:54.508921 7ff25bfff6c0 Recovering log #361
2025/06/05-15:38:54.560400 7ff25bfff6c0 Delete type=3 #359
2025/06/05-15:38:54.560496 7ff25bfff6c0 Delete type=0 #361
2025/06/05-15:45:21.580332 7ff25a3ff6c0 Level-0 table #366: started
2025/06/05-15:45:21.580366 7ff25a3ff6c0 Level-0 table #366: 0 bytes OK
2025/06/05-15:45:21.618059 7ff25a3ff6c0 Delete type=0 #364
2025/06/05-15:45:21.618252 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)
2025/06/05-15:45:21.618291 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!yPWGvxHJbDNHVSnY' @ 72057594037927935 : 1 .. '!items!zjvGljrLk5SshC9D' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000335
MANIFEST-000367

View File

@ -1,8 +1,8 @@
2025/05/14-09:18:06.433768 7f5ccc7f86c0 Recovering log #333
2025/05/14-09:18:06.444450 7f5ccc7f86c0 Delete type=3 #331
2025/05/14-09:18:06.444513 7f5ccc7f86c0 Delete type=0 #333
2025/05/14-10:01:12.502915 7f5ccb7ff6c0 Level-0 table #338: started
2025/05/14-10:01:12.502947 7f5ccb7ff6c0 Level-0 table #338: 0 bytes OK
2025/05/14-10:01:12.509102 7f5ccb7ff6c0 Delete type=0 #336
2025/05/14-10:01:12.515190 7f5ccb7ff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/05/14-10:01:12.515243 7f5ccb7ff6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/06/05-15:50:28.868698 7ff2609fa6c0 Recovering log #365
2025/06/05-15:50:28.879202 7ff2609fa6c0 Delete type=3 #363
2025/06/05-15:50:28.879260 7ff2609fa6c0 Delete type=0 #365
2025/06/05-16:13:09.089330 7ff25a3ff6c0 Level-0 table #370: started
2025/06/05-16:13:09.089359 7ff25a3ff6c0 Level-0 table #370: 0 bytes OK
2025/06/05-16:13:09.096545 7ff25a3ff6c0 Delete type=0 #368
2025/06/05-16:13:09.102932 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/06/05-16:13:09.102971 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2025/05/14-07:47:09.459336 7f5ccdffb6c0 Recovering log #329
2025/05/14-07:47:09.470303 7f5ccdffb6c0 Delete type=3 #327
2025/05/14-07:47:09.470418 7f5ccdffb6c0 Delete type=0 #329
2025/05/14-08:06:15.886675 7f5ccb7ff6c0 Level-0 table #334: started
2025/05/14-08:06:15.886731 7f5ccb7ff6c0 Level-0 table #334: 0 bytes OK
2025/05/14-08:06:15.893424 7f5ccb7ff6c0 Delete type=0 #332
2025/05/14-08:06:15.893775 7f5ccb7ff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/05/14-08:06:15.893909 7f5ccb7ff6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/06/05-15:38:54.356422 7ff25b7fe6c0 Recovering log #361
2025/06/05-15:38:54.437204 7ff25b7fe6c0 Delete type=3 #359
2025/06/05-15:38:54.437267 7ff25b7fe6c0 Delete type=0 #361
2025/06/05-15:45:21.482142 7ff25a3ff6c0 Level-0 table #366: started
2025/06/05-15:45:21.482216 7ff25a3ff6c0 Level-0 table #366: 0 bytes OK
2025/06/05-15:45:21.522507 7ff25a3ff6c0 Delete type=0 #364
2025/06/05-15:45:21.618214 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)
2025/06/05-15:45:21.618263 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!7j8H7DbmBb9Uza2X' @ 72057594037927935 : 1 .. '!items!zt8s7564ep1La4XQ' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000035
MANIFEST-000067

View File

@ -1,8 +1,8 @@
2025/05/14-09:18:06.487926 7f5ccc7f86c0 Recovering log #33
2025/05/14-09:18:06.497838 7f5ccc7f86c0 Delete type=3 #31
2025/05/14-09:18:06.497894 7f5ccc7f86c0 Delete type=0 #33
2025/05/14-10:01:12.535301 7f5ccb7ff6c0 Level-0 table #38: started
2025/05/14-10:01:12.535349 7f5ccb7ff6c0 Level-0 table #38: 0 bytes OK
2025/05/14-10:01:12.541664 7f5ccb7ff6c0 Delete type=0 #36
2025/05/14-10:01:12.541942 7f5ccb7ff6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)
2025/05/14-10:01:12.541971 7f5ccb7ff6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)
2025/06/05-15:50:28.926119 7ff2609fa6c0 Recovering log #65
2025/06/05-15:50:28.936828 7ff2609fa6c0 Delete type=3 #63
2025/06/05-15:50:28.936884 7ff2609fa6c0 Delete type=0 #65
2025/06/05-16:13:09.082352 7ff25a3ff6c0 Level-0 table #70: started
2025/06/05-16:13:09.082382 7ff25a3ff6c0 Level-0 table #70: 0 bytes OK
2025/06/05-16:13:09.089177 7ff25a3ff6c0 Delete type=0 #68
2025/06/05-16:13:09.102923 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)
2025/06/05-16:13:09.102957 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2025/05/14-07:47:09.521604 7f5ccd7fa6c0 Recovering log #29
2025/05/14-07:47:09.533204 7f5ccd7fa6c0 Delete type=3 #27
2025/05/14-07:47:09.533353 7f5ccd7fa6c0 Delete type=0 #29
2025/05/14-08:06:15.894136 7f5ccb7ff6c0 Level-0 table #34: started
2025/05/14-08:06:15.894209 7f5ccb7ff6c0 Level-0 table #34: 0 bytes OK
2025/05/14-08:06:15.900873 7f5ccb7ff6c0 Delete type=0 #32
2025/05/14-08:06:15.921517 7f5ccb7ff6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)
2025/05/14-08:06:15.921613 7f5ccb7ff6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)
2025/06/05-15:38:54.623832 7ff25affd6c0 Recovering log #61
2025/06/05-15:38:54.686829 7ff25affd6c0 Delete type=3 #59
2025/06/05-15:38:54.686886 7ff25affd6c0 Delete type=0 #61
2025/06/05-15:45:21.746826 7ff25a3ff6c0 Level-0 table #66: started
2025/06/05-15:45:21.746885 7ff25a3ff6c0 Level-0 table #66: 0 bytes OK
2025/06/05-15:45:21.784562 7ff25a3ff6c0 Delete type=0 #64
2025/06/05-15:45:21.784803 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)
2025/06/05-15:45:21.839859 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!37mu4dxsSuftlnmP' @ 72057594037927935 : 1 .. '!items!zKOpU34oLziGJW6y' @ 0 : 0; will stop at (end)

View File

@ -1 +1 @@
MANIFEST-000335
MANIFEST-000367

View File

@ -1,8 +1,8 @@
2025/05/14-09:18:06.475503 7f5cccff96c0 Recovering log #333
2025/05/14-09:18:06.485731 7f5cccff96c0 Delete type=3 #331
2025/05/14-09:18:06.485791 7f5cccff96c0 Delete type=0 #333
2025/05/14-10:01:12.496479 7f5ccb7ff6c0 Level-0 table #338: started
2025/05/14-10:01:12.496503 7f5ccb7ff6c0 Level-0 table #338: 0 bytes OK
2025/05/14-10:01:12.502768 7f5ccb7ff6c0 Delete type=0 #336
2025/05/14-10:01:12.515177 7f5ccb7ff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/05/14-10:01:12.515216 7f5ccb7ff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/06/05-15:50:28.913563 7ff25b7fe6c0 Recovering log #365
2025/06/05-15:50:28.923236 7ff25b7fe6c0 Delete type=3 #363
2025/06/05-15:50:28.923301 7ff25b7fe6c0 Delete type=0 #365
2025/06/05-16:13:09.096673 7ff25a3ff6c0 Level-0 table #370: started
2025/06/05-16:13:09.096704 7ff25a3ff6c0 Level-0 table #370: 0 bytes OK
2025/06/05-16:13:09.102790 7ff25a3ff6c0 Delete type=0 #368
2025/06/05-16:13:09.102942 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/06/05-16:13:09.102964 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2025/05/14-07:47:09.507023 7f5ccdffb6c0 Recovering log #329
2025/05/14-07:47:09.517849 7f5ccdffb6c0 Delete type=3 #327
2025/05/14-07:47:09.517975 7f5ccdffb6c0 Delete type=0 #329
2025/05/14-08:06:15.880220 7f5ccb7ff6c0 Level-0 table #334: started
2025/05/14-08:06:15.880293 7f5ccb7ff6c0 Level-0 table #334: 0 bytes OK
2025/05/14-08:06:15.886487 7f5ccb7ff6c0 Delete type=0 #332
2025/05/14-08:06:15.893747 7f5ccb7ff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/05/14-08:06:15.893881 7f5ccb7ff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/06/05-15:38:54.562778 7ff25b7fe6c0 Recovering log #361
2025/06/05-15:38:54.621024 7ff25b7fe6c0 Delete type=3 #359
2025/06/05-15:38:54.621100 7ff25b7fe6c0 Delete type=0 #361
2025/06/05-15:45:21.551139 7ff25a3ff6c0 Level-0 table #366: started
2025/06/05-15:45:21.551169 7ff25a3ff6c0 Level-0 table #366: 0 bytes OK
2025/06/05-15:45:21.580145 7ff25a3ff6c0 Delete type=0 #364
2025/06/05-15:45:21.618241 7ff25a3ff6c0 Manual compaction at level-0 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)
2025/06/05-15:45:21.618280 7ff25a3ff6c0 Manual compaction at level-1 from '!folders!mnO9OzE7BEE2KDfh' @ 72057594037927935 : 1 .. '!items!zkK6ixtCsCw3RH9X' @ 0 : 0; will stop at (end)

View File

@ -4,6 +4,7 @@
overflow: scroll;
}
.character-main {
display: flex;

View File

@ -6,6 +6,17 @@
--logo-standard: url("../assets/ui/lf_logo_small_02.webp");
}
.initiative-area {
min-width: 8rem;
max-width: 8rem;
display: flex;
flex-direction: row;
input {
min-width: 3rem;
max-width: 3rem;
}
}
#logo {
content: var(--logo-standard);
width: 50px;

View File

@ -35,9 +35,10 @@
padding-bottom: 0;
width: max-content;
margin: 0;
color:#252424;
}
#token-hud .hp-loss-wrap .hud-loss-hp-button-select {
padding-left: 8px;
font-size: 0.7rem;
font-size: 0.9rem;
}

View File

@ -6,6 +6,14 @@
background-repeat: no-repeat;
background-size: 100% 100%;
nav.tabs [data-tab] {
color: #636060;
}
nav.tabs [data-tab].active {
color: #252424;
}
input:disabled,
select:disabled {
background-color: rgba(0, 0, 0, 0.2);
@ -39,11 +47,11 @@
input,
select {
text-align: center;
font-size: calc(var(--font-size-standard) * 1.0);
font-size: calc(var(--font-size-standard) * 1);
}
select {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.0);
font-size: calc(var(--font-size-standard) * 1);
}
}
@ -67,9 +75,33 @@
padding-top: 4px;
}
overflow: auto;
.form-group {
display: flex;
flex: 1;
flex-direction: row;
label {
align-content: center;
min-width: 10rem;
max-width: 10rem;
}
select,
input {
text-align: left;
min-width: 12rem;
max-width: 12rem;
}
input[type="checkbox"] {
min-width: 1.2rem;
max-width: 1.2rem;
margin-right: 0.5rem;
}
}
label {
font-family: var(--font-secondary);
font-size: calc(var(--font-size-standard) * 1.0);
font-size: calc(var(--font-size-standard) * 1);
flex: 50%;
}
@ -77,10 +109,6 @@
align-self: flex-start;
padding: 0.1rem;
margin-right: 0.2rem;
/*border-color: black;
border-width: 1px;
border-style: solid;
border-radius: 2%;*/
}
.shift-right {

View File

@ -6,7 +6,7 @@
</div>
<div class="intro-right">
<span>{{upperFirst rollName}}</span>
<span>{{actingCharName}} - {{upperFirst rollName}}</span>
{{#if (match rollType "attack")}}
<span>Attack roll !</span>

View File

@ -0,0 +1,39 @@
<nav class="combat-controls" data-tooltip-direction="UP">
{{~#if hasCombat~}}
{{!-- GM Controls --}}
{{#if user.isGM}}
{{#if combat.round}}
<!-- <button type="button" class="inline-control combat-control icon fa-solid fa-backward-step"
data-action="previousRound" data-tooltip aria-label="{{ localize "COMBAT.RoundPrev" }}"></button>
<button type="button" class="inline-control combat-control icon fa-solid fa-arrow-left" data-action="previousTurn"
data-tooltip aria-label="{{ localize "COMBAT.TurnPrev" }}"></button> -->
<button type="button" class="combat-control combat-control-lg" data-action="endCombat">
<i class="fa-solid fa-xmark" inert></i>
<span>{{ localize "COMBAT.End" }}</span>
</button>
<!-- <button type="button" class="inline-control combat-control icon fa-solid fa-arrow-right" data-action="nextTurn"
data-tooltip aria-label="{{ localize "COMBAT.TurnNext" }}"></button> -->
<button type="button" class="inline-control combat-control icon fa-solid fa-forward-step" data-action="nextRound"
data-tooltip aria-label="{{ localize "COMBAT.RoundNext" }}"></button>
{{else}}
<button type="button" class="combat-control combat-control-lg" data-action="startCombat">
<i class="fa-solid fa-swords" inert></i>
<span>{{ localize "COMBAT.Begin" }}</span>
</button>
{{/if}}
{{!-- Active Player Controls --}}
{{else if control}}
<!-- <button type="button" class="inline-control combat-control icon fa-solid fa-arrow-left" data-action="previousTurn"
data-tooltip aria-label="{{ localize "COMBAT.TurnPrev" }}"></button>
<button type="button" class="combat-control combat-control-lg" data-action="nextTurn">
<i class="fa-solid fa-check"></i>
<span>{{ localize "COMBAT.TurnEnd" }}</span>
</button>
<button type="button" class="inline-control combat-control icon fa-solid fa-arrow-right" data-action="nextTurn"
data-tooltip aria-label="{{ localize "COMBAT.TurnNext" }}"></button> -->
{{/if}}
{{/if}}
</nav>

View File

@ -0,0 +1,92 @@
<header class="combat-tracker-header">
{{!-- Encounter Controls --}}
{{#if user.isGM}}
<nav class="encounters {{ css }}" aria-label="{{ localize "COMBAT.NavLabel" }}">
{{!-- Cycle Display --}}
{{#if displayCycle}}
<button type="button" class="inline-control icon fa-solid fa-plus" data-action="createCombat"
data-tooltip aria-label="{{ localize "COMBAT.Create" }}"></button>
<div class="cycle-combats">
<button type="button" class="inline-control icon fa-solid fa-caret-left" data-action="cycleCombat"
{{#if previousId}}data-combat-id="{{ previousId }}" {{else}}disabled{{/if}}
data-tooltip aria-label="{{ localize "COMBAT.EncounterPrevious" }}"></button>
<div class="encounter-count">
<span class="value">{{ currentIndex }}</span>
<span class="separator">&sol;</span>
<span class="max">{{ combats.length }}</span>
</div>
<button type="button" class="inline-control icon fa-solid fa-caret-right" data-action="cycleCombat"
{{#if nextId}}data-combat-id="{{ nextId }}" {{else}}disabled{{/if}}
data-tooltip aria-label="{{ localize "COMBAT.EncounterNext" }}"></button>
</div>
<button type="button" class="inline-control icon fa-solid fa-gear" data-action="trackerSettings"
data-tooltip aria-label="{{ localize "COMBAT.Settings" }}"></button>
{{!-- Tabbed Display --}}
{{else if combats.length}}
<button type="button" class="inline-control icon fa-solid fa-plus" data-action="createCombat"
data-tooltip aria-label="{{ localize "COMBAT.Create" }}"></button>
{{#each combats}}
<button type="button" class="inline-control {{#if active}}active{{/if}}" data-action="cycleCombat"
data-combat-id="{{ id }}">
{{ label }}
</button>
{{/each}}
<button type="button" class="inline-control icon fa-solid fa-gear" data-action="trackerSettings"
data-tooltip aria-label="{{ localize "COMBAT.Settings" }}"></button>
{{!-- No Combats --}}
{{else}}
<button type="button" class="combat-control-lg" data-action="createCombat">
<i class="fa-solid fa-plus" inert></i>
<span>{{ localize "COMBAT.Create" }}</span>
</button>
{{/if}}
</nav>
{{/if}}
<div class="encounter-controls {{#if hasCombat}}combat{{/if}}">
{{!-- Bulk Rolls --}}
<div class="control-buttons left flexrow">
{{#if user.isGM}}
<button type="button" class="inline-control combat-control icon fa-solid fa-users" data-action="rollAll"
{{#unless combat.turns.length}}disabled{{/unless}} data-tooltip="COMBAT.RollAll"
aria-label="{{ localize "COMBAT.RollAll" }}"></button>
<button type="button" class="inline-control combat-control icon fa-solid fa-users-cog" data-action="rollNPC"
{{#unless combat.turns.length}}disabled{{/unless}} data-tooltip="COMBAT.RollNPC"
aria-label="{{ localize "COMBAT.RollNPC" }}"></button>
{{else}}
<div class="spacer"></div>
<div class="spacer"></div>
{{/if}}
</div>
{{!-- Combat Status --}}
<strong class="encounter-title">
{{#if combats.length}}
{{#if combat.round}}
{{ localize "COMBAT.Round" round=combat.round }}
{{else}}
{{ localize "COMBAT.NotStarted" }}
{{/if}}
{{else}}
{{ localize "COMBAT.None" }}
{{/if}}
</strong>
{{!-- Combat Controls --}}
<div class="control-buttons right flexrow">
<div class="spacer"></div>
<button type="button" class="encounter-context-menu inline-control combat-control icon fa-solid fa-ellipsis-vertical"
{{#unless (and user.isGM hasCombat)}}disabled{{/unless}}></button>
</div>
</div>
</header>

View File

@ -0,0 +1,81 @@
<ol class="combat-tracker plain">
{{#each turns}}
<li class="combatant {{ css }}" data-combatant-id="{{ id }}" data-action="activateCombatant">
{{!-- TODO: Targets --}}
{{!-- Image --}}
<img class="token-image" src="{{ img }}" alt="{{ name }}" loading="lazy">
{{!-- Name & Controls --}}
<div class="token-name">
<strong class="name">{{ name }}</strong>
<div class="combatant-controls">
{{#if @root.user.isGM}}
<button type="button" class="inline-control combatant-control icon fa-solid fa-eye-slash {{#if hidden}}active{{/if}}"
data-action="toggleHidden" data-tooltip aria-label="{{ localize "COMBAT.ToggleVis" }}"></button>
<button type="button" class="inline-control combatant-control icon fa-solid fa-skull {{#if isDefeated}}active{{/if}}"
data-action="toggleDefeated" data-tooltip
aria-label="{{ localize "COMBAT.ToggleDead" }}"></button>
{{/if}}
{{#if canPing}}
<button type="button" class="inline-control combatant-control icon fa-solid fa-bullseye-arrow"
data-action="pingCombatant" data-tooltip
aria-label="{{ localize "COMBAT.PingCombatant" }}"></button>
{{/if}}
{{#unless @root.user.isGM}}
<button type="button" class="inline-control combatant-control icon fa-solid fa-arrows-to-eye"
data-action="panToCombatant" data-tooltip
aria-label="{{ localize "COMBAT.PanToCombatant" }}"></button>
{{/unless}}
{{!-- TODO: Target Control --}}
<div class="token-effects" data-tooltip-html="{{ effects.tooltip }}">
{{#each effects.icons}}
<img class="token-effect" src="{{ img }}" alt="{{ name }}">
{{/each}}
</div>
</div>
</div>
{{!-- Resource --}}
{{#if resource includeZero=true}}
<div class="token-resource">
<span class="resource">{{ resource }}</span>
</div>
{{/if}}
{{!-- Initiative --}}
<div class="token-initiative initiative-area">
{{#if initiative includeZero=true}}
{{!-- Decimal Initiative --}}
{{#if @root.hasDecimals}}
<span>{{ initiative }}</span>
{{!-- Simple Initiative --}}
{{else}}
<input type="text" class="initiative-input" inputmode="numeric" pattern="^[+=\-]?\d*" value="{{ initiative }}"
aria-label="{{ localize "COMBAT.InitiativeScore" }}" {{#unless @root.user.isGM}}readonly{{/unless}}>
{{/if}}
{{#if isOwner}}
<a data-action="initiativePlus" class="initiative-plus" data-combatant-id="{{this.id}}"><i class="fa-solid fa-hexagon-plus"></i></a>
<a data-action="initiativeMinus" class="initiative-minus" data-combatant-id="{{this.id}}"><i class="fa-solid fa-hexagon-minus"></i></a>
{{/if}}
{{#if isMonster}}
<span class="initiative">-</span>
{{else}}
<span class="initiative" data-tooltip="Current max. progression counter">{{progressionCount}}</span>
{{/if}}
{{!-- Roll Initiative --}}
{{else if isOwner}}
<button type="button" class="combatant-control roll" data-action="rollInitiative" data-tooltip
aria-label="{{ localize "COMBAT.InitiativeRoll" }}"
style="--initiative-icon: url('{{ @root.initiativeIcon.icon }}'); --initiative-icon-hover: url('{{ @root.initiativeIcon.hover }}');"></button>
{{/if}}
</div>
</li>
{{/each}}
</ol>