Compare commits

...

6 commits
0.0.99 ... main

Author SHA1 Message Date
Neill Cox
eab44e1dd1 Merge branch 'main' of 172.23.0.11:neillc/token-action-hud-gurps 2024-05-18 19:57:53 +10:00
Neill Cox
e66a425e22 Handle skills/spells in containers 2024-05-18 19:31:09 +10:00
Neill Cox
fd29caa7f6 Update readme 2024-05-07 19:56:36 +10:00
Neill Cox
e1b155f1f8 Update readme 2024-05-07 19:52:27 +10:00
Neill Cox
83b7567332 Packaging release 2024-05-07 19:37:56 +10:00
Neill Cox
12e16f8ae8 0.0.98 release 2024-05-07 19:16:43 +10:00
5 changed files with 127 additions and 63 deletions

View file

@ -10,7 +10,7 @@
], ],
"url": "https://git.evatt.ingenious.com.au/neillc/token-action-hud-gurps", "url": "https://git.evatt.ingenious.com.au/neillc/token-action-hud-gurps",
"flags": {}, "flags": {},
"version": "0.0.99", "version": "0.0.100",
"compatibility": { "compatibility": {
"minimum": "11", "minimum": "11",
"verified": "11.351" "verified": "11.351"
@ -63,9 +63,9 @@
} }
}, },
"socket": false, "socket": false,
"readme": "https://git.evatt.ingenious.com.au/neillc/token-action-hud-gurps/releases/download/0.0.99/readme.md", "readme": "https://git.evatt.ingenious.com.au/neillc/token-action-hud-gurps/releases/download/0.0.100/readme.md",
"manifest": "https://git.evatt.ingenious.com.au/neillc/token-action-hud-gurps/releases/download/0.0.99/module.json", "manifest": "https://git.evatt.ingenious.com.au/neillc/token-action-hud-gurps/releases/download/0.0.100/module.json",
"download": "https://git.evatt.ingenious.com.au/neillc/token-action-hud-gurps/releases/download/0.0.99/fvtt-token-action-hud-gurps.zip", "download": "https://git.evatt.ingenious.com.au/neillc/token-action-hud-gurps/releases/download/0.0.100/fvtt-token-action-hud-gurps.zip",
"protected": false, "protected": false,
"coreTranslation": false, "coreTranslation": false,
"library": false "library": false

View file

@ -6,7 +6,6 @@ This should be considered beta software at the moment. I think it's safe to use,
# Features # Features
- Make rolls directly from the HUD instead of opening your character sheet. - Make rolls directly from the HUD instead of opening your character sheet.
- Use items from the HUD or right-click an item to open its sheet.
- Move the HUD and choose to expand the menus up or down. - Move the HUD and choose to expand the menus up or down.
- Unlock the HUD to customise layout and groups per user, and actions per actor. - Unlock the HUD to customise layout and groups per user, and actions per actor.
- Add your own macros, journal entries and roll table compendiums. - Add your own macros, journal entries and roll table compendiums.

View file

