Files

374 lines
15 KiB
JavaScript

// Fix buggy issues, thanks Steve D., https://app.roll20.net/forum/post/1462045/help-with-setting-attribute-values
createObjFix = function() {
//Create Object Fix - Firebase.set failed
var obj = createObj.apply(this, arguments);
var id = obj.id;
var characterID = obj.get('characterid');
var type = obj.get('type');
if (obj && !obj.fbpath && obj.changed) {
obj.fbpath = obj.changed._fbpath.replace(/([^\/]*\/){4}/, "/");
} else if (obj && !obj.changed && type == 'attribute') {
//fix for dynamic attribute after character created in game
// /char-attribs/char/characterID/attributeID
obj.fbpath = '/char-attribs/char/'+ characterID +'/'+ id;
}
return obj;
}
// Addes don't count as changes so we need to handle the first change here
on("add:attribute", function(obj) {
var attributeName = obj.get("name");
var attributeNameLastFour = attributeName.slice(-4);
var attributeNameLastFive = attributeName.slice(-5);
if (attributeName == "fatigue") {
setFatigueEffects(obj.get('_characterid'), obj.get('current'));
} else if (attributeName == "pow_std" || attributeName == "pow_temp" || attributeName == "cha_std" || attributeName == "cha_temp" || attributeName == "binding_points" || attributeName == "binding_temp" || attributeName == "binding_diff") {
setSpiritDamage(obj.get('_characterid'));
} else if (attributeName == "str_std" || attributeName == "str_temp" || attributeName == "siz_std" || attributeName == "siz_temp") {
setStdDamageModifier(obj.get('_characterid'));
} else if (attributeNameLastFour == '_enc' || attributeNameLastFive == '_qnty') {
setLoadEffects(obj.get('_characterid'));
}
});
// Handle all other changes to key values
on("change:attribute", function(obj) {
var attributeName = obj.get("name");
var attributeNameLastFour = attributeName.slice(-4);
var attributeNameLastFive = attributeName.slice(-5);
if (attributeName == "fatigue") {
setFatigueEffects(obj.get('_characterid'), obj.get('current'));
} else if (attributeName == "pow_std" || attributeName == "pow_temp" || attributeName == "cha_std" || attributeName == "cha_temp" || attributeName == "binding_points" || attributeName == "binding_temp" || attributeName == "binding_diff") {
setSpiritDamage(obj.get('_characterid'));
} else if (attributeName == "str_std" || attributeName == "str_temp" || attributeName == "siz_std" || attributeName == "siz_temp") {
setStdDamageModifier(obj.get('_characterid'));
} else if (attributeNameLastFour == '_enc' || attributeNameLastFive == '_qnty') {
setLoadEffects(obj.get('_characterid'));
}
});
function setLoadEffects(characterID) {
var encSkillMod = findObjs({_type: 'attribute', _characterid: characterID, name: 'enc_skill_mod'})[0];
if (! encSkillMod) {
var encSkillMod = createObjFix('attribute', {
name: 'enc_skill_mod',
characterid: characterID,
current: 'Standard'
});
}
var encMoveRateMod = findObjs({_type: 'attribute', _characterid: characterID, name: 'enc_move_rate_mod'})[0];
if (! encMoveRateMod) {
var encMoveRateMod = createObjFix('attribute', {
name: 'enc_move_rate_mod',
characterid: characterID,
current: '-0'
});
}
var encCarryingLoad = findObjs({_type: 'attribute', _characterid: characterID, name: 'enc_carrying_load'})[0];
if (! encCarryingLoad) {
var encCarryingLoad = createObjFix('attribute', {
name: 'enc_carrying_load',
characterid: characterID,
current: 'Light'
});
}
var encTotal = 0;
// Add up hit location enc
for (i = 1; i <= 11; i++) {
iValue = parseInt(getAttrByName(characterID, "hitloc"+i+"_enc"));
encTotal = encTotal + iValue;
}
// Add shield enc
encTotal = encTotal + parseInt(getAttrByName(characterID, "shield_enc"));
// Add up weapon enc
for (i = 1; i <= 8; i++) {
iValue = parseInt(getAttrByName(characterID, "weapon"+i+"_enc"));
encTotal = encTotal + iValue;
}
// Add up item enc
for (i = 1; i <= 20; i++) {
iValue = parseInt(getAttrByName(characterID, "item"+i+"_enc")) * parseInt(getAttrByName(characterID, "item"+i+"_qnty"));
encTotal = encTotal + iValue;
}
var strStd = parseInt(getAttrByName(characterID, "str_std"));
var strTemp = parseInt(getAttrByName(characterID, "str_temp"));
var str = strStd + strTemp;
var encBurdened = str * 2;
var encOverloaded = str * 3;
var encMax = str * 4;
if (encTotal >= encMax) {
encSkillMod.set({current: 'Impossible'});
encMoveRateMod.set({current: '*0'});
encCarryingLoad.set({current: 'Too Much'});
} else if (encTotal >= encOverloaded) {
encSkillMod.set({current: '2 Grades Harder'});
encMoveRateMod.set({current: '*.5'});
encCarryingLoad.set({current: 'Strenuous'});
} else if (encTotal >= encBurdened) {
encSkillMod.set({current: '1 Grade Harder'});
encMoveRateMod.set({current: '-2'});
encCarryingLoad.set({current: 'Medium'});
} else {
encSkillMod.set({current: 'Standard'});
encMoveRateMod.set({current: '-0'});
encCarryingLoad.set({current: 'Light'});
}
}
function setFatigueEffects(characterID, currentFatigueValue) {
var fatigueSkillGrade = findObjs({_type: 'attribute', _characterid: characterID, name: 'fatigue_skillgrade'})[0];
if (! fatigueSkillGrade) {
var fatigueSkillGrade = createObjFix('attribute', {
name: 'fatigue_skillgrade',
characterid: characterID,
current: 'Standard'
});
}
var fatigueMovement = findObjs({_type: 'attribute', _characterid: characterID, name: 'fatigue_movement'})[0];
if (! fatigueMovement) {
var fatigueMovement = createObjFix('attribute', {
name: 'fatigue_movement',
characterid: characterID,
current: '+0'
});
}
var fatigueStrikeRank = findObjs({_type: 'attribute', _characterid: characterID, name: 'fatigue_strike_rank'})[0];
if (! fatigueStrikeRank) {
var fatigueStrikeRank = createObjFix('attribute', {
name: 'fatigue_strike_rank',
characterid: characterID,
current: '0'
});
}
var fatigueActionPoints = findObjs({_type: 'attribute', _characterid: characterID, name: 'fatigue_action_points'})[0];
if (! fatigueActionPoints) {
var fatigueActionPoints = createObjFix('attribute', {
name: 'fatigue_action_points',
characterid: characterID,
current: '+0'
});
}
var fatigueRecoveryPeroid = findObjs({_type: 'attribute', _characterid: characterID, name: 'fatigue_recovery_peroid'})[0];
if (! fatigueRecoveryPeroid) {
var fatigueRecoveryPeroid = createObjFix('attribute', {
name: 'fatigue_recovery_peroid',
characterid: characterID,
current: '0'
});
}
if (currentFatigueValue == 'Fresh') {
fatigueSkillGrade.set({current: 'Standard'});
fatigueMovement.set({current: '+0'});
fatigueStrikeRank.set({current: '0'});
fatigueActionPoints.set({current: '+0'});
fatigueRecoveryPeroid.set({current: '0'});
} else if (currentFatigueValue == 'Winded') {
fatigueSkillGrade.set({current: 'Hard'});
fatigueMovement.set({current: '+0'});
fatigueStrikeRank.set({current: '0'});
fatigueActionPoints.set({current: '+0'});
fatigueRecoveryPeroid.set({current: '.25'});
} else if (currentFatigueValue == 'Tired') {
fatigueSkillGrade.set({current: 'Hard'});
fatigueMovement.set({current: '-1'});
fatigueStrikeRank.set({current: '0'});
fatigueActionPoints.set({current: '+0'});
fatigueRecoveryPeroid.set({current: '3'});
} else if (currentFatigueValue == 'Wearied') {
fatigueSkillGrade.set({current: 'Formidable'});
fatigueMovement.set({current: '-2'});
fatigueStrikeRank.set({current: '-2'});
fatigueActionPoints.set({current: '+0'});
fatigueRecoveryPeroid.set({current: '6'});
} else if (currentFatigueValue == 'Exhausted') {
fatigueSkillGrade.set({current: 'Formidable'});
fatigueMovement.set({current: '*.5'});
fatigueStrikeRank.set({current: '-4'});
fatigueActionPoints.set({current: '-1'});
fatigueRecoveryPeroid.set({current: '12'});
} else if (currentFatigueValue == 'Debilitated') {
fatigueSkillGrade.set({current: 'Herculean'});
fatigueMovement.set({current: '*.5'});
fatigueStrikeRank.set({current: '-6'});
fatigueActionPoints.set({current: '-2'});
fatigueRecoveryPeroid.set({current: '18'});
} else if (currentFatigueValue == 'Incapacitated') {
fatigueSkillGrade.set({current: 'Herculean'});
fatigueMovement.set({current: '*0'});
fatigueStrikeRank.set({current: '-8'});
fatigueActionPoints.set({current: '-3'});
fatigueRecoveryPeroid.set({current: '24'});
} else if (currentFatigueValue == 'Semi-Conscious') {
fatigueSkillGrade.set({current: 'Hopeless'});
fatigueMovement.set({current: '*0'});
fatigueStrikeRank.set({current: '-99'});
fatigueActionPoints.set({current: '*0'});
fatigueRecoveryPeroid.set({current: '36'});
} else if (currentFatigueValue == 'Comatose') {
fatigueSkillGrade.set({current: 'No activity possible'});
fatigueMovement.set({current: '*0'});
fatigueStrikeRank.set({current: '-99'});
fatigueActionPoints.set({current: '*0'});
fatigueRecoveryPeroid.set({current: '48'});
} else if (currentFatigueValue == 'Dead') {
fatigueSkillGrade.set({current: 'Dead'});
fatigueMovement.set({current: '*0'});
fatigueStrikeRank.set({current: '-99'});
fatigueActionPoints.set({current: '*0'});
fatigueRecoveryPeroid.set({current: 'Never'});
} else {
log("Unknown value for fatigue, setting effects to default values.");
fatigueSkillGrade.set({current: 'Standard'});
fatigueMovement.set({current: '+0'});
fatigueStrikeRank.set({current: '0'});
fatigueActionPoints.set({current: '+0'});
fatigueRecoveryPeroid.set({current: '0'});
}
}
function setSpiritDamage(characterID) {
var spiritDamage = findObjs({_type: 'attribute', _characterid: characterID, name: 'spirit_damage'})[0];
if (! spiritDamage) {
var spiritDamage = createObjFix('attribute', {
name: 'spirit_damage',
characterid: characterID,
current: '1d2'
});
}
var bindingDiff = findObjs({_type: 'attribute', _characterid: characterID, name: 'binding_diff'})[0];
if (! bindingDiff) {
var bindingDiff = createObjFix('attribute', {
name: 'binding_diff',
characterid: characterID,
current: '1'
});
}
var powStd = parseInt(getAttrByName(characterID, "pow_std"));
var powTemp = parseInt(getAttrByName(characterID, "pow_temp"));
var chaStd = parseInt(getAttrByName(characterID, "cha_std"));
var chaTemp = parseInt(getAttrByName(characterID, "cha_temp"));
var bindingPoints = parseInt(getAttrByName(characterID, "binding_points"));
var bindingTemp = parseInt(getAttrByName(characterID, "binding_temp"));
var bindingDiff = parseFloat(getAttrByName(characterID, "binding_diff"));
var bindingTotal = Math.round((powStd + powTemp + chaStd + chaTemp + bindingPoints + bindingTemp) * bindingDiff);
if (bindingTotal >= 301) {
spiritDamage.set({current: '2d10+2d6'});
} else if (bindingTotal >= 281) {
spiritDamage.set({current: '3d10'});
} else if (bindingTotal >= 261) {
spiritDamage.set({current: '2d10+1d8'});
} else if (bindingTotal >= 241) {
spiritDamage.set({current: '2d10+1d6'});
} else if (bindingTotal >= 221) {
spiritDamage.set({current: '2d10+1d4'});
} else if (bindingTotal >= 201) {
spiritDamage.set({current: '2d10+1d2'});
} else if (bindingTotal >= 181) {
spiritDamage.set({current: '2d10'});
} else if (bindingTotal >= 161) {
spiritDamage.set({current: '1d10+1d8'});
} else if (bindingTotal >= 141) {
spiritDamage.set({current: '2d8'});
} else if (bindingTotal >= 121) {
spiritDamage.set({current: '1d8+1d6'});
} else if (bindingTotal >= 101) {
spiritDamage.set({current: '2d6'});
} else if (bindingTotal >= 81) {
spiritDamage.set({current: '1d10'});
} else if (bindingTotal >= 61) {
spiritDamage.set({current: '1d8'});
} else if (bindingTotal >= 41) {
spiritDamage.set({current: '1d6'});
} else if (bindingTotal >= 21) {
spiritDamage.set({current: '1d4'});
} else {
spiritDamage.set({current: '1d2'});
}
}
function setStdDamageModifier(characterID) {
var stdDamageModifier = findObjs({_type: 'attribute', _characterid: characterID, name: 'damage_mod_std'})[0];
if (! stdDamageModifier) {
var stdDamageModifier = createObjFix('attribute', {
name: 'damage_mod_std',
characterid: characterID,
current: '0'
});
}
var strStd = parseInt(getAttrByName(characterID, "str_std"));
var strTemp = parseInt(getAttrByName(characterID, "str_temp"));
var sizStd = parseInt(getAttrByName(characterID, "siz_std"));
var sizTemp = parseInt(getAttrByName(characterID, "siz_temp"));
var total = strStd + strTemp + sizStd + sizTemp;
if (total >= 171) {
stdDamageModifier.set({current: '2d10+2d6'});
} else if (total >= 161) {
stdDamageModifier.set({current: '2d10+1d12'});
} else if (total >= 151) {
stdDamageModifier.set({current: '3d10'});
} else if (total >= 141) {
stdDamageModifier.set({current: '2d10+1d8'});
} else if (total >= 131) {
stdDamageModifier.set({current: '2d10+1d6'});
} else if (total >= 121) {
stdDamageModifier.set({current: '2d10+1d4'});
} else if (total >= 111) {
stdDamageModifier.set({current: '2d10+1d2'});
} else if (total >= 101) {
stdDamageModifier.set({current: '2d10'});
} else if (total >= 91) {
stdDamageModifier.set({current: '1d10+1d8'});
} else if (total >= 81) {
stdDamageModifier.set({current: '2d8'});
} else if (total >= 71) {
stdDamageModifier.set({current: '1d8+1d6'});
} else if (total >= 61) {
stdDamageModifier.set({current: '2d6'});
} else if (total >= 51) {
stdDamageModifier.set({current: '1d12'});
} else if (total >= 46) {
stdDamageModifier.set({current: '1d10'});
} else if (total >= 41) {
stdDamageModifier.set({current: '1d8'});
} else if (total >= 36) {
stdDamageModifier.set({current: '1d6'});
} else if (total >= 31) {
stdDamageModifier.set({current: '1d4'});
} else if (total >= 26) {
stdDamageModifier.set({current: '1d2'});
} else if (total >= 21) {
stdDamageModifier.set({current: '0'});
} else if (total >= 16) {
stdDamageModifier.set({current: '-1d2'});
} else if (total >= 11) {
stdDamageModifier.set({current: '-1d4'});
} else if (total >= 6) {
stdDamageModifier.set({current: '-1d6'});
} else {
stdDamageModifier.set({current: '-1d8'});
}
}