200 lines
6.2 KiB
JavaScript
200 lines
6.2 KiB
JavaScript
import { SYSTEM } from '../../config/system.mjs'
|
||
|
||
export let ActionHandler = null
|
||
|
||
Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
||
ActionHandler = class ActionHandler extends coreModule.api.ActionHandler {
|
||
|
||
/** @override */
|
||
async buildSystemActions(groupIds) {
|
||
this.actors = (!this.actor) ? this._getActors() : [this.actor]
|
||
this.actorType = this.actor?.type
|
||
|
||
if (this.actorType === 'character') {
|
||
await this.#buildCharacterActions()
|
||
} else if (this.actorType === 'creature') {
|
||
await this.#buildCreatureActions()
|
||
}
|
||
}
|
||
|
||
async #buildCharacterActions() {
|
||
await this.#buildAttributes()
|
||
await this.#buildHP()
|
||
await this.#buildFlow()
|
||
await this.#buildWeapons()
|
||
await this.#buildConditions()
|
||
await this.#buildAbilities()
|
||
await this.#buildKits()
|
||
await this.#buildUtility()
|
||
}
|
||
|
||
async #buildCreatureActions() {
|
||
await this.#buildAttributes()
|
||
await this.#buildHP()
|
||
}
|
||
|
||
async #buildAttributes() {
|
||
const actions = []
|
||
const attrKeys = ['agility', 'fitness', 'awareness', 'influence']
|
||
const labelKeys = {
|
||
agility: 'AWEMMY.Attribute.Agility',
|
||
fitness: 'AWEMMY.Attribute.Fitness',
|
||
awareness: 'AWEMMY.Attribute.Awareness',
|
||
influence: 'AWEMMY.Attribute.Influence'
|
||
}
|
||
for (const key of attrKeys) {
|
||
const attr = this.actor.system.attributes?.[key]
|
||
if (!attr) continue
|
||
const mod = attr.mod ?? 0
|
||
const modText = mod >= 0 ? `+${mod}` : `${mod}`
|
||
actions.push({
|
||
name: coreModule.api.Utils.i18n(labelKeys[key]),
|
||
id: key,
|
||
info1: { text: modText },
|
||
encodedValue: ['attribute', key].join(this.delimiter)
|
||
})
|
||
}
|
||
await this.addActions(actions, { id: 'attributes', type: 'system' })
|
||
}
|
||
|
||
async #buildHP() {
|
||
const hp = this.actor.system.hp
|
||
if (!hp) return
|
||
const tooltip = { content: `${hp.value} / ${hp.max}`, direction: 'LEFT' }
|
||
const actions = [
|
||
{
|
||
name: `${hp.value} / ${hp.max}`,
|
||
id: 'hp_display',
|
||
tooltip,
|
||
encodedValue: ['hp', 'display'].join(this.delimiter)
|
||
},
|
||
{
|
||
name: '+',
|
||
id: 'hp_add',
|
||
tooltip,
|
||
encodedValue: ['hp', 'add'].join(this.delimiter)
|
||
},
|
||
{
|
||
name: '−',
|
||
id: 'hp_sub',
|
||
tooltip,
|
||
encodedValue: ['hp', 'sub'].join(this.delimiter)
|
||
}
|
||
]
|
||
await this.addActions(actions, { id: 'hp', type: 'system' })
|
||
}
|
||
|
||
async #buildFlow() {
|
||
const fp = this.actor.system.flowPoints
|
||
if (fp === undefined) return
|
||
const tooltip = { content: `FP: ${fp.value}`, direction: 'LEFT' }
|
||
const actions = [
|
||
{
|
||
name: `${fp.value} FP`,
|
||
id: 'flow_display',
|
||
tooltip,
|
||
encodedValue: ['flow', 'display'].join(this.delimiter)
|
||
},
|
||
{
|
||
name: '+',
|
||
id: 'flow_add',
|
||
tooltip,
|
||
encodedValue: ['flow', 'add'].join(this.delimiter)
|
||
},
|
||
{
|
||
name: '−',
|
||
id: 'flow_sub',
|
||
tooltip,
|
||
encodedValue: ['flow', 'sub'].join(this.delimiter)
|
||
}
|
||
]
|
||
await this.addActions(actions, { id: 'flow', type: 'system' })
|
||
}
|
||
|
||
async #buildWeapons() {
|
||
const weapons = this.actor.itemTypes?.weapon ?? []
|
||
for (const weapon of weapons) {
|
||
const attrId = weapon.system.attackAttribute
|
||
const attr = this.actor.system.attributes?.[attrId]
|
||
const mod = attr?.mod ?? 0
|
||
const modText = mod >= 0 ? `+${mod}` : `${mod}`
|
||
|
||
const groupData = { id: `weapon_${weapon.id}`, name: weapon.name, type: 'system' }
|
||
this.addGroup(groupData, { id: 'weapons', type: 'system' }, true)
|
||
|
||
const actions = [{
|
||
name: weapon.name,
|
||
id: `weapon_${weapon.id}`,
|
||
info1: { text: modText },
|
||
encodedValue: ['weapon', weapon.id].join(this.delimiter)
|
||
}]
|
||
await this.addActions(actions, { id: `weapon_${weapon.id}`, type: 'system' })
|
||
}
|
||
}
|
||
|
||
async #buildConditions() {
|
||
const actions = []
|
||
for (const [key, cond] of Object.entries(SYSTEM.CONDITIONS)) {
|
||
const isActive = this.actor.statuses?.has(key) ?? false
|
||
actions.push({
|
||
name: coreModule.api.Utils.i18n(cond.label),
|
||
id: key,
|
||
info1: { text: isActive ? '✓' : '' },
|
||
encodedValue: ['condition', key].join(this.delimiter)
|
||
})
|
||
}
|
||
await this.addActions(actions, { id: 'conditions', type: 'system' })
|
||
}
|
||
|
||
async #buildAbilities() {
|
||
const abilities = this.actor.itemTypes?.ability ?? []
|
||
const actions = []
|
||
for (const ability of abilities) {
|
||
const sys = ability.system
|
||
const costLabel = game.i18n.localize(SYSTEM.ABILITY_COST[sys.cost]?.label ?? sys.cost)
|
||
const isUsed = sys.usedToday
|
||
actions.push({
|
||
name: ability.name,
|
||
id: ability.id,
|
||
info1: { text: isUsed ? `${costLabel} ✓` : costLabel },
|
||
encodedValue: ['ability', ability.id].join(this.delimiter)
|
||
})
|
||
}
|
||
await this.addActions(actions, { id: 'abilities', type: 'system' })
|
||
}
|
||
|
||
async #buildKits() {
|
||
const kits = this.actor.itemTypes?.kit ?? []
|
||
const actions = []
|
||
for (const kit of kits) {
|
||
const charges = kit.system.charges
|
||
const chargesText = `${charges.value}/${charges.max}`
|
||
actions.push({
|
||
name: kit.name,
|
||
id: kit.id,
|
||
info1: { text: chargesText },
|
||
encodedValue: ['kit', kit.id].join(this.delimiter)
|
||
})
|
||
}
|
||
await this.addActions(actions, { id: 'kits', type: 'system' })
|
||
}
|
||
|
||
async #buildUtility() {
|
||
const actions = []
|
||
actions.push({
|
||
name: coreModule.api.Utils.i18n('AWEMMY.TAH.LongRest'),
|
||
id: 'longRest',
|
||
encodedValue: ['utility', 'longRest'].join(this.delimiter)
|
||
})
|
||
if (game.combat?.current?.tokenId === this.token?.id) {
|
||
actions.push({
|
||
name: coreModule.api.Utils.i18n('AWEMMY.TAH.EndTurn'),
|
||
id: 'endTurn',
|
||
encodedValue: ['utility', 'endTurn'].join(this.delimiter)
|
||
})
|
||
}
|
||
await this.addActions(actions, { id: 'utility', type: 'system' })
|
||
}
|
||
}
|
||
})
|