Nevermind, I don't got it. on('change:attribute', function(obj, prev){ var character = getCharacterById(obj.get("_characterid")); if(obj.get("name").indexOf("STR_") == 0 || obj.get("name") == "size"){ setCarryingCapacity(character, getAttrByIdAndName(character.get("_id"), "STR_Value", 0,false)); } }); STR_Value should return (@{STR_Base}+@{STR_Enh}+@{STR_Temp_Misc_1}+@{STR_Temp_Misc_2}+@{STR_Temp_Misc_3}) STR_Base should return (@{STR_Roll}+@{STR_Racial}+@{STR_Inherent}+@{STR_Size}+@{STR_Perm_Misc}) and STR_Size should return ((ceil(((@{size}-1)/999999999)*((@{size}-1)/999999999))*(-1)+1)*(-10))+((ceil(((@{size}-2)/999999999)*((@{size}-2)/999999999))*(-1)+1)*(-10))+((ceil(((@{size}-3)/999999999)*((@{size}-3)/999999999))*(-1)+1)*(-8))+((ceil(((@{size}-4)/999999999)*((@{size}-4)/999999999))*(-1)+1)*(-4))+((ceil(((@{size}-5)/999999999)*((@{size}-5)/999999999))*(-1)+1)*(0))+((ceil(((@{size}-6)/999999999)*((@{size}-6)/999999999))*(-1)+1)*(8))+((ceil(((@{size}-7)/999999999)*((@{size}-7)/999999999))*(-1)+1)*(16))+((ceil(((@{size}-8)/999999999)*((@{size}-8)/999999999))*(-1)+1)*(24))+((ceil(((@{size}-9)/999999999)*((@{size}-9)/999999999))*(-1)+1)*(32))+((ceil(((@{size}-10)/999999999)*((@{size}-10)/999999999))*(-1)+1)*(40))+((ceil(((@{size}-11)/999999999)*((@{size}-11)/999999999))*(-1)+1)*(48))+((ceil(((@{size}-12)/999999999)*((@{size}-12)/999999999))*(-1)+1)*(56)) The problem (I think) is somewhere in the following code... function getAttrByIdAndName(characterId, attributeName, defaultValue, getMax){ var valueType = "current"; if(getMax === "true"){ valueType = "max"; } var attribute = findObjs({ type: 'attribute', characterid: characterId, name: attributeName })[0]; if(!attribute){ attribute = createObj('attribute', { characterid: characterId, name: attributeName, current: defaultValue, max: defaultValue }); } return attribute; } after the var attribute = findObjs({...})[0], the attribute variable is still undefined, and I cannot for the life of me figure out why. I've been staring at this code for too long. Hopefully a second set of eyes will help.