Skip to content

Commit

Permalink
#81
Browse files Browse the repository at this point in the history
- Update for Foundry VTT 12.330 and dnd5e 3.3.
  • Loading branch information
Larkinabout committed Aug 6, 2024
1 parent d1db8b0 commit b98f593
Show file tree
Hide file tree
Showing 10 changed files with 112 additions and 91 deletions.
10 changes: 5 additions & 5 deletions module.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
"library": "false",
"compatibility": {
"minimum": 12.325,
"verified": 12.328,
"maximum": 12.328
"verified": 12.330,
"maximum": 12
},
"authors": [
{
Expand Down Expand Up @@ -37,9 +37,9 @@
"type": "system",
"compatibility": [
{
"minimum": "3.2.0",
"verified": "3.2.1",
"maximum": "3.2"
"minimum": "3.3.1",
"verified": "3.3.1",
"maximum": "3.3"
}
]
}
Expand Down
11 changes: 10 additions & 1 deletion scripts/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,16 @@ export const SHEET_TYPE = {
group: false,
item: false,
legacy: true,
npc: false
npc: true
},
ActorSheet5eNPC2: {
countersSetting: CONSTANTS.COUNTERS.SETTING.NPC_COUNTERS.KEY,
character: false,
custom: false,
group: false,
item: false,
legacy: false,
npc: true
},
GroupActorSheet: {
countersSetting: CONSTANTS.COUNTERS.SETTING.GROUP_COUNTERS.KEY,
Expand Down
20 changes: 17 additions & 3 deletions scripts/counters.js
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ function onTriggerZeroHp (actor) {
const counters = getCounters(actor)

Object.entries(counters).forEach(([source, counters2]) => {
if (!counters2) return

Object.entries(counters2).forEach(([key, value]) => {
const triggers = value.triggers
if (!triggers) return
Expand All @@ -187,6 +189,8 @@ function onTriggerHalfHp (actor) {
const counters = getCounters(actor)

Object.entries(counters).forEach(([source, counters2]) => {
if (!counters2) return

Object.entries(counters2).forEach(([key, value]) => {
const triggers = value.triggers
if (!triggers) return
Expand All @@ -207,6 +211,8 @@ function onTriggerCounterValue (actor, data) {
const counters = getCounters(actor)

Object.entries(counters).forEach(([source, counters2]) => {
if (!counters2) return

Object.entries(counters2).forEach(([key, value]) => {
key = (source === 'entity') ? `counters.${key}` : key
const counterValue = (source === 'entity') ? data.flags[MODULE.ID][key]?.value : data.flags[MODULE.ID][key]
Expand All @@ -229,6 +235,8 @@ function onTriggerRest (restType, actor) {
const counters = getCounters(actor)

Object.entries(counters).forEach(([source, counters2]) => {
if (!counters2) return

Object.entries(counters2).forEach(([key, value]) => {
const triggers = value.triggers
if (!triggers) return
Expand Down Expand Up @@ -397,8 +405,6 @@ function addCounters (app, html, data, sheetType) {

if (!data?.editable && checkEmpty(counters.world) && checkEmpty(counters.entity)) return

const detailsRightDiv = html[0].querySelector('.tab.details > .right')
const detailsRightTopDiv = detailsRightDiv.querySelector('.top')
const countersDiv = createCountersDiv(actor, data)
const ul = countersDiv.appendChild(document.createElement('ul'))
let someCounters = false
Expand All @@ -415,7 +421,15 @@ function addCounters (app, html, data, sheetType) {
}

if (data?.editable || someCounters) {
detailsRightTopDiv.after(countersDiv)
if (sheetType.character) {
const detailsRightDiv = html[0].querySelector('.tab.details > .right')
const detailsRightTopDiv = detailsRightDiv.querySelector('.top')
detailsRightTopDiv.after(countersDiv)
} else {
const sidebarDiv = html[0].querySelector('.sidebar')
sidebarDiv.insertBefore(countersDiv, sidebarDiv.firstChild)
}

if (!someCounters) {
countersDiv.classList.add('empty')
}
Expand Down
4 changes: 2 additions & 2 deletions scripts/house-rules.js
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ function setDeathSavesRollMode (actor, rollData) {

/**
* Recalculate Damage
* Trigger by the 'dnd5e.preApplyDamage' hook
* Triggered by the 'dnd5e.preApplyDamage' hook
* If 'Apply Negative HP' is enabled, recalculate damage to apply a negative value to HP
* @param {object} actor The actor
* @param {number} amount The damage amount
Expand All @@ -389,7 +389,7 @@ function recalculateDamage (actor, amount, updates, options) {
const newHpTemp = amount > 0 ? Math.max(hpTemp - amount, 0) : (updates['system.attribute.hp.temp'] ?? hpTemp)
const startHp = (getSetting(CONSTANTS.HIT_POINTS.SETTING.NEGATIVE_HP_HEAL_FROM_ZERO)) ? 0 : hpValue
const newHpValue = amount > 0
? hpValue - (amount - Math.mind(amount, hpTemp))
? hpValue - (amount - Math.min(amount, hpTemp))
: Math.min(startHp - amount, hpMax)

updates['system.attributes.hp.temp'] = newHpTemp
Expand Down
12 changes: 9 additions & 3 deletions scripts/patches/prepare-encumbrance.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@ export function patchPrepareEncumbrance () {
* @this {CharacterData|NPCData|VehicleData}
* @param {object} rollData The Actor's roll data.
*/
async function prepareEncumbrancePatch (rollData) {
async function prepareEncumbrancePatch (rollData, { validateItem } = {}) {
const convertWeight = dnd5e.utils.convertWeight
const simplifyBonus = dnd5e.utils.simplifyBonus

const equippedMod = (this.parent?.type === 'character') ? getSetting(CONSTANTS.ENCUMBRANCE.EQUIPPED_ITEM_WEIGHT_MODIFIER.SETTING.KEY) || 0 : 1
const proficientEquippedMod = (this.parent?.type === 'character') ? getSetting(CONSTANTS.ENCUMBRANCE.PROFICIENT_EQUIPPED_ITEM_WEIGHT_MODIFIER.SETTING.KEY) || 0 : 1
const unequippedMod = (this.parent?.type === 'character') ? getSetting(CONSTANTS.ENCUMBRANCE.UNEQUIPPED_ITEM_WEIGHT_MODIFIER.SETTING.KEY) || 0 : 1
Expand All @@ -25,7 +27,7 @@ async function prepareEncumbrancePatch (rollData) {

// Get the total weight from items
let weight = this.parent.items
.filter(item => !item.container)
.filter(item => !item.container && (validateItem?.(item) ?? true))
.reduce((weight, item) => {
const equipped = item.system.equipped
const proficient = item.system.prof?.multiplier >= 1
Expand All @@ -39,7 +41,11 @@ async function prepareEncumbrancePatch (rollData) {
if (game.settings.get('dnd5e', 'currencyWeight') && currency) {
const numCoins = Object.values(currency).reduce((val, denom) => val + Math.max(denom, 0), 0)
const currencyPerWeight = config.currencyPerWeight[unitSystem]
weight += numCoins / currencyPerWeight
weight += convertWeight(
numCoins / currencyPerWeight,
config.baseUnits.default[unitSystem],
baseUnits[unitSystem]
)
}

// Determine the Encumbrance size class
Expand Down
2 changes: 1 addition & 1 deletion scripts/sheets/character-sheet.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export class CustomDnd5eSheetCharacter2 extends dnd5e.applications.actor.ActorSh
/** @inheritDoc */
static get defaultOptions () {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ['custom-dnd5e', 'dnd5e2', 'sheet', 'actor', 'character']
classes: ['custom-dnd5e', 'dnd5e2', 'sheet', 'actor', 'character', 'vertical-tabs']
})
}

Expand Down
8 changes: 6 additions & 2 deletions styles/custom-dnd5e-character-sheet.css
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,8 @@
margin-left: 1px;
}

.custom-dnd5e.dnd5e2.sheet.actor.character .sheet-body .sidebar .card .stats .top .ac {
padding-bottom: 0.25rem;
.custom-dnd5e.dnd5e2.sheet.actor.character .sheet-body .sidebar .card .stats .top {
justify-content: center;
}

.custom-dnd5e.dnd5e2 .death-saves .pips:first-child {
Expand Down Expand Up @@ -266,6 +266,10 @@
flex-wrap: wrap;
}

.custom-dnd5e.dnd5e2.sheet.actor .sheet-body .main-content .tab-body .tab:not(.active) {
display: none;
}

.custom-dnd5e.dnd5e2.sheet.actor.character .tab-details .tab-body {
display: flex;
padding-top: 0;
Expand Down
22 changes: 11 additions & 11 deletions styles/custom-dnd5e-counters.css
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
width: 100%;
}

.dnd5e-theme-dark .character .custom-dnd5e-counters-counter input {
.dnd5e-theme-dark :is(.character, .npc) .custom-dnd5e-counters-counter input {
color: var(--color-text-dark-primary);
}

Expand All @@ -42,7 +42,7 @@
justify-content: center;
}

.dnd5e-theme-dark .character .custom-dnd5e-counters-counter i {
.dnd5e-theme-dark :is(.character, .npc) .custom-dnd5e-counters-counter i {
color: var(--dnd5e-color-blue-gray-3);
}

Expand All @@ -54,7 +54,7 @@
justify-content: center;
}

.dnd5e-theme-dark .character .dnd5e-custom-counters-separator {
.dnd5e-theme-dark :is(.character, .npc) .dnd5e-custom-counters-separator {
color: var(--color-text-dark-primary);
}

Expand All @@ -73,7 +73,7 @@
grid-column-end: 5;
}

.dnd5e-theme-dark .character .custom-dnd5e-counters-fraction-group {
.dnd5e-theme-dark :is(.character, .npc) .custom-dnd5e-counters-fraction-group {
background-color: var(--dnd5e-color-iron-gray);
border: 1px solid var(--dnd5e-color-blue-gray-3);
}
Expand All @@ -97,7 +97,7 @@
background-color: var(--dnd5e-color-parchment);
}

.dnd5e-theme-dark .character .custom-dnd5e-counters-number > input {
.dnd5e-theme-dark :is(.character, .npc) .custom-dnd5e-counters-number > input {
background-color: var(--dnd5e-color-iron-gray);
border: 1px solid var(--dnd5e-color-blue-gray-3);
}
Expand All @@ -110,7 +110,7 @@
grid-template-columns: 0.75fr 1.25fr 0.75fr 1.25fr;
}

.dnd5e-theme-dark .character .custom-dnd5e-counters-success-failure {
.dnd5e-theme-dark :is(.character, .npc) .custom-dnd5e-counters-success-failure {
background-color: var(--dnd5e-color-iron-gray);
border: 1px solid var(--dnd5e-color-blue-gray-3);
}
Expand All @@ -126,12 +126,12 @@
border-radius: 0;
}

.dnd5e-theme-dark .character .custom-dnd5e-counters-success-failure > input,
.dnd5e-theme-dark .character .custom-dnd5e-counters-success-failure
.dnd5e-theme-dark :is(.character, .npc) .custom-dnd5e-counters-success-failure > input,
.dnd5e-theme-dark :is(.character, .npc) .custom-dnd5e-counters-success-failure
> input:disabled:hover
.custom-dnd5e-counters-success-failure
> input,
.dnd5e-theme-dark .character .custom-dnd5e-counters-success-failure > input:disabled:hover {
.dnd5e-theme-dark :is(.character, .npc) .custom-dnd5e-counters-success-failure > input:disabled:hover {
border-left: 1px dashed var(--dnd5e-color-blue-gray-3);
}

Expand All @@ -144,8 +144,8 @@
border-right: 1px solid var(--color-border-light-tertiary);
}

.dnd5e-theme-dark .character .custom-dnd5e-counters-success-failure > input:first-of-type,
.dnd5e-theme-dark .character .custom-dnd5e-counters-success-failure
.dnd5e-theme-dark :is(.character, .npc) .custom-dnd5e-counters-success-failure > input:first-of-type,
.dnd5e-theme-dark :is(.character, .npc) .custom-dnd5e-counters-success-failure
> input:first-of-type:disabled:hover
.custom-dnd5e-counters-success-failure
> input:first-of-type,
Expand Down
70 changes: 26 additions & 44 deletions templates/sheet/character-details.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<div class="ability roboto-upper">{{ abbreviation }}</div>
{{/if}}
<a class="name {{ @root.rollableClass }} {{ roll }}">{{ label }}</a>
<div class="bonus"><span class="sign">{{ sign }}</span>{{ mod }}</div>
<div class="bonus">{{ dnd5e-formatModifier total }}</div>
{{#if @root.editable}}
<a class="config-button" data-action="{{ type }}" data-tooltip="{{ config }}"
aria-label="{{ localize config }}">
Expand All @@ -24,13 +24,17 @@
{{/inline}}

{{#*inline "ability-prof"}}
<li data-ability="{{ @key }}">
<li data-ability="{{ @key }}" class="{{ class }}">
{{#if isConcentration}}
<dnd5e-icon src="systems/dnd5e/icons/svg/statuses/concentrating.svg"></dnd5e-icon>
{{else}}
<proficiency-cycle type="ability" name="{{ path }}.proficient" data-tooltip="{{ hover }}"
value="{{#if @root.editable}}{{ baseProf }}{{else}}{{ proficient }}{{/if}}"
aria-label="{{ localize hover }}" {{ disabled (not @root.editable) }}></proficiency-cycle>
{{/if}}
<a class="name saving-throw full {{ @root.rollableClass }}">{{ label }}</a>
<a class="name saving-throw abbr {{ @root.rollableClass }}">{{ abbr }}</a>
<div class="bonus"><span class="sign">{{ sign }}</span>{{ mod }}</div>
<div class="bonus">{{ dnd5e-formatModifier save }}</div>
{{#if @root.editable}}
<a class="config-button" data-action="ability" data-tooltip="{{ config }}" aria-label="{{ localize config }}">
<i class="fas fa-cog"></i>
Expand All @@ -39,38 +43,6 @@
</li>
{{/inline}}

{{#*inline "traits"}}
{{#if (or @root.editable values)}}
<div class="pills-group {{#unless values}}empty{{/unless}}">
<h3 class="icon">
{{#if icon}}<i class="{{ icon }}"></i>
{{~else if svg}}<dnd5e-icon src="systems/dnd5e/icons/svg/{{svg}}.svg"></dnd5e-icon>{{/if}}
<span class="roboto-upper">{{ localize label }}</span>
{{#if @root.editable}}
<a class="trait-selector" data-trait="{{ key }}"
data-tooltip="{{ localize "DND5E.TraitConfig" trait=(localize label) }}"
aria-label="{{ localize "DND5E.TraitConfig" trait=(localize label) }}">
<i class="fas fa-cog"></i>
</a>
{{/if}}
</h3>
<ul class="pills">
{{#each values}}
<li class="pill {{ ../color }}">
{{#each icons}}
{{#with (lookup (lookup @root.config.itemProperties this) "label") as |label|}}
<i class="{{ ../this }}" data-tooltip="{{ localize 'DND5E.DamagePhysicalBypassesShort' type=label }}"
aria-label="{{ localize 'DND5E.DamagePhysicalBypassesShort' type=label }}"></i>
{{/with}}
{{/each}}
<span class="label">{{ label }}</span>
</li>
{{/each}}
</ul>
</div>
{{/if}}
{{/inline}}

<div class="tab details col-2" data-group="primary" data-tab="details">

{{!-- Ability Scores --}}
Expand Down Expand Up @@ -254,27 +226,37 @@
{{/if}}

{{!-- Resistances --}}
{{> "traits" values=traits.dr key="dr" color="green" icon="fas fa-shield-halved" label="DND5E.Resistances" }}
{{> "dnd5e.actor-trait-pills" values=traits.dr key="dr" color="green" icon="fas fa-shield-halved"
label="DND5E.Resistances" }}

{{!-- Immunities --}}
{{#if editable}}
{{> "traits" values=traits.di key="di" color="green" icon="fas fa-shield" label="DND5E.DamImm" }}
{{> "dnd5e.actor-trait-pills" values=traits.di key="di" color="green" icon="fas fa-shield"
label="DND5E.DamImm" }}
{{else}}
{{> "traits" values=traits.di key="di" color="green" icon="fas fa-shield" label="DND5E.Immunities" }}
{{> "dnd5e.actor-trait-pills" values=traits.di key="di" color="green" icon="fas fa-shield"
label="DND5E.Immunities" }}
{{/if}}
{{> "traits" values=traits.ci key="ci" color="green" svg="rosa-shield" label="DND5E.ConImm" }}
{{> "dnd5e.actor-trait-pills" values=traits.ci key="ci" color="green" svg="rosa-shield" label="DND5E.ConImm" }}

{{!-- Vulnerabilities --}}
{{> "traits" values=traits.dv key="dv" color="maroon" icon="fas fa-heart-crack" label="DND5E.Vulnerabilities" }}
{{> "dnd5e.actor-trait-pills" values=traits.dv key="dv" color="maroon" icon="fas fa-heart-crack"
label="DND5E.Vulnerabilities" }}

{{!-- Damage Modification --}}
{{> "dnd5e.actor-trait-pills" values=traits.dm key="dm" icon="fas fa-heart-circle-plus"
label="DND5E.DamageModification.Label" }}

{{!-- Armor --}}
{{> "traits" values=traits.armor key="armor" svg="checked-shield" label="DND5E.Armor" }}
{{> "dnd5e.actor-trait-pills" values=traits.armor key="armor" svg="checked-shield" label="DND5E.Armor" }}

{{!-- Weapons --}}
{{> "traits" values=traits.weapon key="weapon" svg="trait-weapon-proficiencies" label="TYPES.Item.weaponPl" }}
{{> "dnd5e.actor-trait-pills" values=traits.weapon key="weapon" svg="trait-weapon-proficiencies"
label="TYPES.Item.weaponPl" }}

{{!-- Languages --}}
{{> "traits" values=traits.languages key="languages" icon="fas fa-flag" label="DND5E.Languages" }}
{{> "dnd5e.actor-trait-pills" values=traits.languages key="languages" icon="fas fa-flag"
label="DND5E.Languages" }}

</div>
</div>
</div>
Loading

0 comments on commit b98f593

Please sign in to comment.