forked from public/fvtt-cthulhu-eternal
295 lines
9.8 KiB
JavaScript
295 lines
9.8 KiB
JavaScript
|
// System Module Imports
|
||
|
import { Utils } from './utils.js'
|
||
|
import { SYSTEM } from "../../config/system.mjs"
|
||
|
export let ActionHandler = null
|
||
|
|
||
|
Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
||
|
/**
|
||
|
* Extends Token Action HUD Core's ActionHandler class and builds system-defined actions for the HUD
|
||
|
*/
|
||
|
ActionHandler = class ActionHandler extends coreModule.api.ActionHandler {
|
||
|
/**
|
||
|
* Build system actions
|
||
|
* Called by Token Action HUD Core
|
||
|
* @override
|
||
|
* @param {array} groupIds
|
||
|
*/
|
||
|
async buildSystemActions(groupIds) {
|
||
|
// Set actor and token variables
|
||
|
this.actors = (!this.actor) ? this._getActors() : [this.actor]
|
||
|
this.actorType = this.actor?.type
|
||
|
|
||
|
// Set items variable
|
||
|
if (this.actor) {
|
||
|
let items = this.actor.items
|
||
|
items = coreModule.api.Utils.sortItemsByName(items)
|
||
|
this.items = items
|
||
|
}
|
||
|
|
||
|
if (this.actorType !== 'vehicle') {
|
||
|
this.#buildCharacterActions()
|
||
|
} else if (!this.actor) {
|
||
|
this.#buildMultipleTokenActions()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Build character actions
|
||
|
* @private
|
||
|
*/
|
||
|
#buildCharacterActions() {
|
||
|
this.buildAttributes()
|
||
|
this.buildOther()
|
||
|
this.buildLuck()
|
||
|
this.buildSkills()
|
||
|
this.buildEquipment()
|
||
|
}
|
||
|
|
||
|
#showValue() {
|
||
|
return game.settings.get('token-action-hud-core', 'tooltips') === 'none'
|
||
|
}
|
||
|
|
||
|
async buildAttributes() {
|
||
|
const actions = []
|
||
|
for (const key in this.actor.system.characteristics) {
|
||
|
const encodedValue = [coreModule.api.Utils.i18n('attributes'), key].join(this.delimiter)
|
||
|
const tooltip = {
|
||
|
content: String(this.actor.system.characteristics[key].value * 5),
|
||
|
class: 'tah-system-tooltip',
|
||
|
direction: 'LEFT'
|
||
|
}
|
||
|
actions.push({
|
||
|
name: coreModule.api.Utils.i18n('CTHULHUETERNAL.Label.' + key),
|
||
|
id: key,
|
||
|
info1: this.#showValue() ? { text: tooltip.content } : null,
|
||
|
tooltip,
|
||
|
encodedValue
|
||
|
})
|
||
|
}
|
||
|
await this.addActions(actions, {
|
||
|
id: 'attributes',
|
||
|
type: 'system'
|
||
|
})
|
||
|
}
|
||
|
|
||
|
async buildLuck() {
|
||
|
const actions = []
|
||
|
const tooltip = {
|
||
|
content: '50',
|
||
|
class: 'tah-system-tooltip',
|
||
|
direction: 'LEFT'
|
||
|
}
|
||
|
actions.push({
|
||
|
name: coreModule.api.Utils.i18n('CTHULHUETERNAL.Label.Luck'),
|
||
|
id: 'luck',
|
||
|
info1: this.#showValue() ? { text: '50' } : null,
|
||
|
tooltip,
|
||
|
encodedValue: ['attributes', 'luck'].join(this.delimiter)
|
||
|
})
|
||
|
await this.addActions(actions, { id: 'luck', type: 'system' })
|
||
|
}
|
||
|
|
||
|
async buildOther() {
|
||
|
if (typeof this.actor.system.sanity.value !== 'undefined') {
|
||
|
const actions = []
|
||
|
const groupData = {
|
||
|
id: 'other_sanity',
|
||
|
name: coreModule.api.Utils.i18n('CTHULHUETERNAL.Label.SAN'),
|
||
|
type: 'system'
|
||
|
}
|
||
|
this.addGroup(groupData, { id: 'other', type: 'system' }, true)
|
||
|
const tooltip = {
|
||
|
content: String(this.actor.system.san.value + '/' + this.actor.system.san.max),
|
||
|
class: 'tah-system-tooltip',
|
||
|
direction: 'LEFT'
|
||
|
}
|
||
|
actions.push({
|
||
|
name: coreModule.api.Utils.i18n('CTHULHUETERNAL.Label.SAN'),
|
||
|
id: 'sanity',
|
||
|
info1: this.#showValue() ? { text: tooltip.content } : null,
|
||
|
tooltip,
|
||
|
encodedValue: ['attributes', 'sanity'].join(this.delimiter)
|
||
|
},
|
||
|
{
|
||
|
name: '+',
|
||
|
id: 'sanity_add',
|
||
|
encodedValue: ['attributes', 'sanity_add'].join(this.delimiter)
|
||
|
},
|
||
|
{
|
||
|
name: '-',
|
||
|
id: 'sanity_subtract',
|
||
|
encodedValue: ['attributes', 'sanity_subtract'].join(this.delimiter)
|
||
|
})
|
||
|
await this.addActions(actions, { id: 'other_sanity', type: 'system' })
|
||
|
}
|
||
|
if (typeof this.actor.system.hp.value !== 'undefined') {
|
||
|
const actions = []
|
||
|
const groupData = {
|
||
|
id: 'other_health',
|
||
|
name: coreModule.api.Utils.i18n('CTHULHUETERNAL.Label.HP'),
|
||
|
type: 'system'
|
||
|
}
|
||
|
this.addGroup(groupData, { id: 'other', type: 'system' }, true)
|
||
|
const tooltip = {
|
||
|
content: String(this.actor.system.hp.value + '/' + this.actor.system.hp.max),
|
||
|
class: 'tah-system-tooltip',
|
||
|
direction: 'LEFT'
|
||
|
}
|
||
|
actions.push({
|
||
|
name: coreModule.api.Utils.i18n('CTHULHUETERNAL.Label.HP'),
|
||
|
id: 'health',
|
||
|
info1: this.#showValue() ? { text: tooltip.content } : null,
|
||
|
tooltip,
|
||
|
encodedValue: ['attributes', 'health'].join(this.delimiter)
|
||
|
},
|
||
|
{
|
||
|
name: '+',
|
||
|
id: 'health_add',
|
||
|
encodedValue: ['attributes', 'health_add'].join(this.delimiter)
|
||
|
},
|
||
|
{
|
||
|
name: '-',
|
||
|
id: 'health_subtract',
|
||
|
encodedValue: ['attributes', 'health_subtract'].join(this.delimiter)
|
||
|
})
|
||
|
await this.addActions(actions, { id: 'other_health', type: 'system' })
|
||
|
}
|
||
|
if (typeof this.actor.system.wp.value !== 'undefined') {
|
||
|
const actions = []
|
||
|
const groupData = {
|
||
|
id: 'other_wp',
|
||
|
name: coreModule.api.Utils.i18n('CTHULHUETERNAL.Label.WP'),
|
||
|
type: 'system'
|
||
|
}
|
||
|
this.addGroup(groupData, { id: 'other', type: 'system' }, true)
|
||
|
const tooltip = {
|
||
|
content: String(this.actor.system.wp.value + '/' + this.actor.system.wp.max),
|
||
|
class: 'tah-system-tooltip',
|
||
|
direction: 'LEFT'
|
||
|
}
|
||
|
actions.push({
|
||
|
name: coreModule.api.Utils.i18n('CTHULHUETERNAL.Label.WP'),
|
||
|
id: 'wp',
|
||
|
info1: this.#showValue() ? { text: tooltip.content } : null,
|
||
|
tooltip,
|
||
|
encodedValue: ['attributes', 'wp'].join(this.delimiter)
|
||
|
},
|
||
|
{
|
||
|
name: '+',
|
||
|
id: 'wp_add',
|
||
|
encodedValue: ['attributes', 'wp_add'].join(this.delimiter)
|
||
|
},
|
||
|
{
|
||
|
name: '-',
|
||
|
id: 'wp_subtract',
|
||
|
encodedValue: ['attributes', 'wp_subtract'].join(this.delimiter)
|
||
|
})
|
||
|
await this.addActions(actions, { id: 'other_wp', type: 'system' })
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async buildSkills() {
|
||
|
const actions = []
|
||
|
let actorSkills = this.actor.items.filter(item => item.type === 'skill')
|
||
|
for (const skill in actorSkills) {
|
||
|
if (skill.system.computeScore() > 0) {
|
||
|
const tooltip = {
|
||
|
content: String(skill.skill.system.computeScore()),
|
||
|
direction: 'LEFT'
|
||
|
}
|
||
|
actions.push({
|
||
|
name: skill.name,
|
||
|
id: skill.id,
|
||
|
info1: this.#showValue() ? { text: tooltip.content } : null,
|
||
|
tooltip,
|
||
|
encodedValue: ['skills', s].join(this.delimiter)
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
await this.addActions(actions, { id: 'skills', type: 'system' })
|
||
|
}
|
||
|
|
||
|
async buildEquipment() {
|
||
|
let weapons = this.actor.items.filter(item => item.type === 'weapon')
|
||
|
let skills = this.actor.items.filter(item => item.type === 'skill')
|
||
|
for (const item of weapons) {
|
||
|
// Push the weapon name as a new group
|
||
|
const groupData = {
|
||
|
id: 'weapons_' + item._id,
|
||
|
name: item.name,
|
||
|
type: 'system'
|
||
|
}
|
||
|
if (!SYSTEM.WEAPON_SKILL_MAPPING[era] || !SYSTEM.WEAPON_SKILL_MAPPING[era][options.rollItem.system.weaponType]) {
|
||
|
continue
|
||
|
}
|
||
|
let skillName = game.i18n.localize(SYSTEM.WEAPON_SKILL_MAPPING[era][options.rollItem.system.weaponType])
|
||
|
let skill = skills.find(skill => skill.name.toLowerCase() === skillName.toLowerCase())
|
||
|
this.addGroup(groupData, { id: 'weapons', type: 'system' }, true)
|
||
|
if (item.type === 'weapon') {
|
||
|
const weapons = []
|
||
|
const tooltip = {
|
||
|
content: String(skill.system.computeScore()),
|
||
|
direction: 'LEFT'
|
||
|
}
|
||
|
weapons.push({
|
||
|
name: skill.name,
|
||
|
id: skill._id,
|
||
|
info1: this.#showValue() ? { text: tooltip.content } : null,
|
||
|
encodedValue: ['weapons', item._id].join(this.delimiter),
|
||
|
tooltip
|
||
|
})
|
||
|
const damageTooltip = {
|
||
|
content: String(item.system.damage),
|
||
|
direction: 'LEFT'
|
||
|
}
|
||
|
if (item.system.damage !== '') {
|
||
|
weapons.push({
|
||
|
name: coreModule.api.Utils.i18n('CTHULHUETERNAL.Label.Damage'),
|
||
|
id: item._id,
|
||
|
info1: this.#showValue() ? { text: damageTooltip.content } : null,
|
||
|
encodedValue: ['damage', item._id].join(this.delimiter),
|
||
|
tooltip: damageTooltip
|
||
|
})
|
||
|
}
|
||
|
if (item.system.isLethal) {
|
||
|
const lethalityTooltip = {
|
||
|
content: String(item.system.lethality),
|
||
|
direction: 'LEFT'
|
||
|
}
|
||
|
weapons.push({
|
||
|
name: coreModule.api.Utils.i18n('CTHULHUETERNAL.Label.Lethality'),
|
||
|
id: item._id,
|
||
|
info1: this.#showValue() ? { text: lethalityTooltip.content } : null,
|
||
|
encodedValue: ['lethality', item._id].join(this.delimiter),
|
||
|
tooltip: lethalityTooltip
|
||
|
})
|
||
|
}
|
||
|
await this.addActions(weapons, {
|
||
|
id: 'weapons_' + item._id,
|
||
|
type: 'system'
|
||
|
})
|
||
|
}/* else if (item.type === 'ritual') {
|
||
|
rituals.push({
|
||
|
name: item.name,
|
||
|
id: item._id,
|
||
|
encodedValue: ['rituals', item.name].join(this.delimiter)
|
||
|
})
|
||
|
} */
|
||
|
|
||
|
/* await this.addActions(rituals, {
|
||
|
id: 'rituals',
|
||
|
type: 'system'
|
||
|
}) */
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Build multiple token actions
|
||
|
* @private
|
||
|
* @returns {object}
|
||
|
*/
|
||
|
#buildMultipleTokenActions() {
|
||
|
}
|
||
|
}
|
||
|
})
|