@ -32,7 +32,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
} }
if (this.actorType === 'character') { if (this.actorType === 'character') {
//debugger;
this.#buildCharacterActions() this.#buildCharacterActions()
} else if (!this.actor) { } else if (!this.actor) {
this.#buildMultipleTokenActions() this.#buildMultipleTokenActions()
@ -44,7 +43,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
* @private * @private
*/ */
#buildCharacterActions () { #buildCharacterActions () {
// debugger;
this._get_attributes({id: "attributes", type:"system"}) this._get_attributes({id: "attributes", type:"system"})
this._get_skills({id: "skills", type:"system"}) this._get_skills({id: "skills", type:"system"})
this._get_spells({id: "spells", type:"system"}) this._get_spells({id: "spells", type:"system"})
@ -81,7 +79,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
} }
_get_melee_attacks(parent) { _get_melee_attacks(parent) {
// debugger;
const macroType = "melee"; const macroType = "melee";
let actions = []; let actions = [];
@ -112,7 +109,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
} }
_get_ranged_attacks(parent) { _get_ranged_attacks(parent) {
// debugger;
const macroType = "ranged"; const macroType = "ranged";
let actions = []; let actions = [];
@ -143,57 +139,146 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
} }
_get_skills(parent) { _get_skills(parent) {
// debugger;
const macroType = "skills"; const macroType = "skills";
let actions = []; let actions = [];
// let skills = Object.entries(this.actor.system.skills)
// skills.forEach((a) => {
// const key = a[1].name;
// const value = a[1].level
// // img
// let actionId = key;
// let otf = 'Sk:"' + key + '"'; // This is going to end badly if the delimiter is set to ":"
// actions.push({
// id: actionId,
// name: coreModule.api.Utils.i18n(key) + " - test",
// description: coreModule.api.Utils.i18n('GURPS.Skills'),
// encodedValue: [macroType, otf].join(this.delimiter),
// })
// });
let skills = Object.entries(this.actor.system.skills) let skills = Object.entries(this.actor.system.skills)
skills.forEach((a) => { // let map = this._get_contents(skills)
const key = a[1].name; let map = this._get_contents(skills, macroType)
const value = a[1].level let names = Array.from(map.keys()).sort()
// img names.forEach((a)=> {
let actionId = key;
let otf = 'Sk:"' + key + '"'; // This is going to end badly if the delimiter is set to ":"
actions.push({ actions.push({
id: actionId, id: a,
name: coreModule.api.Utils.i18n(key), name: map.get(a).name,
description: coreModule.api.Utils.i18n('GURPS.Skills'), description: map.get(a).description,
encodedValue: [macroType, otf].join(this.delimiter), encodedValue: map.get(a).encodedValue
})
}) })
});
this.addActions(actions, parent) this.addActions(actions, parent)
} }
_get_spells(parent) { _get_contents(spells, macroType, result= new Map()) {
// debugger; console.debug(spells);
const macroType = "spells"; console.debug(macroType);
let actions = []; console.debug(result)
let spells = Object.entries(this.actor.system.spells) if (spells instanceof Array) {
spells.forEach((a) => { for (const spell in spells) {
const key = a[1].name; let _contains = spells[spell][1].contains;
const value = a[1].level
// img
let actionId = key; if (Reflect.has(_contains,"00000")) {
let otf = 'Sp:"' + key + '"'; // This is going to end badly if the delimiter is set to ":" for( const i in _contains) {
result = this._get_contents(_contains[i], macroType, result)
}
}
else {
let name = spells[spell][1].name;
let level = spells[spell][1].level;
let otf_type = null;
if (macroType === "skills") {
otf_type = 'Sk'
}
else {
otf_type = 'Sp'
}
actions.push({ let otf = otf_type + ':"' + name + '"';
id: actionId,
name: coreModule.api.Utils.i18n(key), if (level) {
result.set(
name,
{
id: name,
name: coreModule.api.Utils.i18n(name),
description: coreModule.api.Utils.i18n('GURPS.Spells'), description: coreModule.api.Utils.i18n('GURPS.Spells'),
encodedValue: [macroType, otf].join(this.delimiter), encodedValue: [macroType, otf].join(this.delimiter),
}
)
}
}
}
}
else {
if (spells.uuid) {
let _contains = spells.contains;
if (Reflect.has(_contains,"00000")) {
for( const i in _contains) {
result = this._get_contents(_contains[i], macroType, result)
}
}
else {
let spell = spells;
let name = spell.name;
let level = spell.level;
let otf_type = null;
if (macroType === "skills") {
otf_type = 'Sk'
}
else {
otf_type = 'Sp'
}
let otf = otf_type + ':"' + name + '"';
if (level) {
result.set(
name,
{
id: name,
name: coreModule.api.Utils.i18n(name),
description: coreModule.api.Utils.i18n('GURPS.Spells'),
encodedValue: [macroType, otf].join(this.delimiter),
}
)
}
}
}
}
return result;
}
_get_spells(parent) {
const macroType = "spells";
let actions = [];
let spells = Object.entries(this.actor.system.spells)
let spell_map = this._get_contents(spells, macroType)
let spell_names = Array.from(spell_map.keys()).sort()
spell_names.forEach((a)=> {
actions.push({
id: a,
name: spell_map.get(a).name,
description: spell_map.get(a).description,
encodedValue: spell_map.get(a).encodedValue
})
}) })
});
this.addActions(actions, parent) this.addActions(actions, parent)
} }
@ -256,3 +341,4 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
} }
} }
}) })

