Implements #77
This commit is contained in:
@@ -23,7 +23,6 @@ export class PegasusUtility {
|
||||
Hooks.on('renderChatLog', (log, html, data) => PegasusUtility.chatListeners(html))
|
||||
Hooks.on('targetToken', (user, token, flag) => PegasusUtility.targetToken(user, token, flag))
|
||||
Hooks.on('renderSidebarTab', (app, html, data) => PegasusUtility.addDiceRollButton(app, html, data))
|
||||
|
||||
Hooks.on("getCombatTrackerEntryContext", (html, options) => {
|
||||
PegasusUtility.pushInitiativeOptions(html, options);
|
||||
});
|
||||
@@ -35,9 +34,10 @@ export class PegasusUtility {
|
||||
this.defenderStore = {}
|
||||
this.diceList = [];
|
||||
this.diceFoundryList = [];
|
||||
this.optionsDiceList = "";
|
||||
this.buildDiceLists();
|
||||
PegasusCommands.init();
|
||||
this.optionsDiceList = ""
|
||||
this.lastRoleEffectProcess = Date.now()
|
||||
this.buildDiceLists()
|
||||
PegasusCommands.init()
|
||||
|
||||
Handlebars.registerHelper('count', function (list) {
|
||||
return (list) ? list.length : 0;
|
||||
@@ -269,6 +269,10 @@ export class PegasusUtility {
|
||||
static async ready() {
|
||||
const specs = await PegasusUtility.loadCompendium("fvtt-pegasus-rpg.specialisations");
|
||||
this.specs = specs.map(i => i.toObject());
|
||||
|
||||
if (game.user.isGM) {
|
||||
Hooks.on('sightRefresh', (app, html, data) => PegasusUtility.refreshSightForEffect(app, html, data))
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@@ -1062,4 +1066,206 @@ export class PegasusUtility {
|
||||
d.render(true);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static glowToken(token) {
|
||||
let params =
|
||||
[{
|
||||
filterType: "glow",
|
||||
filterId: "superSpookyGlow",
|
||||
outerStrength: 15,
|
||||
innerStrength: 0,
|
||||
color: 0x6AAB8E,
|
||||
quality: 0.5,
|
||||
padding: 40,
|
||||
autoDestroy: true,
|
||||
animated:
|
||||
{
|
||||
color:
|
||||
{
|
||||
active: true,
|
||||
loopDuration: 3000,
|
||||
loops: 2,
|
||||
animType: "colorOscillation",
|
||||
val1: 0x6AAB8E,
|
||||
val2: 0x66FF33
|
||||
}
|
||||
}
|
||||
}]
|
||||
TokenMagic.addUpdateFilters(token, params)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async getRelevantTokens() {
|
||||
if (!_token) { return }
|
||||
let tokens = canvas.tokens.placeables.filter(token => token.document.disposition == 1)
|
||||
for (let token of tokens) {
|
||||
console.log("Parsing tokens", token.name)
|
||||
let dist = canvas.grid.measureDistances(
|
||||
[{ ray: new Ray(_token.center, token.center) }], { gridSpaces: false })
|
||||
if (dist && dist[0] && dist[0] > 0) {
|
||||
console.log(" Friendly Tokens at : ", token.name, dist / canvas.grid.grid.options.dimensions.distance)
|
||||
}
|
||||
let visible = canvas.effects.visibility.testVisibility(token.center, { object: _token })
|
||||
if (visible && dist[0] > 0) {
|
||||
this.glowToken(token)
|
||||
}
|
||||
console.log(" Visible!", visible)
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async processTactician(friends) {
|
||||
// Tactician management
|
||||
let toApply = {}
|
||||
let tacticianTokens = canvas.tokens.placeables.filter(token => token.actor.isTactician())
|
||||
for (let token of tacticianTokens) {
|
||||
token.refresh()
|
||||
for (let friend of friends) {
|
||||
if (friend.actor.id != token.actor.id) {
|
||||
let existing = toApply[friend.actor.id] || { actor: friend.actor, add: false, level: 0, names: [] }
|
||||
let visible = canvas.effects.visibility.testVisibility(friend.center, { object: token })
|
||||
console.log("parse visible TACTICIAN : ", visible, token.name, friend.name)
|
||||
if (visible) {
|
||||
existing.add = true
|
||||
existing.level += token.actor.getRoleLevel()
|
||||
existing.names.push(token.actor.name)
|
||||
}
|
||||
toApply[friend.actor.id] = existing
|
||||
}
|
||||
}
|
||||
}
|
||||
for (let id in toApply) {
|
||||
let applyDef = toApply[id]
|
||||
let hasBonus = applyDef.actor.hasTacticianBonus()
|
||||
if (applyDef.add) {
|
||||
if (!hasBonus) {
|
||||
applyDef.actor.addTacticianEffect(applyDef.names.toString(), applyDef.level)
|
||||
} else if (applyDef.level != hasBonus.system.effectlevel) {
|
||||
await applyDef.actor.removeTacticianEffect()
|
||||
applyDef.actor.addTacticianEffect(applyDef.names.toString(), applyDef.level)
|
||||
}
|
||||
} else if (hasBonus) {
|
||||
applyDef.actor.removeTacticianEffect()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async processEnhancer(friends) {
|
||||
// Enhancer management
|
||||
let toApply = {}
|
||||
let enhancerTokens = canvas.tokens.placeables.filter(token => token.actor.isEnhancer())
|
||||
for (let token of enhancerTokens) {
|
||||
token.refresh()
|
||||
for (let friend of friends) {
|
||||
if (friend.actor.id != token.actor.id) {
|
||||
let existing = toApply[friend.actor.id] || { actor: friend.actor, add: false, level: 0, names: [] }
|
||||
let visible = canvas.effects.visibility.testVisibility(friend.center, { object: token })
|
||||
console.log("parse visible ENHANCER: ", visible, token.name, friend.name)
|
||||
if (visible) {
|
||||
let dist = canvas.grid.measureDistances([{ ray: new Ray(token.center, friend.center) }], { gridSpaces: false })
|
||||
if (dist && dist[0] && (dist[0] / canvas.grid.grid.options.dimensions.distance) <= 5) {
|
||||
existing.add = true
|
||||
existing.level += token.actor.getRoleLevel()
|
||||
existing.names.push(token.actor.name)
|
||||
}
|
||||
}
|
||||
toApply[friend.actor.id] = existing
|
||||
}
|
||||
}
|
||||
}
|
||||
for (let id in toApply) {
|
||||
let applyDef = toApply[id]
|
||||
let hasBonus = applyDef.actor.hasEnhancerBonus()
|
||||
if (applyDef.add) {
|
||||
if (!hasBonus) {
|
||||
applyDef.actor.addEnhancerEffect(applyDef.names.toString(), applyDef.level)
|
||||
} else if (applyDef.level != hasBonus.system.effectlevel) {
|
||||
await applyDef.actor.removeEnhancerEffect()
|
||||
applyDef.actor.addEnhancerEffect(applyDef.names.toString(), applyDef.level)
|
||||
}
|
||||
} else if (hasBonus) {
|
||||
applyDef.actor.removeEnhancerEffect()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async processAgitator(ennemies) {
|
||||
// Agitator management
|
||||
let toApply = {}
|
||||
let agitatorTokens = canvas.tokens.placeables.filter(token => token.actor.isAgitator())
|
||||
for (let token of agitatorTokens) {
|
||||
token.refresh()
|
||||
for (let ennemy of ennemies) {
|
||||
if (ennemy.actor.id != token.actor.id) {
|
||||
let existing = toApply[ennemy.actor.id] || { actor: ennemy.actor, add: false, level: 0, names: [] }
|
||||
let visible = canvas.effects.visibility.testVisibility(ennemy.center, { object: token })
|
||||
if (visible) {
|
||||
let dist = canvas.grid.measureDistances([{ ray: new Ray(token.center, ennemy.center) }], { gridSpaces: false })
|
||||
if (dist && dist[0] && (dist[0] / canvas.grid.grid.options.dimensions.distance) <= 5) {
|
||||
existing.add = true
|
||||
existing.level += token.actor.getRoleLevel()
|
||||
existing.names.push(token.actor.name)
|
||||
}
|
||||
}
|
||||
toApply[ennemy.actor.id] = existing
|
||||
}
|
||||
}
|
||||
}
|
||||
for (let id in toApply) {
|
||||
let applyDef = toApply[id]
|
||||
let hasHindrance = applyDef.actor.hasAgitatorHindrance()
|
||||
if (applyDef.add) {
|
||||
if (!hasHindrance) {
|
||||
applyDef.actor.addAgitatorHindrance(applyDef.names.toString(), applyDef.level)
|
||||
} else if (applyDef.level != hasHindrance.system.effectlevel) {
|
||||
await applyDef.actor.removeAgitatorHindrance()
|
||||
applyDef.actor.addAgitatorHindrance(applyDef.names.toString(), applyDef.level)
|
||||
}
|
||||
} else if (hasHindrance) {
|
||||
applyDef.actor.removeAgitatorHindrance()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async processRoleEffects() {
|
||||
|
||||
// Small optimization
|
||||
let now = Date.now()
|
||||
if ( now - this.lastRoleEffectProcess < 300 ) {
|
||||
return // Save some processing
|
||||
}
|
||||
this.lastRoleEffectProcess = now
|
||||
console.log("=========================+> Searching/Processing roles effects")
|
||||
|
||||
let friends = canvas.tokens.placeables.filter(token => token.actor.type == "character" && token.document.disposition == 1)
|
||||
let ennemies = canvas.tokens.placeables.filter(token => token.actor.type == "character" && token.document.disposition == -1)
|
||||
|
||||
await this.processTactician(friends)
|
||||
await this.processEnhancer(friends)
|
||||
await this.processAgitator(ennemies)
|
||||
|
||||
// Cleanup if disposition has changed
|
||||
let allTokens = canvas.tokens.placeables.filter(token => token.actor.type == "character")
|
||||
for (let token of allTokens) {
|
||||
if (token.document.disposition != -1 && token.actor.hasAgitatorHindrance()) {
|
||||
token.actor.removeAgitatorHindrance()
|
||||
}
|
||||
if (token.document.disposition != 1 && token.actor.hasTacticianBonus()) {
|
||||
token.actor.removeTacticianEffect()
|
||||
}
|
||||
if (token.document.disposition != 1 && token.actor.hasEnhancerBonus()) {
|
||||
token.actor.removeEnhancerEffect()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async refreshSightForEffect() {
|
||||
setTimeout(500, this.processRoleEffects())
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user