182 lines
3.9 KiB
JavaScript
182 lines
3.9 KiB
JavaScript
import DEFAULT_CHARACTER_DOCS from '/imports/api/creature/DEFAULT_CHARACTER_DOCS.js';
|
|
import { Random } from 'meteor/random';
|
|
|
|
const setParent = function(charId){
|
|
let parent = {
|
|
collection: "Creatures",
|
|
id: charId,
|
|
group: "default",
|
|
};
|
|
return doc => {
|
|
doc.parent = doc.parent || parent;
|
|
doc.charId = charId;
|
|
};
|
|
};
|
|
|
|
const getRacialBonusEffect = function(charId, attribute, bonus){
|
|
return {
|
|
name: "Race Bonus",
|
|
stat: attribute,
|
|
operation: "add",
|
|
calculation: bonus.toString(),
|
|
enabled: true,
|
|
parent: {
|
|
collection: "Creatures",
|
|
id: charId,
|
|
group: "race",
|
|
},
|
|
charId: charId,
|
|
};
|
|
};
|
|
|
|
const giveDocsOrderAndIds = function(docArray){
|
|
for (i in docArray){
|
|
docArray[i].order = +i;
|
|
if (!docArray[i]._id){
|
|
docArray[i]._id = Random.id();
|
|
}
|
|
}
|
|
};
|
|
|
|
const getDefaultCharacterDocs = function(charId, {
|
|
// Character form data
|
|
baseStrength = 10,
|
|
baseDexterity = 10,
|
|
baseConstitution = 10,
|
|
baseIntelligence = 10,
|
|
baseWisdom = 10,
|
|
baseCharisma = 10,
|
|
strengthBonus = 0,
|
|
dexterityBonus = 0,
|
|
constitutionBonus = 0,
|
|
intelligenceBonus = 0,
|
|
wisdomBonus = 0,
|
|
charismaBonus = 0,
|
|
hitDice = "d8",
|
|
cls = "Class",
|
|
level = 1,
|
|
}){
|
|
let docs = DEFAULT_CHARACTER_DOCS();
|
|
|
|
// Setup the base ability scores
|
|
docs.attributes[0].baseValue = baseStrength;
|
|
docs.attributes[1].baseValue = baseDexterity;
|
|
docs.attributes[2].baseValue = baseConstitution;
|
|
docs.attributes[3].baseValue = baseIntelligence;
|
|
docs.attributes[4].baseValue = baseWisdom;
|
|
docs.attributes[5].baseValue = baseCharisma;
|
|
|
|
// Set up racial bonuses
|
|
if (strengthBonus) {
|
|
docs.effects.push(
|
|
getRacialBonusEffect(charId, 'strength', strengthBonus)
|
|
);
|
|
}
|
|
if (dexterityBonus) {
|
|
docs.effects.push(
|
|
getRacialBonusEffect(charId, 'dexterity', dexterityBonus)
|
|
);
|
|
}
|
|
if (constitutionBonus) {
|
|
docs.effects.push(
|
|
getRacialBonusEffect(charId, 'constitution', constitutionBonus)
|
|
);
|
|
}
|
|
if (intelligenceBonus) {
|
|
docs.effects.push(
|
|
getRacialBonusEffect(charId, 'intelligence', intelligenceBonus)
|
|
);
|
|
}
|
|
if (wisdomBonus) {
|
|
docs.effects.push(
|
|
getRacialBonusEffect(charId, 'wisdom', wisdomBonus)
|
|
);
|
|
}
|
|
if (charismaBonus) {
|
|
docs.effects.push(
|
|
getRacialBonusEffect(charId, 'charisma', charismaBonus)
|
|
);
|
|
}
|
|
|
|
// Set up Class
|
|
const strippedCls = cls.replace(/\s+/g, '')
|
|
const classId = Random.id();
|
|
docs.classes = [{
|
|
_id: classId,
|
|
charId,
|
|
level,
|
|
name: cls,
|
|
}];
|
|
|
|
// Setup hit dice
|
|
docs.effects.push({
|
|
name: cls,
|
|
stat: `${hitDice}HitDice`,
|
|
operation: "add",
|
|
calculation: `${strippedCls}Level`,
|
|
enabled: true,
|
|
parent: {
|
|
collection: "Classes",
|
|
id: classId,
|
|
},
|
|
charId: charId,
|
|
});
|
|
|
|
// Setup health for all class levels
|
|
let healthPerLevel = 4;
|
|
if (hitDice == "d6"){
|
|
healthPerLevel = 4;
|
|
} else if (hitDice == "d8"){
|
|
healthPerLevel = 5;
|
|
} else if (hitDice == "d10"){
|
|
healthPerLevel = 6;
|
|
} else if (hitDice == "d12"){
|
|
healthPerLevel = 7;
|
|
}
|
|
docs.effects.push({
|
|
name: cls,
|
|
stat: `hitPoints`,
|
|
operation: "add",
|
|
calculation: `${healthPerLevel - 2} + ${healthPerLevel} * ${strippedCls}Level`,
|
|
enabled: true,
|
|
parent: {
|
|
collection: "Classes",
|
|
id: classId,
|
|
},
|
|
charId: charId,
|
|
});
|
|
|
|
// Set the parents for base items
|
|
docs.attributes.forEach(setParent(charId));
|
|
docs.skills.forEach(setParent(charId));
|
|
docs.damageMultipliers.forEach(setParent(charId));
|
|
docs.effects.forEach(setParent(charId));
|
|
docs.containers.forEach(setParent(charId));
|
|
|
|
// Set up parenting on items and move them to the top level items object
|
|
docs.items = [];
|
|
docs.containers.forEach(container => {
|
|
container._id = Random.id();
|
|
const parent = {
|
|
collection: "Containers",
|
|
id: container._id,
|
|
};
|
|
container.items.forEach(item => {
|
|
item.parent = parent;
|
|
item.charId = charId;
|
|
});
|
|
// Move the items to the top level array
|
|
docs.items.push(...container.items);
|
|
delete container.items;
|
|
});
|
|
|
|
// Order the docs
|
|
for (collection in docs){
|
|
giveDocsOrderAndIds(docs[collection]);
|
|
}
|
|
|
|
return docs
|
|
};
|
|
|
|
export default getDefaultCharacterDocs;
|