Files

139 lines
6.1 KiB
JavaScript

//GrimoireJS v0.1
//by Russell Champoux
//Grimoire magic item generator for the Pathfinder roleplaying game
/*global _:false, console:true */
/*global Armors, Weapons, Potions, Rings, Rods, Scrolls, Shields, Staves, Wands, WondrousItems*/
/*
module Grimoire
# A = Armor and shields
# W = Weapons
# P = Potions
# R = Rings
# O = rOds
# C = sCrolls
# T = sTaves
# N = waNds
# S = wondrouS items
*/
'use strict';
var Grimoire = {};
Grimoire.getItems = function(num_minor, num_medium, num_major, total_value) {
var items = [];
_(num_minor).times(function() {
var roll = _.random(1,100);
switch(true) {
case (roll <= 4): items.push(Grimoire.getArmorOrShield('minor')); break;
case (roll <= 9): items.push(Weapons.getWeapon('minor')); break;
case (roll <= 44): items.push(Potions.getPotion('minor')); break;
case (roll <= 46): items.push(Rings.getRing('minor')); break;
case (roll <= 81): items.push(Scrolls.getScroll('minor')); break;
case (roll <= 91): items.push(Wands.getWand('minor')); break;
case (roll <= 100): items.push(WondrousItems.getItem('minior')); break;
}
});
_(num_medium).times(function() {
var roll = _.random(1,100);
switch(true) {
case (roll <= 10): items.push(Grimoire.getArmorOrShield('medium')); break;
case (roll <= 20): items.push(Weapons.getWeapon('medium')); break;
case (roll <= 30): items.push(Potions.getPotion('medium')); break;
case (roll <= 40): items.push(Rings.getRing('medium')); break;
case (roll <= 50): items.push(Rods.getRod('medium')); break;
case (roll <= 65): items.push(Scrolls.getScroll('medium')); break;
case (roll <= 68): items.push(Staves.getStaff('medium')); break;
case (roll <= 83): items.push(Wands.getWand('medium')); break;
case (roll <= 100): items.push(WondrousItems.getItem('medium')); break;
}
});
_(num_major).times(function() {
var roll = _.random(1,100);
switch(true) {
case (roll <= 10): items.push(Grimoire.getArmorOrShield('major')); break;
case (roll <= 20): items.push(Weapons.getWeapon('major')); break;
case (roll <= 25): items.push(Potions.getPotion('major')); break;
case (roll <= 35): items.push(Rings.getRing('major')); break;
case (roll <= 45): items.push(Rods.getRod('major')); break;
case (roll <= 55): items.push(Scrolls.getScroll('major')); break;
case (roll <= 75): items.push(Staves.getStaff('major')); break;
case (roll <= 80): items.push(Wands.getWand('major')); break;
case (roll <= 100): items.push(WondrousItems.getItem('major')); break;
}
});
items.forEach(function(i) { console.log(i);});
return items;
};
Grimoire.getArmorOrShield = function(type, final) {
final = typeof final !== 'undefined' ? final : true; //set to false when we recursively call getArmorOrShield
var roll = _.random(1,100);
if(type === 'minor') {
switch(true) {
case (roll <= 60): return Shields.getShields()[0];
case (roll <= 80): return Armors.getArmors()[0];
case (roll <= 85): return Shields.getShields()[1];
case (roll <= 87): return Armors.getArmors()[1];
case (roll <= 89): return Armors.getSpecific('minor');
case (roll <= 91): return Shields.getSpecific('minor');
case (roll <= 100): /*add modifier*/ break;
}
}
else if(type === 'medium') {
switch(true) {
case (roll <= 5): return Shields.getShields()[0];
case (roll <= 10): return Armors.getArmors()[0];
case (roll <= 20): return Shields.getShields()[1];
case (roll <= 30): return Armors.getArmors()[1];
case (roll <= 40): return Shields.getShields()[2];
case (roll <= 50): return Armors.getArmors()[2];
case (roll <= 55): return Shields.getShields()[3];
case (roll <= 57): return Armors.getArmors()[3];
case (roll <= 60): return Armors.getSpecific('medium');
case (roll <= 63): return Shields.getSpecific('medium');
case (roll <= 100): /*add modifier*/ break;
}
}
else if(type === 'major') {
switch(true) {
case (roll <= 8): return Shields.getShields()[2];
case (roll <= 16): return Armors.getArmors()[2];
case (roll <= 27): return Shields.getShields()[3];
case (roll <= 38): return Armors.getArmors()[3];
case (roll <= 49): return Shields.getShields()[4];
case (roll <= 57): return Armors.getArmors()[4];
case (roll <= 60): return Armors.getSpecific('major');
case (roll <= 63): return Shields.getSpecific('major');
case (roll <= 100): /*add modifier*/ break;
}
}
if(['minor','medium','major'].indexOf(type) >= 0) {
//this means that we hit an 'add a special effect' in one of the above cases
var item = Grimoire.getArmorOrShield(type, false);
var special = {'name': '', 'bonus': 0, 'cost': 0};
//in case we can't figure out if it's an armor or shield, we can use default values
if(item.name.search(/shield|buckler/) >= 0) {
special = Shields.getSpecial(type);
}
else if (item.name.search(/armor|shirt|plate|chain|hide|mail/) >= 0) {
special = Armors.getSpecial(type);
}
if(item.bonus + special.bonus <= 10) { //not alowed to go over 10
item = {
'name': special.name + ' ' + item.name,
'bonus': special.bonus + item.bonus,
'cost': special.cost + item.cost +
Armors.getArmors()[special.bonus+item.bonus].cost - Armors.getArmors()[item.bonus].cost
};
}
var i = item.name.indexOf('+');
if(i !== -1) {
//move the '+X' to the front
item.name = item.name.slice(i, i+3) + item.name.slice(0, i) + item.name.slice(i+3);
}
return item;
}
};