mirror of
https://github.com/Nighthawk42/roll20-character-sheets.git
synced 2026-09-01 12:42:32 +00:00
211 lines
9.4 KiB
JavaScript
211 lines
9.4 KiB
JavaScript
'use strict';
|
|
import _ from 'underscore';
|
|
import {PFLog, PFConsole} from './PFLog';
|
|
import TAS from './TheAaronSheet.js';
|
|
import * as SWUtils from './SWUtils';
|
|
import PFConst from './PFConst';
|
|
import * as PFAttacks from './PFAttacks';
|
|
import * as PFAttackGrid from './PFAttackGrid';
|
|
import * as PFAttackOptions from './PFAttackOptions';
|
|
|
|
|
|
function updateDC (callback,dummy,eventInfo){
|
|
getAttrs(['kineticist_level-mod','kineticist_ability-mod','kineticblast_dc'],function(v){
|
|
var setter={},currVal=0,newVal=0;
|
|
currVal=parseInt(v.kineticblast_dc,10)||0;
|
|
newVal = 10 + (parseInt(v['kineticist_ability-mod'],10)||0)+ Math.floor((parseInt(v['kineticist_level-mod'],10)||0)/2);
|
|
if(currVal!==newVal){
|
|
setter.kineticblast_dc=newVal;
|
|
SWUtils.setWrapper(setter,PFConst.silentParams,callback);
|
|
} else if (typeof callback === "function"){
|
|
callback();
|
|
}
|
|
});
|
|
}
|
|
|
|
function createAttackMacros(eventInfo){
|
|
getAttrs(['kineticblast_attack_type','kineticblast_type','kineticblast_damage_type','use_devastating_infusion'],function(v){
|
|
var attackstr='',damagestr='',levels='',devastating=0,composite=0,dice='6',setter={};
|
|
devastating=parseInt(v.use_devastating_infusion,10)||0;
|
|
if(v.kineticblast_type==='composite'){
|
|
composite=1;
|
|
}
|
|
if(devastating && (v.kineticblast_attack_type==='ranged' || v.kineticblast_damage_type==='energy')){
|
|
damagestr='INVALID';
|
|
attackstr='INVALID';
|
|
} else {
|
|
attackstr='@{kineticblast_attack-mod}+@{buff_kineticblast-total}';
|
|
if(devastating){
|
|
dice='8';
|
|
levels='@{kineticist_level-mod}';
|
|
} else {
|
|
levels='floor((@{kineticist_level-mod}+1)/2)';
|
|
}
|
|
if(composite){
|
|
levels = '2*'+levels+'';
|
|
}
|
|
damagestr='[[ '+levels+' ]]d'+dice;
|
|
if(devastating){
|
|
damagestr = damagestr + '+ @{kineticist_ability-mod}';
|
|
} else if(v.kineticblast_damage_type==='physical'){
|
|
damagestr = damagestr+'+ [[ '+levels+' ]] + @{kineticist_ability-mod}';
|
|
} else {
|
|
damagestr = damagestr+'+ [[ floor(@{kineticist_ability-mod}/2) ]]';
|
|
}
|
|
damagestr = damagestr + '+@{kineticblast_dmg-mod}';
|
|
if(v.kineticblast_attack_type==='ranged'){
|
|
damagestr = damagestr + '+@{buff_dmg_kineticblast-total}';
|
|
}
|
|
}
|
|
setter.kineticblast_tempattack=attackstr;
|
|
setter.kineticblast_tempdmg='[[ '+damagestr+' ]]';
|
|
setter.create_kineticblast_macro=0;
|
|
SWUtils.setWrapper(setter,PFConst.silentParams);
|
|
});
|
|
}
|
|
|
|
|
|
function createAttack (eventInfo){
|
|
getAttrs(['adv_macro_show','create_kineticblast_attack','kineticblast_attack_type','kineticblast_type', 'kineticblast_damage_type','kineticblast_tempattack','kineticblast_tempdmg'],function(v){
|
|
var weaponPrefix='',id='',attackType='',setter={},name='',damage='',dmgname='',kblastattack=0;
|
|
if(parseInt(v.create_kineticblast_attack,10)){
|
|
try {
|
|
id = generateRowID();
|
|
weaponPrefix = 'repeating_weapon_'+id+'_';
|
|
name=v.kineticblast_type+'-'+v.kineticblast_damage_type+'-';
|
|
name+= v.kineticblast_attack_type==='ranged'?'blast':'blade';
|
|
name = SWUtils.getTranslated(name);
|
|
name = name.replace('-',' '); //just in case
|
|
setter[weaponPrefix + "name"] = name;
|
|
if(v.kineticblast_damage_type==='physical'){
|
|
setter[weaponPrefix + "vs"] = "AC";
|
|
dmgname = SWUtils.getTranslated('physical');
|
|
} else {
|
|
setter[weaponPrefix + "vs"] = "touch";
|
|
dmgname = SWUtils.getTranslated('energy');
|
|
}
|
|
if(parseInt(v.adv_macro_show)){
|
|
setter[weaponPrefix + "attack_macro_insert"]=v.kineticblast_tempattack;
|
|
} else {
|
|
setter[weaponPrefix + "attack"]=v.kineticblast_tempattack;
|
|
}
|
|
if(v.kineticblast_attack_type==='ranged'){
|
|
setter[weaponPrefix + "attack-type"] = 'attk-ranged';
|
|
setter[weaponPrefix + "range"] = "@{kineticblast_range}";
|
|
setter[weaponPrefix + "isranged"] = 1;
|
|
} else {
|
|
setter[weaponPrefix + "attack-type"] = 'attk-melee';
|
|
}
|
|
setter[weaponPrefix + "precision_dmg_macro"] = v.kineticblast_tempdmg;
|
|
setter[weaponPrefix + "precision_dmg_type"] = dmgname;
|
|
setter[weaponPrefix + "critical_dmg_macro"] = v.kineticblast_tempdmg;
|
|
setter[weaponPrefix + "critical_dmg_type"] = dmgname;
|
|
setter[weaponPrefix + "notes"] = "DC [[@{kineticblast_dc}]] (if applicable)";
|
|
setter[weaponPrefix + "default_damage-dice-num"] = 0;
|
|
setter[weaponPrefix + "default_damage-die"] = 0;
|
|
setter[weaponPrefix + "damage-dice-num"] = 0;
|
|
setter[weaponPrefix + "damage-die"] = 0;
|
|
setter[weaponPrefix + "size_affects"] = 0;
|
|
setter[weaponPrefix + "damage-ability"] = "0";
|
|
//TAS.debug("PFOccult.createAttack",setter);
|
|
} catch (err) {
|
|
TAS.error("PFAttacks.createAttack err creating "+v.kineticblast_attack_type,err);
|
|
} finally {
|
|
if(_.size(setter)){
|
|
setter.create_kineticblast_attack=0;
|
|
SWUtils.setWrapper(setter,PFConst.silentParams,function(){
|
|
//TAS.debug("################ created attack "+id);
|
|
PFAttacks.recalcRepeatingWeapon(id,function(){
|
|
PFAttackGrid.resetCommandMacro();
|
|
PFAttackOptions.resetOption(id);
|
|
});
|
|
});
|
|
} else {
|
|
SWUtils.setWrapper({'create_kineticblast_attack':0},PFConst.silentParams);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
export function updateNLDamageFromBurn (eventInfo){
|
|
getAttrs(['non-lethal-damage','kineticistburn','oldkineticistburn','level'],function(v){
|
|
var nld=0,oldburn=0,newburn=0,diff=0,level=0,newdmg=0,newnld=0,setter={};
|
|
try{
|
|
oldburn=parseInt(v['oldkineticistburn'],10)||0;
|
|
newburn=parseInt(v['kineticistburn'],10)||0;
|
|
if(oldburn!==newburn){
|
|
setter.oldkineticistburn=newburn;
|
|
nld=parseInt(v['non-lethal-damage'],10)||0;
|
|
diff = (newburn-oldburn)||0;
|
|
level = parseInt(v.level,10)||0;
|
|
newdmg=diff*level;
|
|
TAS.debug("PFOccult.change:kineticistburn level:"+ level+", newdmg:"+newdmg+", curr nld:"+nld,v);
|
|
newnld = nld + newdmg;
|
|
if (newnld<0){
|
|
newnld=0;
|
|
}
|
|
setter['non-lethal-damage']=newnld;
|
|
}
|
|
} catch (err){
|
|
TAS.error("PFOccult.change:kineticistburn kineticburn",err);
|
|
} finally {
|
|
if (_.size(setter)){
|
|
// SWUtils.setWrapper(setter,PFConst.silentParams);
|
|
// when including the PFConst.silentParams option ie silent:true, buffs do not detect linked tokenbar updates
|
|
SWUtils.setWrapper(setter);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
export var recalculate = TAS.callback(function PFOccultRecalculate(callback,dummy,oldversion){
|
|
getAttrs(['use_burn'],function(vout){
|
|
if(parseInt(vout.use_burn,10)){
|
|
updateDC();
|
|
}
|
|
if (typeof callback === "function"){
|
|
TAS.info("leaving PFOccult.recalculate");
|
|
callback();
|
|
}
|
|
});
|
|
});
|
|
|
|
on("change:create_kineticblast_macro",TAS.callback(function eventCreateKineticMacros(eventInfo){
|
|
if(eventInfo.sourceType==="player"||eventInfo.sourceType==="api"){
|
|
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
|
|
getAttrs(['create_kineticblast_macro'],function(v){
|
|
if(parseInt(v.create_kineticblast_macro,10)){
|
|
createAttackMacros(eventInfo);
|
|
}
|
|
});
|
|
}
|
|
}));
|
|
|
|
on("change:kineticist_level-mod change:kineticist_ability-mod",TAS.callback(function eventKineticistDC(eventInfo){
|
|
if(eventInfo.sourceType==="sheetworker"||eventInfo.sourceType==="api"){
|
|
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
|
|
updateDC(null,null,eventInfo);
|
|
}
|
|
}));
|
|
|
|
on("change:use_burn",TAS.callback(function eventUseBurn(eventInfo){
|
|
if(eventInfo.sourceType==="player"||eventInfo.sourceType==="api"){
|
|
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
|
|
recalculate();
|
|
}
|
|
}));
|
|
|
|
on("change:create_kineticblast_attack",TAS.callback(function eventCreateKineticAttack(eventInfo){
|
|
if(eventInfo.sourceType==="player"||eventInfo.sourceType==="api"){
|
|
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
|
|
createAttack(eventInfo);
|
|
}
|
|
}));
|
|
|
|
on("change:kineticistburn", TAS.callback(function eventUpdateBurn(eventInfo) {
|
|
if(eventInfo.sourceType==="player" || eventInfo.sourceType==="api"){
|
|
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
|
|
updateNLDamageFromBurn(eventInfo);
|
|
}
|
|
})); |