224 lines
9.5 KiB
JavaScript
224 lines
9.5 KiB
JavaScript
import * as MODULE from "../MaterialDeck.js";
|
|
import {streamDeck, tokenControl} from "../MaterialDeck.js";
|
|
|
|
export class CombatTracker{
|
|
constructor(){
|
|
this.active = false;
|
|
this.combatantLength = 0;
|
|
}
|
|
|
|
async updateAll(){
|
|
if (this.active == false) return;
|
|
for (let i=0; i<32; i++){
|
|
const data = streamDeck.buttonContext[i];
|
|
if (data == undefined || data.action != 'combattracker') continue;
|
|
await this.update(data.settings,data.context);
|
|
}
|
|
}
|
|
|
|
update(settings,context){
|
|
this.active = true;
|
|
const ctFunction = settings.combatTrackerFunction ? settings.combatTrackerFunction : 'startStop';
|
|
const mode = settings.combatTrackerMode ? settings.combatTrackerMode : 'combatants';
|
|
const combat = game.combat;
|
|
let src = "modules/MaterialDeck/img/black.png";
|
|
let txt = "";
|
|
let background = "#000000";
|
|
settings.combat = true;
|
|
|
|
if (mode == 'combatants'){
|
|
if (MODULE.getPermission('COMBAT','DISPLAY_COMBATANTS') == false) {
|
|
streamDeck.noPermission(context);
|
|
return;
|
|
}
|
|
if (combat != null && combat != undefined && combat.turns.length != 0){
|
|
const initiativeOrder = combat.turns;
|
|
let nr = settings.combatantNr - 1;
|
|
if (nr == undefined || nr < 1) nr = 0;
|
|
const combatantState = (nr == combat.turn) ? 2 : 1;
|
|
const combatant = initiativeOrder[nr]
|
|
|
|
if (combatant != undefined){
|
|
const tokenId = combatant.tokenId;
|
|
tokenControl.pushData(tokenId,settings,context,combatantState,'#cccc00');
|
|
return;
|
|
}
|
|
else {
|
|
streamDeck.setIcon(context,src,background);
|
|
streamDeck.setTitle(txt,context);
|
|
}
|
|
}
|
|
else {
|
|
streamDeck.setIcon(context,src,background);
|
|
streamDeck.setTitle(txt,context);
|
|
}
|
|
}
|
|
else if (mode == 'currentCombatant'){
|
|
if (MODULE.getPermission('COMBAT','DISPLAY_COMBATANTS') == false) {
|
|
streamDeck.noPermission(context);
|
|
return;
|
|
}
|
|
if (combat != null && combat != undefined && combat.started){
|
|
const tokenId = combat.combatant.tokenId;
|
|
tokenControl.pushData(tokenId,settings,context);
|
|
}
|
|
else {
|
|
streamDeck.setIcon(context,src,background);
|
|
streamDeck.setTitle(txt,context);
|
|
}
|
|
}
|
|
else if (mode == 'function'){
|
|
|
|
if (ctFunction == 'turnDisplay' && MODULE.getPermission('COMBAT','TURN_DISPLAY') == false) {
|
|
streamDeck.noPermission(context);
|
|
return;
|
|
}
|
|
else if (ctFunction == 'endTurn' && MODULE.getPermission('COMBAT','END_TURN') == false) {
|
|
streamDeck.noPermission(context);
|
|
return;
|
|
}
|
|
else if (ctFunction != 'turnDisplay' && ctFunction != 'endTurn' && MODULE.getPermission('COMBAT','OTHER_FUNCTIONS') == false) {
|
|
streamDeck.noPermission(context);
|
|
return;
|
|
}
|
|
|
|
if (ctFunction == 'startStop') {
|
|
if (combat == null || combat == undefined || combat.combatants.length == 0) {
|
|
src = "modules/MaterialDeck/img/combattracker/startcombat.png";
|
|
background = "#000000";
|
|
}
|
|
else {
|
|
if (combat.started == false) {
|
|
src = "modules/MaterialDeck/img/combattracker/startcombat.png";
|
|
background = "#008000";
|
|
}
|
|
else {
|
|
src = "modules/MaterialDeck/img/combattracker/stopcombat.png";
|
|
background = "#FF0000";
|
|
}
|
|
}
|
|
}
|
|
else if (ctFunction == 'endTurn') {
|
|
src = "modules/MaterialDeck/img/combattracker/nextturn.png";
|
|
}
|
|
else if (ctFunction == 'nextTurn') {
|
|
src = "modules/MaterialDeck/img/combattracker/nextturn.png";
|
|
}
|
|
else if (ctFunction == 'prevTurn') {
|
|
src = "modules/MaterialDeck/img/combattracker/previousturn.png";
|
|
}
|
|
else if (ctFunction == 'nextRound') {
|
|
src = "modules/MaterialDeck/img/combattracker/nextround.png";
|
|
}
|
|
else if (ctFunction == 'prevRound') {
|
|
src = "modules/MaterialDeck/img/combattracker/previousround.png";
|
|
}
|
|
else if (ctFunction == 'turnDisplay'){
|
|
src = "modules/MaterialDeck/img/black.png";
|
|
let round = 0;
|
|
let turn = 0;
|
|
if (combat != null && combat != undefined && combat.started != false){
|
|
round = combat.round;
|
|
turn = combat.turn+1;
|
|
}
|
|
if (settings.displayRound) txt += "Round\n"+round;
|
|
if (txt != "") txt += "\n";
|
|
if (settings.displayTurn) txt += "Turn\n"+turn;
|
|
}
|
|
streamDeck.setIcon(context,src,background);
|
|
streamDeck.setTitle(txt,context);
|
|
}
|
|
}
|
|
|
|
keyPress(settings,context){
|
|
const mode = settings.combatTrackerMode ? settings.combatTrackerMode : 'combatants';
|
|
const combat = game.combat;
|
|
|
|
if (mode == 'function'){
|
|
if (combat == null || combat == undefined) return;
|
|
const ctFunction = settings.combatTrackerFunction ? settings.combatTrackerFunction : 'startStop';
|
|
|
|
if (ctFunction == 'turnDisplay' && MODULE.getPermission('COMBAT','TURN_DISPLAY') == false) {
|
|
streamDeck.noPermission(context);
|
|
return;
|
|
}
|
|
else if (ctFunction == 'endTurn' && MODULE.getPermission('COMBAT','END_TURN') == false) {
|
|
streamDeck.noPermission(context);
|
|
return;
|
|
}
|
|
else if (ctFunction != 'turnDisplay' && ctFunction != 'endTurn' && MODULE.getPermission('COMBAT','OTHER_FUNCTIONS') == false) {
|
|
streamDeck.noPermission(context);
|
|
return;
|
|
}
|
|
|
|
if (ctFunction == 'startStop'){
|
|
let src;
|
|
let background;
|
|
if (game.combat.started){
|
|
game.combat.endCombat();
|
|
src = "modules/MaterialDeck/img/combattracker/startcombat.png";
|
|
background = "#000000";
|
|
}
|
|
else {
|
|
game.combat.startCombat();
|
|
src = "modules/MaterialDeck/img/combattracker/stopcombat.png";
|
|
background = "#FF0000";
|
|
}
|
|
streamDeck.setIcon(context,src,background);
|
|
return;
|
|
}
|
|
if (game.combat.started == false) return;
|
|
|
|
if (ctFunction == 'nextTurn') game.combat.nextTurn();
|
|
else if (ctFunction == 'prevTurn') game.combat.previousTurn();
|
|
else if (ctFunction == 'nextRound') game.combat.nextRound();
|
|
else if (ctFunction == 'prevRound') game.combat.previousRound();
|
|
else if (ctFunction == 'endTurn' && game.combat.combatant.owner) game.combat.nextTurn();
|
|
}
|
|
else {
|
|
const onClick = settings.onClick ? settings.onClick : 'doNothing';
|
|
let tokenId;
|
|
if (mode == 'combatants') {
|
|
if (combat != null && combat != undefined && combat.turns.length != 0){
|
|
const initiativeOrder = combat.turns;
|
|
let nr = settings.combatantNr - 1;
|
|
if (nr == undefined || nr < 1) nr = 0;
|
|
const combatant = initiativeOrder[nr]
|
|
if (combatant == undefined) return;
|
|
tokenId = combatant.tokenId;
|
|
}
|
|
}
|
|
else if (mode == 'currentCombatant')
|
|
if (combat != null && combat != undefined && combat.started)
|
|
tokenId = combat.combatant.tokenId;
|
|
|
|
let token = (canvas.tokens.children[0] != undefined) ? canvas.tokens.children[0].children.find(p => p.id == tokenId) : undefined;
|
|
if (token == undefined) return;
|
|
if (onClick == 'doNothing') //Do nothing
|
|
return;
|
|
else if (onClick == 'select'){ //select token
|
|
token.control();
|
|
}
|
|
else if (onClick == 'center'){ //center on token
|
|
let location = token.getCenter(token.x,token.y);
|
|
canvas.animatePan(location);
|
|
}
|
|
else if (onClick == 'centerSelect'){ //center on token and select
|
|
const location = token.getCenter(token.x,token.y);
|
|
canvas.animatePan(location);
|
|
token.control();
|
|
}
|
|
else if (onClick == 'charSheet'){ //Open character sheet
|
|
const element = document.getElementById(token.actor.sheet.id);
|
|
if (element == null) token.actor.sheet.render(true);
|
|
else token.actor.sheet.close();
|
|
}
|
|
else if (onClick == 'tokenConfig'){ //Open token config
|
|
const element = document.getElementById(token.sheet.id);
|
|
if (element == null) token.sheet.render(true);
|
|
else token.sheet.close();
|
|
}
|
|
}
|
|
|
|
}
|
|
} |