Compare commits
8 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eab44e1dd1 | ||
|
|
e66a425e22 | ||
|
|
6df95256b0 | ||
|
|
fd29caa7f6 | ||
|
|
e1b155f1f8 | ||
|
|
83b7567332 | ||
|
|
12e16f8ae8 | ||
| e7e4adae75 |
5 changed files with 136 additions and 74 deletions
10
module.json
10
module.json
|
|
@ -8,9 +8,9 @@
|
|||
"url": "https://git.evatt.ingenious.com.au/neillc"
|
||||
}
|
||||
],
|
||||
"url": "This is auto replaced",
|
||||
"url": "https://git.evatt.ingenious.com.au/neillc/token-action-hud-gurps",
|
||||
"flags": {},
|
||||
"version": "0.0.97",
|
||||
"version": "0.0.100",
|
||||
"compatibility": {
|
||||
"minimum": "11",
|
||||
"verified": "11.351"
|
||||
|
|
@ -63,9 +63,9 @@
|
|||
}
|
||||
},
|
||||
"socket": false,
|
||||
"readme": "http://172.23.0.17:8000/module.json",
|
||||
"manifest": "http://172.23.0.17:8000/module.json",
|
||||
"download": "http://172.23.0.17:8000/fvtt-token-action-hud-gurps.zip",
|
||||
"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.100/module.json",
|
||||
"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,
|
||||
"coreTranslation": false,
|
||||
"library": false
|
||||
|
|
|
|||
19
readme.md
19
readme.md
|
|
@ -1,14 +1,11 @@
|
|||
 [](https://forge-vtt.com/bazaar#package=token-action-hud-template)
|
||||
# Token Action HUD for GURPS
|
||||
|
||||
# Token Action HUD Template
|
||||
Token Action HUD is a repositionable HUD of actions for a selected token for the GURPS game system.
|
||||
|
||||
Token Action HUD is a repositionable HUD of actions for a selected token.
|
||||
|
||||

|
||||
This should be considered beta software at the moment. I think it's safe to use, but be careful!
|
||||
|
||||
# Features
|
||||
- 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.
|
||||
- Unlock the HUD to customise layout and groups per user, and actions per actor.
|
||||
- Add your own macros, journal entries and roll table compendiums.
|
||||
|
|
@ -18,18 +15,18 @@ Token Action HUD is a repositionable HUD of actions for a selected token.
|
|||
## Method 1
|
||||
1. On Foundry VTT's **Configuration and Setup** screen, go to **Add-on Modules**
|
||||
2. Click **Install Module**
|
||||
3. Search for **Token Action HUD Pathfinder 2**
|
||||
3. Search for **Token Action HUD for GURPS**
|
||||
4. Click **Install** next to the module listing
|
||||
|
||||
## Method 2
|
||||
1. On Foundry VTT's **Configuration and Setup** screen, go to **Add-on Modules**
|
||||
2. Click **Install Module**
|
||||
3. In the Manifest URL field, paste: `https://github.com/Larkinabout/fvtt-token-action-hud-template/releases/latest/download/module.json`
|
||||
3. In the Manifest URL field, paste: `https://git.evatt.ingenious.com.au/neillc/token-action-hud-gurps/releases/download/latest/module.json`
|
||||
4. Click **Install** next to the pasted Manifest URL
|
||||
|
||||
## Required Modules
|
||||
|
||||
**IMPORTANT** - Token Action HUD Template requires the [Token Action HUD Core](https://foundryvtt.com/packages/token-action-hud-core) module to be installed.
|
||||
**IMPORTANT** - Token Action HUD for GURPS requires the [Token Action HUD Core](https://foundryvtt.com/packages/token-action-hud-core) module to be installed.
|
||||
|
||||
## Recommended Modules
|
||||
Token Action HUD uses the [Color Picker](https://foundryvtt.com/packages/color-picker) library module for its color picker settings.
|
||||
|
|
@ -38,7 +35,7 @@ Token Action HUD uses the [Color Picker](https://foundryvtt.com/packages/color-p
|
|||
|
||||
For a guide on using Token Action HUD, go to: [How to Use Token Action HUD](https://github.com/Larkinabout/fvtt-token-action-hud-core/wiki/How-to-Use-Token-Action-HUD)
|
||||
|
||||
For questions, feature requests or bug reports, please open an issue [here](https://github.com/Larkinabout/fvtt-token-action-hud-core/issues).
|
||||
For questions, feature requests or bug reports, please open an issue [here](https://git.evatt.ingenious.com.au/neillc/token-action-hud-gurps/issues).
|
||||
|
||||
Pull requests are welcome. Please include a reason for the request or create an issue before starting one.
|
||||
|
||||
|
|
@ -48,4 +45,4 @@ Thank you to the Community Helpers on Foundry's Discord who provide tireless sup
|
|||
|
||||
# License
|
||||
|
||||
This Foundry VTT module is licensed under a [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/) and this work is licensed under [Foundry Virtual Tabletop EULA - Limited License Agreement for module development](https://foundryvtt.com/article/license/).
|
||||
This Foundry VTT module is licensed under a [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/) and this work is licensed under [Foundry Virtual Tabletop EULA - Limited License Agreement for module development](https://foundryvtt.com/article/license/).
|
||||
|
|
|
|||
|
|
@ -32,7 +32,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
|||
}
|
||||
|
||||
if (this.actorType === 'character') {
|
||||
//debugger;
|
||||
this.#buildCharacterActions()
|
||||
} else if (!this.actor) {
|
||||
this.#buildMultipleTokenActions()
|
||||
|
|
@ -44,7 +43,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
|||
* @private
|
||||
*/
|
||||
#buildCharacterActions () {
|
||||
// debugger;
|
||||
this._get_attributes({id: "attributes", type:"system"})
|
||||
this._get_skills({id: "skills", type:"system"})
|
||||
this._get_spells({id: "spells", type:"system"})
|
||||
|
|
@ -81,7 +79,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
|||
}
|
||||
|
||||
_get_melee_attacks(parent) {
|
||||
// debugger;
|
||||
const macroType = "melee";
|
||||
let actions = [];
|
||||
|
||||
|
|
@ -112,7 +109,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
|||
}
|
||||
|
||||
_get_ranged_attacks(parent) {
|
||||
// debugger;
|
||||
const macroType = "ranged";
|
||||
let actions = [];
|
||||
|
||||
|
|
@ -143,57 +139,146 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
|||
}
|
||||
|
||||
_get_skills(parent) {
|
||||
// debugger;
|
||||
const macroType = "skills";
|
||||
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)
|
||||
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 ":"
|
||||
|
||||
|
||||
// let map = this._get_contents(skills)
|
||||
let map = this._get_contents(skills, macroType)
|
||||
let names = Array.from(map.keys()).sort()
|
||||
names.forEach((a)=> {
|
||||
actions.push({
|
||||
id: actionId,
|
||||
name: coreModule.api.Utils.i18n(key),
|
||||
description: coreModule.api.Utils.i18n('GURPS.Skills'),
|
||||
encodedValue: [macroType, otf].join(this.delimiter),
|
||||
id: a,
|
||||
name: map.get(a).name,
|
||||
description: map.get(a).description,
|
||||
encodedValue: map.get(a).encodedValue
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
});
|
||||
this.addActions(actions, parent)
|
||||
|
||||
}
|
||||
|
||||
_get_contents(spells, macroType, result= new Map()) {
|
||||
console.debug(spells);
|
||||
console.debug(macroType);
|
||||
console.debug(result)
|
||||
|
||||
if (spells instanceof Array) {
|
||||
for (const spell in spells) {
|
||||
let _contains = spells[spell][1].contains;
|
||||
|
||||
if (Reflect.has(_contains,"00000")) {
|
||||
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'
|
||||
}
|
||||
|
||||
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),
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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) {
|
||||
// debugger;
|
||||
const macroType = "spells";
|
||||
let actions = [];
|
||||
|
||||
let spells = Object.entries(this.actor.system.spells)
|
||||
spells.forEach((a) => {
|
||||
const key = a[1].name;
|
||||
const value = a[1].level
|
||||
// img
|
||||
|
||||
let actionId = key;
|
||||
let otf = 'Sp:"' + key + '"'; // This is going to end badly if the delimiter is set to ":"
|
||||
|
||||
|
||||
let spell_map = this._get_contents(spells, macroType)
|
||||
let spell_names = Array.from(spell_map.keys()).sort()
|
||||
spell_names.forEach((a)=> {
|
||||
actions.push({
|
||||
id: actionId,
|
||||
name: coreModule.api.Utils.i18n(key),
|
||||
description: coreModule.api.Utils.i18n('GURPS.Spells'),
|
||||
encodedValue: [macroType, otf].join(this.delimiter),
|
||||
id: a,
|
||||
name: spell_map.get(a).name,
|
||||
description: spell_map.get(a).description,
|
||||
encodedValue: spell_map.get(a).encodedValue
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
});
|
||||
this.addActions(actions, parent)
|
||||
|
||||
}
|
||||
|
|
@ -256,3 +341,4 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
|||
}
|
||||
}
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
|||
group.listName = `Group: ${coreModule.api.Utils.i18n(group.listName ?? group.name)}`
|
||||
})
|
||||
const groupsArray = Object.values(groups)
|
||||
// debugger;
|
||||
DEFAULTS = {
|
||||
layout: [
|
||||
{
|
||||
|
|
|
|||
|
|
@ -130,7 +130,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
|||
|
||||
if ( actionId == "WILL" ) actionId = "Will";
|
||||
if ( actionId == "PER" ) actionId = "Per";
|
||||
// debugger;
|
||||
let formula = '3d6';
|
||||
let targetmods = null;
|
||||
let prefix = "Rolls vs" // should be i18n of 'GURPS.rollVs'
|
||||
|
|
@ -148,8 +147,6 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
|||
async #handleMeleeAction(actor, actionId) {
|
||||
/* Melee attacks are done using the otf method. Grab the otf and pass it to the function. */
|
||||
let GURPS = globalThis.GURPS;
|
||||
|
||||
// debugger;
|
||||
let otf = actionId;
|
||||
GURPS.executeOTF(otf, actor=actor);
|
||||
}
|
||||
|
|
@ -157,39 +154,22 @@ Hooks.once('tokenActionHudCoreApiReady', async (coreModule) => {
|
|||
async #handleRangedAction(actor, actionId) {
|
||||
/* Melee attacks are done using the otf method. Grab the otf and pass it to the function. */
|
||||
let GURPS = globalThis.GURPS;
|
||||
|
||||
// debugger;
|
||||
let otf = actionId;
|
||||
GURPS.executeOTF(otf, actor=actor);
|
||||
|
||||
|
||||
// doRoll({ actor, formula, targetmods, prefix, thing, chatthing, origtarget: target, optionalArgs: opt })
|
||||
}
|
||||
|
||||
async #handleSkillAction(actor, actionId) {
|
||||
/* Skills are done using the otf method. Grab the otf and pass it to the function. */
|
||||
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;
|
||||
GURPS.executeOTF(otf, actor=actor);
|
||||
|
||||
|
||||
// doRoll({ actor, formula, targetmods, prefix, thing, chatthing, origtarget: target, optionalArgs: opt })
|
||||
}
|
||||
|
||||
async #handleSpellAction(actor, actionId) {
|
||||
/* Spells are done using the otf method. Grab the otf and pass it to the function. */
|
||||
let GURPS = globalThis.GURPS;
|
||||
|
||||
// debugger;
|
||||
let otf = actionId;
|
||||
GURPS.executeOTF(otf, actor=actor);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue