Skip to content

Concentration | 0.2.0 | Beacon Compatibility #2066

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 51 additions & 44 deletions Concentration/0.1.14/Concentration.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,36 +79,39 @@ var Concentration = Concentration || (function() {
sendAdvantageMenu();
break;

case 'toggle-advantage':
let id = args[0];
case 'toggle-advantage': {
let id = args[0];

if(state[state_name].advantages[id]){
state[state_name].advantages[id] = !state[state_name].advantages[id];
}else{
state[state_name].advantages[id] = true;
}
if(state[state_name].advantages[id]){
state[state_name].advantages[id] = !state[state_name].advantages[id];
}else{
state[state_name].advantages[id] = true;
}

sendAdvantageMenu();
sendAdvantageMenu();
}
break;

case 'roll':
let represents = args[0],
DC = parseInt(args[1], 10),
con_save_mod = parseInt(args[2], 10),
name = args[3],
target = args[4];
case 'roll': {
let represents = args[0],
DC = parseInt(args[1], 10),
con_save_mod = parseInt(args[2], 10),
name = args[3],
target = args[4];

roll(represents, DC, con_save_mod, name, target, false);
roll(represents, DC, con_save_mod, name, target, false);
}
break;

case 'advantage':
let represents_a = args[0],
case 'advantage': {
let represents_a = args[0],
DC_a = parseInt(args[1], 10),
con_save_mod_a = parseInt(args[2], 10),
name_a = args[3],
target_a = args[4];

roll(represents_a, DC_a, con_save_mod_a, name_a, target_a, true);
}
break;

default:
Expand All @@ -135,17 +138,17 @@ var Concentration = Concentration || (function() {
},

addConcentration = (token, playerid, spell) => {
const marker = state[state_name].config.statusmarker
const marker = state[state_name].config.statusmarker;
let character = getObj('character', token.get('represents'));
if((token.get('controlledby').split(',').includes(playerid) || token.get('controlledby').split(',').includes('all')) ||
(character && (character.get('controlledby').split(',').includes(playerid) || character.get('controlledby').split(',').includes('all'))) ||
playerIsGM(playerid)){
if(!token.get('status_'+marker)){
let target = state[state_name].config.send_reminder_to;
if(target === 'character'){
target = createWhisperName(character_name);
target = character.get('name');
}else if(target === 'everyone'){
target = ''
target = '';
}

let message;
Expand All @@ -162,7 +165,7 @@ var Concentration = Concentration || (function() {
},

handleConcentrationSpellCast = (msg) => {
const marker = state[state_name].config.statusmarker
const marker = state[state_name].config.statusmarker;

let character_name = msg.content.match(/charname=([^\n{}]*[^"\n{}])/);
character_name = RegExp.$1;
Expand All @@ -180,7 +183,7 @@ var Concentration = Concentration || (function() {
represents: characterid,
_type: 'graphic',
_pageid: player.get('lastpage')
}
};
search_attributes['status_'+marker] = true;
let is_concentrating = (findObjs(search_attributes).length > 0);

Expand All @@ -196,16 +199,16 @@ var Concentration = Concentration || (function() {
}

if(target === 'character'){
target = createWhisperName(character_name);
target = character_name;
}else if(target === 'everyone'){
target = ''
target = '';
}

makeAndSendMenu(message, '', target);
},

handleStatusMarkerChange = (obj, prev) => {
const marker = state[state_name].config.statusmarker
handleStatusMarkerChange = (obj /*, prev */) => {
const marker = state[state_name].config.statusmarker;

if(!obj.get('status_'+marker)){
removeMarker(obj.get('represents'));
Expand All @@ -227,7 +230,7 @@ var Concentration = Concentration || (function() {

if(target === 'character'){
chat_text = "Make a Concentration Check - <b>DC " + DC + "</b>.";
target = createWhisperName(obj.get('name'));
target = obj.get('name');
}else if(target === 'everyone'){
chat_text = '<b>'+obj.get('name')+'</b> must make a Concentration Check - <b>DC ' + DC + '</b>.';
target = '';
Expand Down Expand Up @@ -256,11 +259,15 @@ var Concentration = Concentration || (function() {
},

roll = (represents, DC, con_save_mod, name, target, advantage) => {
sendChat(script_name, '[[1d20cf<'+(DC-con_save_mod-1)+'cs>'+(DC-con_save_mod-1)+'+'+con_save_mod+']]', results => {
// Bound the crit success and fail targets so negatives stop wrecking the roll --Oosh
const criticalFail = Math.max(DC-con_save_mod-1, 0),
criticalSuccess = Math.max(DC-con_save_mod, 0),
rollString = `[[1d20cf<${criticalFail}cs>${criticalSuccess} + (${con_save_mod})]]`;
sendChat(script_name, rollString, results => {
let title = 'Concentration Save <br> <b style="font-size: 10pt; color: gray;">'+name+'</b>',
advantageRollResult;

let rollresult = results[0].inlinerolls[0].results.rolls[0].results[0].v;
// Error check the results object and debug for any future issues --Oosh
let rollresult = results ? results[0].inlinerolls[0].results.rolls[0].results[0].v : `Roll error! DC: "${DC}", con_sav_mod: "${con_save_mod}"`;
let result = rollresult;

if(advantage){
Expand Down Expand Up @@ -297,7 +304,7 @@ var Concentration = Concentration || (function() {
<span style="border: 1px solid '+result_color+'; padding-bottom: 2px; padding-top: 4px;">[['+result+'+'+con_save_mod+']]</span><br><br> \
'+result_text+' \
</b> \
</div>'
</div>';
makeAndSendMenu(contents, title, target);

if(target !== '' && target !== 'gm'){
Expand All @@ -316,19 +323,15 @@ var Concentration = Concentration || (function() {
});
},

createWhisperName = (name) => {
return name.split(' ').shift();
},

ucFirst = (string) => {
return string.charAt(0).toUpperCase() + string.slice(1);
},

sendConfigMenu = (first, message) => {
let markerDropdown = '?{Marker';
markers.forEach((marker) => {
markerDropdown += '|'+ucFirst(marker).replace('-', ' ')+','+marker
})
markerDropdown += '|'+ucFirst(marker).replace('-', ' ')+','+marker;
});
markerDropdown += '}';

let markerButton = makeButton(state[state_name].config.statusmarker, '!' + state[state_name].config.command + ' config statusmarker|'+markerDropdown, styles.button + styles.float.right),
Expand All @@ -347,7 +350,7 @@ var Concentration = Concentration || (function() {
'<span style="'+styles.float.left+'">HP Bar:</span> ' + barButton,
'<span style="'+styles.float.left+'">Send Reminder To:</span> ' + sendToButton,
'<span style="'+styles.float.left+'">Auto Add Con. Marker: <p style="font-size: 8pt;">Works only for 5e OGL Sheet.</p></span> ' + addConMarkerButton,
'<span style="'+styles.float.left+'">Auto Roll Save:</span> ' + autoRollButton,
'<span style="'+styles.float.left+'">Auto Roll Save:</span> ' + autoRollButton
],

resetButton = makeButton('Reset', '!' + state[state_name].config.command + ' reset', styles.button + styles.fullWidth),
Expand All @@ -359,7 +362,7 @@ var Concentration = Concentration || (function() {
}*/

if(state[state_name].config.auto_roll_save){
listItems.push('<span style="'+styles.float.left+'">Bonus Attribute:</span> ' + bonusAttrButton)
listItems.push('<span style="'+styles.float.left+'">Bonus Attribute:</span> ' + bonusAttrButton);
}

if(!state[state_name].config.auto_roll_save){
Expand Down Expand Up @@ -393,9 +396,9 @@ var Concentration = Concentration || (function() {
makeAndSendMenu(menu_text, 'Advantage Menu', 'gm');
},

makeAndSendMenu = (contents, title, whisper, callback) => {
makeAndSendMenu = (contents, title, whisper /*, callback */) => {
title = (title && title != '') ? makeTitle(title) : '';
whisper = (whisper && whisper !== '') ? '/w ' + whisper + ' ' : '';
whisper = (whisper && whisper !== '') ? `/w "${whisper}" ` : '';
sendChat(script_name, whisper + '<div style="'+styles.menu+styles.overflow+'">'+title+contents+'</div>', null, {noarchive:true});
},

Expand All @@ -416,12 +419,14 @@ var Concentration = Concentration || (function() {
return list;
},

/*
pre_log = (message) => {
log('---------------------------------------------------------------------------------------------');
if(!message){ return; }
log(message);
log('---------------------------------------------------------------------------------------------');
},
*/

checkInstall = () => {
if(!_.has(state, state_name)){
Expand All @@ -430,13 +435,15 @@ var Concentration = Concentration || (function() {
setDefaults();

log(script_name + ' Ready! Command: !'+state[state_name].config.command);
if(state[state_name].config.debug){ makeAndSendMenu(script_name + ' Ready! Debug On.', '', 'gm') }
if(state[state_name].config.debug){ makeAndSendMenu(script_name + ' Ready! Debug On.', '', 'gm'); }
},

registerEventHandlers = () => {
on('chat:message', handleInput);
on('change:graphic:bar'+state[state_name].config.bar+'_value', handleGraphicChange);
on('change:graphic:statusmarkers', handleStatusMarkerChange);
// Add tokenMod observer so changes made with TM will trigger a conc. check --Oosh
if (typeof(TokenMod) === 'object') TokenMod.ObserveTokenChange(handleGraphicChange);
},

setDefaults = (reset) => {
Expand Down Expand Up @@ -499,12 +506,12 @@ var Concentration = Concentration || (function() {
return {
CheckInstall: checkInstall,
RegisterEventHandlers: registerEventHandlers
}
};
})();

on('ready',function() {
'use strict';

Concentration.CheckInstall();
Concentration.RegisterEventHandlers();
});
});
Loading
Loading