View file

@ -12,7 +12,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
group.listName = `Group: ${coreModule.api.Utils.i18n(group.listName ?? group.name)}` group.listName = `Group: ${coreModule.api.Utils.i18n(group.listName ?? group.name)}`
}) })
const groupsArray = Object.values(groups) const groupsArray = Object.values(groups)
// debugger;
DEFAULTS = { DEFAULTS = {
layout: [ layout: [
{ {

View file

@ -130,7 +130,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
if ( actionId == "WILL" ) actionId = "Will"; if ( actionId == "WILL" ) actionId = "Will";
if ( actionId == "PER" ) actionId = "Per"; if ( actionId == "PER" ) actionId = "Per";
// debugger;
let formula = '3d6'; let formula = '3d6';
let targetmods = null; let targetmods = null;
let prefix = "Rolls vs" // should be i18n of 'GURPS.rollVs' let prefix = "Rolls vs" // should be i18n of 'GURPS.rollVs'
@ -148,8 +147,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
async #handleMeleeAction(actor, actionId) { async #handleMeleeAction(actor, actionId) {
/* Melee attacks are done using the otf method. Grab the otf and pass it to the function. */ /* Melee attacks are done using the otf method. Grab the otf and pass it to the function. */
let GURPS = globalThis.GURPS; let GURPS = globalThis.GURPS;
// debugger;
let otf = actionId; let otf = actionId;
GURPS.executeOTF(otf, actor=actor); GURPS.executeOTF(otf, actor=actor);
} }
@ -157,39 +154,22 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
async #handleRangedAction(actor, actionId) { async #handleRangedAction(actor, actionId) {
/* Melee attacks are done using the otf method. Grab the otf and pass it to the function. */ /* Melee attacks are done using the otf method. Grab the otf and pass it to the function. */
let GURPS = globalThis.GURPS; let GURPS = globalThis.GURPS;
// debugger;
let otf = actionId; let otf = actionId;
GURPS.executeOTF(otf, actor=actor); GURPS.executeOTF(otf, actor=actor);
// doRoll({ actor, formula, targetmods, prefix, thing, chatthing, origtarget: target, optionalArgs: opt })
} }
async #handleSkillAction(actor, actionId) { async #handleSkillAction(actor, actionId) {
/* Skills are done using the otf method. Grab the otf and pass it to the function. */ /* Skills are done using the otf method. Grab the otf and pass it to the function. */
let GURPS = globalThis.GURPS; let GURPS = globalThis.GURPS;
// actor, formula, targetmods, prefix = '', thing = '', chatthing = '', origtarget = -1, optionalArgs = {},
// executeOTF(inputstring, priv = false, event = null, actor = null) {
// debugger;
let otf = actionId; let otf = actionId;
GURPS.executeOTF(otf, actor=actor); GURPS.executeOTF(otf, actor=actor);
// doRoll({ actor, formula, targetmods, prefix, thing, chatthing, origtarget: target, optionalArgs: opt })
} }
async #handleSpellAction(actor, actionId) { async #handleSpellAction(actor, actionId) {
/* Spells are done using the otf method. Grab the otf and pass it to the function. */ /* Spells are done using the otf method. Grab the otf and pass it to the function. */
let GURPS = globalThis.GURPS; let GURPS = globalThis.GURPS;
// debugger;
let otf = actionId; let otf = actionId;
GURPS.executeOTF(otf, actor=actor); GURPS.executeOTF(otf, actor=actor);
} }
} }
}) })