mirror of
https://github.com/RussellChamp/GrimoireJS.git
synced 2026-10-27 22:42:32 +00:00
Slowly converting codebase to new system
This commit is contained in:
1 parent
f1ddc43f9a
commit
6028b7a3fe
13 files changed
+435
-1278
No files matched your search
@@ -3,7 +3,6 @@ GrimoireJS
|
||||
|
||||
GrimoireJS: Magic item generator for the Pathfinder tabletop RPG
|
||||
written by Russell Champoux
|
||||
last updated 1/20/14
|
||||
|
||||
This project contains a series of function under the 'Grimoire' module.
|
||||
* The primary file to include is grimoire.rb
|
||||
|
||||
-37
@@ -1,37 +0,0 @@
|
||||
/*global _:false */
|
||||
/*global Grimoire:true */
|
||||
'use strict';
|
||||
Grimoire.getDeities = function() {
|
||||
//list of deities and their allignments
|
||||
//dieties['lawful/neutral/chaotic']['good/neutral/evil'] = [gods]
|
||||
return {
|
||||
'lawful': {
|
||||
'good' : ['Erastil', 'Iomedae', 'Torag'],
|
||||
'neutral' : ['Abadar', 'Irori'],
|
||||
'evil' : ['Asmodeus', 'Zon-Kuthon']
|
||||
},
|
||||
'neutral': {
|
||||
'good' : ['Sarenrae'],
|
||||
'neutral' : ['Gozreh', 'Pharasma', 'Nethys'],
|
||||
'evil' : ['Urgathoa', 'Norgorber'],
|
||||
},
|
||||
'chaotic' : {
|
||||
'good' : ['Desna', 'Cayden Cailean'],
|
||||
'neutral' : ['Gorum', 'Calistria'],
|
||||
'evil' : ['Lamashtu', 'Rovagug'],
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
Grimoire.getDeity = function(alignment1, alignment2) {
|
||||
if(alignment1 === undefined) alignment1 = _.sample(['lawful', 'neutral', 'chaotic']);
|
||||
if(alignment2 === undefined) alignment2 = _.sample(['good', 'neutral', 'evil']);
|
||||
var alignmentString = "";
|
||||
if(alignment1 === 'neutral' && alignment2 === 'neutral') {
|
||||
alignmentString = ' (true neutral)';
|
||||
}
|
||||
else {
|
||||
alignmentString = ' (' + alignment1 + ' ' + alignment2 + ')';
|
||||
}
|
||||
return _.sample(Grimoire.getDeities()[alignment1][alignment2]) + alignmentString;
|
||||
};
|
||||
@@ -1,6 +0,0 @@
|
||||
/*global _:false */
|
||||
/*global Grimoire:true */
|
||||
'use strict';
|
||||
Grimoire.getEnergyResistance = function() {
|
||||
return _.sample(['acid', 'cold', 'electricity', 'fire', 'sonic']);
|
||||
};
|
||||
+381
-268
@@ -5,7 +5,6 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
var Grimoire = {};
|
||||
var TYPES = {
|
||||
ARMOR_AND_SHIELDS: 'Armor and Shields',
|
||||
POTIONS: 'Potions',
|
||||
@@ -65,297 +64,411 @@ WEIGHTS[QUALITIES.MAJOR] = {
|
||||
};
|
||||
|
||||
//Contains all the source info
|
||||
var SOURCES = [];
|
||||
$.getJSON('sources/sources.json', function(sources) {
|
||||
sources.sources.forEach(function(url) {
|
||||
$.getJSON('sources/' + url, function(source) {
|
||||
console.log('loaded sources/'+ url);
|
||||
source.data = {};
|
||||
//construct the data containers we will insert later data into
|
||||
source.types.forEach(function(type) {
|
||||
source.data[type] = {};
|
||||
source.data[type].enabled = true;
|
||||
var typeUrl = 'sources/' + source.shortName + '/' + type + '.json';
|
||||
$.getJSON(typeUrl, function(typeData) {
|
||||
source.data[type].data = typeData.data;
|
||||
console.log('loaded sources/' + typeUrl);
|
||||
})
|
||||
.fail(function(d, textStatus, error) {
|
||||
console.error('getJSON failed to load '+typeUrl+ ', status: ' + textStatus + ', error: '+error);
|
||||
var Grimoire = function(config) {
|
||||
var self = this;
|
||||
this.chance = (config && config.chance ? config.chance : config && config.seed ? new Chance(config.seed) : new Chance());
|
||||
|
||||
this.SOURCES = [];
|
||||
$.getJSON('sources/sources.json', function(sources) {
|
||||
sources.sources.forEach(function(url) {
|
||||
$.getJSON('sources/' + url, function(source) {
|
||||
console.log('loaded sources/'+ url);
|
||||
source.data = {};
|
||||
//construct the data containers we will insert later data into
|
||||
source.types.forEach(function(type) {
|
||||
source.data[type.name] = {};
|
||||
source.data[type.name].enabled = true;
|
||||
if(type.source) {
|
||||
var typeUrl = 'sources/' + type.source;
|
||||
$.getJSON(typeUrl, function(typeData) {
|
||||
source.data[type.name].data = typeData.data;
|
||||
console.log('loaded sources/' + typeUrl);
|
||||
})
|
||||
.fail(function(d, textStatus, error) {
|
||||
console.error('getJSON failed to load '+typeUrl+ ', status: ' + textStatus + ', error: '+error);
|
||||
});
|
||||
}
|
||||
});
|
||||
self.SOURCES.push(source);
|
||||
})
|
||||
.fail(function(d, textStatus, error) {
|
||||
console.error('getJSON failed to load '+url+ ', status: ' + textStatus + ', error: '+error);
|
||||
});
|
||||
SOURCES.push(source);
|
||||
})
|
||||
.fail(function(d, textStatus, error) {
|
||||
console.error('getJSON failed to load '+url+ ', status: ' + textStatus + ', error: '+error);
|
||||
});
|
||||
})
|
||||
.fail(function(err) {
|
||||
console.log('Failed to load sources list:', err);
|
||||
});
|
||||
})
|
||||
.fail(function(err) {
|
||||
console.log('Failed to load sources list:', err);
|
||||
});
|
||||
|
||||
Grimoire.getItems = function(sources, quality, count, types, options) {
|
||||
this.getItems = function(sources, quality, count, types, options) {
|
||||
|
||||
var items = [];
|
||||
var items = [];
|
||||
|
||||
//Error checking block
|
||||
if(!sources || sources.length === 0) { console.log('No sources given!'); return items; }
|
||||
if(!types || types == 'any' || types.length === 0) {
|
||||
types = _.values(TYPES); //set to all types
|
||||
}
|
||||
for(var i in types) {
|
||||
if(_.values(TYPES).indexOf(types[i]) == -1) { console.log('Invalid type ' + types[i]); return items; }
|
||||
}
|
||||
if(_.values(QUALITIES).indexOf(quality) == -1) { console.log('Invalid quality ' + quality); return items; }
|
||||
if(!count || count < 1) { count = 1; }
|
||||
options = options ? options : {};
|
||||
|
||||
|
||||
|
||||
//initialize the chance engine, using a seed if provided (for testing purposes)
|
||||
//we do this now instead of reinitializing the Chance engine each time we generate an item
|
||||
options.chance = (options.chance ? options.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
|
||||
_.times(count, function() {
|
||||
var item = Grimoire.getItem(sources, quality, types, options);
|
||||
if(item) {
|
||||
items.push(item);
|
||||
console.log(item);
|
||||
//Error checking block
|
||||
if(!sources || sources.length === 0) { console.log('No sources given!'); return items; }
|
||||
if(!types || types == 'any' || types.length === 0) {
|
||||
types = _.values(TYPES); //set to all types
|
||||
}
|
||||
});
|
||||
return items;
|
||||
};
|
||||
|
||||
var selectSource = function(sources, quality, type, options) {
|
||||
options = options ? options : {};
|
||||
var chance = (options.chance ? options.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
|
||||
var source = {};
|
||||
var sourceWeights = {};
|
||||
|
||||
//***SPELLS AND SCROLLS***
|
||||
//************************
|
||||
if(type == TYPES.SCROLLS || type == TYPES.SPELLS) {
|
||||
if(!options.spellType || !options.spellLevel) {
|
||||
console.log('Error selecting source for Spells. Invalid options', options);
|
||||
for(var i in types) {
|
||||
if(_.values(TYPES).indexOf(types[i]) == -1) { console.log('Invalid type ' + types[i]); return items; }
|
||||
}
|
||||
sourceWeights = _.map(sources, function(source) {
|
||||
if(source.data.Spells && source.data.Spells.enabled) {
|
||||
if(source.data.Spells.data[options.spellType]) {
|
||||
return source.data[type].data[options.spellType][options.spellLevel].length;
|
||||
if(_.values(QUALITIES).indexOf(quality) == -1) { console.log('Invalid quality ' + quality); return items; }
|
||||
if(!count || count < 1) { count = 1; }
|
||||
options = options ? options : {};
|
||||
|
||||
|
||||
|
||||
//initialize the chance engine, using a seed if provided (for testing purposes)
|
||||
//we do this now instead of reinitializing the Chance engine each time we generate an item
|
||||
self.chance = (self.chance ? self.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
|
||||
_.times(count, function() {
|
||||
var item = self.getItem(sources, quality, types, options);
|
||||
if(item) {
|
||||
items.push(item);
|
||||
console.log(item);
|
||||
}
|
||||
});
|
||||
return items;
|
||||
};
|
||||
|
||||
var selectSource = function(sources, quality, type, options) {
|
||||
options = options ? options : {};
|
||||
//this is a concern when "getPotions/getWands" calls "getSpell" which calls "selectSource"
|
||||
type = options.typeOverride ? options.typeOverride : type;
|
||||
quality = quality ? quality : options.quality;
|
||||
|
||||
var chance = (self.chance ? self.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
|
||||
var source = {};
|
||||
var sourceWeights = {};
|
||||
|
||||
//***SPELLS AND SCROLLS AND WANDS***
|
||||
//************************
|
||||
if(type == TYPES.SCROLLS || type == TYPES.SPELLS || type == TYPES.WANDS) {
|
||||
if(!options.spellType || !options.spellLevel) {
|
||||
console.log('Error selecting source for Spells. Invalid options', options);
|
||||
}
|
||||
sourceWeights = _.map(sources, function(source) {
|
||||
//Check that we have a spells section
|
||||
//AND that the specific item type we are looking for is enabled
|
||||
if(source.data[TYPES.SPELLS] && source.data[type] && source.data[type].enabled) {
|
||||
if(source.data[TYPES.SPELLS].data[options.spellType]) {
|
||||
return source.data[TYPES.SPELLS].data[options.spellType][options.spellLevel].length;
|
||||
}
|
||||
else { //source did not have my desired spell type
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else { //source did not have my desired spell type
|
||||
else { //source has no spells
|
||||
return 0;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
//***POTIONS***
|
||||
//*************
|
||||
else if(type == TYPES.POTIONS) {
|
||||
sourceWeights = _.map(sources,
|
||||
function(source) {
|
||||
if(source.data[type] && source.data[type].enabled && source.data[type].data[options.potionLevel]) {
|
||||
return source.data[type].data[options.potionLevel].length;
|
||||
}
|
||||
else {
|
||||
return 0; //either no data, disabled, or not items of that quality
|
||||
}
|
||||
});
|
||||
}
|
||||
//***WONDROUS ITEMS***
|
||||
//********************
|
||||
else if(type == TYPES.WONDROUS_ITEMS) {
|
||||
sourceWeights = _.map(sources,
|
||||
function(source) {
|
||||
if(source.data[type] && source.data[type].enabled && source.data[type].data[quality]) {
|
||||
return source.data[type].data[quality].length;
|
||||
}
|
||||
else {
|
||||
return 0; //either no data, disabled, or not items of that quality
|
||||
}
|
||||
});
|
||||
}
|
||||
//***EVERYTHING ELSE***
|
||||
//*********************
|
||||
else {
|
||||
if(type == TYPES.RODS && quality == QUALITIES.MINOR) {
|
||||
console.log('Error! There are no ' + QUALITIES.MINOR + ' ' + TYPES.RODS);
|
||||
return;
|
||||
}
|
||||
else { //source has no spells
|
||||
return 0;
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
//***WONDROUS ITEMS***
|
||||
//********************
|
||||
else if(type == TYPES.WONDROUS_ITEMS) {
|
||||
sourceWeights = _.map(sources,
|
||||
function(source) {
|
||||
if(source.data[type] && source.data[type].enabled && source.data[type].data[quality]) {
|
||||
return source.data[type].data[quality].length;
|
||||
}
|
||||
else {
|
||||
return 0; //either no data, disabled, or not items of that quality
|
||||
}
|
||||
});
|
||||
}
|
||||
//***EVERYTHING ELSE***
|
||||
//*********************
|
||||
else {
|
||||
if(type == TYPES.RODS && quality == QUALITIES.MINOR) {
|
||||
console.log('Error! There are no ' + QUALITIES.MINOR + ' ' + TYPES.RODS);
|
||||
//Determine which source to use
|
||||
//get a count from each source of what we're looking for
|
||||
sourceWeights = _.map(sources,
|
||||
function(source) {
|
||||
//only choose from sources that HAVE that type of item
|
||||
//AND are enabled
|
||||
//AND have at least one item of that quality with a probability weight
|
||||
if(source.data[type] && source.data[type].enabled) {
|
||||
return _.filter(source.data[type].data,
|
||||
function(item) {
|
||||
return item.weight[quality] > 0;
|
||||
}).length;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
if(_.sum(sourceWeights) <= 0) {
|
||||
console.log('Unable to find valid ' + quality + ' ' + type + ' within sources!', sources);
|
||||
return;
|
||||
}
|
||||
//Determine which source to use
|
||||
//get a count from each source of what we're looking for
|
||||
sourceWeights = _.map(sources,
|
||||
function(source) {
|
||||
//only choose from sources that HAVE that type of item
|
||||
//AND are enabled
|
||||
//AND have at least one item of that quality with a probability weight
|
||||
if(source.data[type] && source.data[type].enabled) {
|
||||
return _.filter(source.data[type].data,
|
||||
function(item) {
|
||||
return item.weight[quality] > 0;
|
||||
}).length;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
});
|
||||
}
|
||||
if(_.sum(sourceWeights) <= 0) {
|
||||
console.log('Unable to find valid ' + quality + ' ' + type + ' within sources!', sources);
|
||||
return;
|
||||
}
|
||||
//chance.weighted will DESTRUCTIVELY modify paramaters that have a weight of zero
|
||||
//in this case, that means sources that do not contain the selected type
|
||||
//or sources that have types we want but with no weight
|
||||
//because of that, I create a temp array that I don't care if chance mangles
|
||||
source = sources[chance.weighted(_.range(sources.length), sourceWeights)];
|
||||
return source;
|
||||
};
|
||||
|
||||
|
||||
Grimoire.getItem = function(sources, quality, types, options) {
|
||||
options = options ? options : {};
|
||||
|
||||
var chance = (options.chance ? options.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
|
||||
var itemType = '';
|
||||
if(types.length == 1) {
|
||||
itemType = types[0];
|
||||
}
|
||||
else {
|
||||
//Create a weighted-average map based on the desired types
|
||||
var localWeights = _.clone(WEIGHTS[quality]); //copy the default weighted-average for this quality
|
||||
for(var key in localWeights) {
|
||||
if(_.values(types).indexOf(TYPES[key]) == -1) { //remove any items that were not selected
|
||||
delete localWeights[key];
|
||||
}
|
||||
}
|
||||
//Determine the type of item to generate
|
||||
//console.log(localWeights);
|
||||
itemType = TYPES[chance.weighted(_.keys(localWeights), _.values(localWeights))];
|
||||
}
|
||||
|
||||
var item = {};
|
||||
var source = {};
|
||||
|
||||
//GENERATE ITEM
|
||||
//SCROLLS
|
||||
if(itemType == TYPES.SCROLLS) {
|
||||
item = Grimoire.getScroll(sources, quality, undefined /*spell type*/, options);
|
||||
}
|
||||
//WONDROUS ITEMS
|
||||
else if(itemType == TYPES.WONDROUS_ITEMS) {
|
||||
//Select the item source based on the quality and item type
|
||||
source = selectSource(sources, quality, itemType, options);
|
||||
item = _.clone(chance.pick(source.data[itemType].data[quality]));
|
||||
item.source = source.shortName;
|
||||
if(options.allIntelligent || (!options.disableIntelligent && chance.d100() == 1)) {
|
||||
item.intelligence = 'WOOHOO I AM INTELLIGENT!';
|
||||
}
|
||||
}
|
||||
//EVERYTHING ELSE
|
||||
else {
|
||||
//Select the item source based on the quality and item type
|
||||
source = selectSource(sources, quality, itemType, options);
|
||||
var totalWeights = _.sum(_.map(source.data[itemType].data, function(item) { return item.weight[quality]; }));
|
||||
var roll = chance.integer({min: 1, max: totalWeights});
|
||||
|
||||
//EXCEPTIONS FOR ARMOR_AND_SHEILDS
|
||||
|
||||
//EXCEPTIONS FOR WEAPONS
|
||||
|
||||
//EXCEPTIONS FOR POTIONS
|
||||
|
||||
//EXCEPTIONS FOR WANDS
|
||||
|
||||
//CHANCE FOR INTELLIGENT WEAPONS, RINGS, RODS, STAVES, OR WONDROUS ITEMS
|
||||
var itemData = source.data[itemType].data;
|
||||
for(var i in itemData) { //check all 'itemType' items in the source
|
||||
if(roll <= itemData[i].weight[quality]) { //if we roll under their weighted probability
|
||||
item = _.clone(itemData[i]);
|
||||
delete item.weight;
|
||||
item.source = source.shortName;
|
||||
break;
|
||||
}
|
||||
else { //decrease the roll value by the current item's weighted probability
|
||||
roll -= itemData[i].weight[quality];
|
||||
}
|
||||
}
|
||||
}
|
||||
item.quality = quality;
|
||||
return item;
|
||||
};
|
||||
|
||||
Grimoire.getSpells = function(sources, level, count, type, options) {
|
||||
options = options ? options : {};
|
||||
|
||||
var spells = [];
|
||||
options.chance = (options.chance ? options.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
|
||||
_.times(count, function() {
|
||||
|
||||
spells.push(Grimoire.getSpell(sources, level, type, options));
|
||||
});
|
||||
|
||||
return spells;
|
||||
};
|
||||
|
||||
Grimoire.getSpell = function(sources, level, type, options) {
|
||||
options = options ? options : {};
|
||||
|
||||
//initialize the chance engine, using a seed if provided (for testing purposes)
|
||||
var chance = (options.chance ? options.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
|
||||
var spellType = type ? type : chance.pick(_.values(SPELL_TYPES));
|
||||
options.spellType = spellType;
|
||||
options.spellLevel = level;
|
||||
var source = selectSource(sources, undefined, TYPES.SPELLS, options);
|
||||
//console.log('Generating a level ' + level + ' ' + spellType + ' spell from ' + source.shortName);
|
||||
|
||||
var spell = {
|
||||
name: chance.pick(source.data.Spells.data[spellType][level]),
|
||||
level: level,
|
||||
type: spellType,
|
||||
source: source.shortName
|
||||
//chance.weighted will DESTRUCTIVELY modify paramaters that have a weight of zero
|
||||
//in this case, that means sources that do not contain the selected type
|
||||
//or sources that have types we want but with no weight
|
||||
//because of that, I create a temp array that I don't care if chance mangles
|
||||
source = sources[chance.weighted(_.range(sources.length), sourceWeights)];
|
||||
return source;
|
||||
};
|
||||
|
||||
return spell;
|
||||
};
|
||||
|
||||
Grimoire.getScroll = function(sources, quality, type, options) {
|
||||
options = options ? options : {};
|
||||
var chance = (options.chance ? options.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
this.getItem = function(sources, quality, types, options) {
|
||||
options = options ? options : {};
|
||||
|
||||
var cost = [12.5, 25, 150, 375, 700, 1125, 1650, 2275, 3000, 3825];
|
||||
var spellLevel = 0;
|
||||
var chance = (self.chance ? self.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
|
||||
var roll = chance.integer({min: 1, max: 100});
|
||||
if(quality == QUALITIES.MINOR) {
|
||||
switch(true) {
|
||||
case (roll <= 5): spellLevel = 0; break;
|
||||
case (roll <= 50): spellLevel = 1; break;
|
||||
case (roll <= 95): spellLevel = 2; break;
|
||||
case (roll <= 100): spellLevel = 3; break;
|
||||
var itemType = '';
|
||||
if(types.length == 1) {
|
||||
itemType = types[0];
|
||||
}
|
||||
}
|
||||
else if(quality == QUALITIES.MEDIUM) {
|
||||
switch(true) {
|
||||
case (roll <= 5): spellLevel = 2; break;
|
||||
case (roll <= 65): spellLevel = 3; break;
|
||||
case (roll <= 95): spellLevel = 4; break;
|
||||
case (roll <= 100): spellLevel = 5; break;
|
||||
else {
|
||||
//Create a weighted-average map based on the desired types
|
||||
var localWeights = _.clone(WEIGHTS[quality]); //copy the default weighted-average for this quality
|
||||
for(var key in localWeights) {
|
||||
if(_.values(types).indexOf(TYPES[key]) == -1) { //remove any items that were not selected
|
||||
delete localWeights[key];
|
||||
}
|
||||
}
|
||||
//Determine the type of item to generate
|
||||
//console.log(localWeights);
|
||||
itemType = TYPES[chance.weighted(_.keys(localWeights), _.values(localWeights))];
|
||||
}
|
||||
}
|
||||
else if(quality == QUALITIES.MAJOR) {
|
||||
switch(true) {
|
||||
case (roll <= 5): spellLevel = 4; break;
|
||||
case (roll <= 50): spellLevel = 5; break;
|
||||
case (roll <= 70): spellLevel = 6; break;
|
||||
case (roll <= 85): spellLevel = 7; break;
|
||||
case (roll <= 95): spellLevel = 8; break;
|
||||
case (roll <= 100): spellLevel = 9; break;
|
||||
|
||||
var item = {};
|
||||
var source = {};
|
||||
|
||||
//GENERATE ITEM
|
||||
//SCROLLS
|
||||
if(itemType == TYPES.SCROLLS) {
|
||||
item = self.getScroll(sources, quality, undefined /*spell type*/, options);
|
||||
}
|
||||
}
|
||||
else if(itemType == TYPES.POTIONS) {
|
||||
item = self.getPotion(sources, quality, undefined /*potion level*/, options);
|
||||
}
|
||||
else if(itemType == TYPES.WANDS) {
|
||||
item = self.getWand(sources, quality, undefined /*spell level*/, options);
|
||||
}
|
||||
//WONDROUS ITEMS
|
||||
else if(itemType == TYPES.WONDROUS_ITEMS) {
|
||||
//Select the item source based on the quality and item type
|
||||
source = selectSource(sources, quality, itemType, options);
|
||||
item = _.clone(chance.pick(source.data[itemType].data[quality]));
|
||||
item.source = source.shortName;
|
||||
if(options.allIntelligent || (!options.disableIntelligent && chance.d100() == 1)) {
|
||||
item.intelligence = 'WOOHOO I AM INTELLIGENT!';
|
||||
}
|
||||
}
|
||||
//EVERYTHING ELSE
|
||||
else {
|
||||
//Select the item source based on the quality and item type
|
||||
source = selectSource(sources, quality, itemType, options);
|
||||
var totalWeights = _.sum(_.map(source.data[itemType].data, function(item) { return item.weight[quality]; }));
|
||||
var roll = chance.integer({min: 1, max: totalWeights});
|
||||
|
||||
var spell = Grimoire.getSpell(sources, spellLevel, type, options);
|
||||
//EXCEPTIONS FOR ARMOR_AND_SHEILDS
|
||||
|
||||
return {
|
||||
'name': 'Scroll of ' + spell.name,
|
||||
'description': '(' + spell.type + ', spell level ' + spellLevel + ', caster level ' + _.max([1, (spellLevel*2-1)]) + ')',
|
||||
'cost': cost[spellLevel],
|
||||
'source': spell.source
|
||||
//EXCEPTIONS FOR WEAPONS
|
||||
|
||||
//EXCEPTIONS FOR POTIONS
|
||||
|
||||
//EXCEPTIONS FOR WANDS
|
||||
|
||||
//CHANCE FOR INTELLIGENT WEAPONS, RINGS, RODS, STAVES, OR WONDROUS ITEMS
|
||||
var itemData = source.data[itemType].data;
|
||||
for(var i in itemData) { //check all 'itemType' items in the source
|
||||
if(roll <= itemData[i].weight[quality]) { //if we roll under their weighted probability
|
||||
item = _.clone(itemData[i]);
|
||||
delete item.weight;
|
||||
item.source = source.shortName;
|
||||
break;
|
||||
}
|
||||
else { //decrease the roll value by the current item's weighted probability
|
||||
roll -= itemData[i].weight[quality];
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!options.disableClue && chance.d100() > 80) {
|
||||
item.name += ' with a clue to it\'s purpose!';
|
||||
}
|
||||
item.quality = quality;
|
||||
return item;
|
||||
};
|
||||
|
||||
this.getSpells = function(sources, level, count, type, options) {
|
||||
options = options ? options : {};
|
||||
|
||||
var spells = [];
|
||||
self.chance = (self.chance ? self.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
|
||||
_.times(count, function() {
|
||||
|
||||
spells.push(Grimoire.getSpell(sources, level, type, options));
|
||||
});
|
||||
|
||||
return spells;
|
||||
};
|
||||
|
||||
this.getSpell = function(sources, level, type, options) {
|
||||
options = options ? options : {};
|
||||
|
||||
//initialize the chance engine, using a seed if provided (for testing purposes)
|
||||
var chance = (self.chance ? self.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
|
||||
var spellType = type ? type : chance.pick(_.values(SPELL_TYPES));
|
||||
options.spellType = spellType;
|
||||
options.spellLevel = level;
|
||||
var source = selectSource(sources, options.quality, TYPES.SPELLS, options);
|
||||
//console.log('Generating a level ' + level + ' ' + spellType + ' spell from ' + source.shortName);
|
||||
|
||||
var spell = {
|
||||
name: chance.pick(source.data.Spells.data[spellType][level]),
|
||||
level: level,
|
||||
type: spellType,
|
||||
source: source.shortName
|
||||
};
|
||||
|
||||
return spell;
|
||||
};
|
||||
|
||||
this.getScroll = function(sources, quality, type, options) {
|
||||
options = options ? options : {};
|
||||
var chance = (self.chance ? self.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
|
||||
var cost = [12.5, 25, 150, 375, 700, 1125, 1650, 2275, 3000, 3825];
|
||||
var spellLevel = 0;
|
||||
|
||||
var roll = chance.integer({min: 1, max: 100});
|
||||
if(quality == QUALITIES.MINOR) {
|
||||
switch(true) {
|
||||
case (roll <= 5): spellLevel = 0; break;
|
||||
case (roll <= 50): spellLevel = 1; break;
|
||||
case (roll <= 95): spellLevel = 2; break;
|
||||
case (roll <= 100): spellLevel = 3; break;
|
||||
}
|
||||
}
|
||||
else if(quality == QUALITIES.MEDIUM) {
|
||||
switch(true) {
|
||||
case (roll <= 5): spellLevel = 2; break;
|
||||
case (roll <= 65): spellLevel = 3; break;
|
||||
case (roll <= 95): spellLevel = 4; break;
|
||||
case (roll <= 100): spellLevel = 5; break;
|
||||
}
|
||||
}
|
||||
else if(quality == QUALITIES.MAJOR) {
|
||||
switch(true) {
|
||||
case (roll <= 5): spellLevel = 4; break;
|
||||
case (roll <= 50): spellLevel = 5; break;
|
||||
case (roll <= 70): spellLevel = 6; break;
|
||||
case (roll <= 85): spellLevel = 7; break;
|
||||
case (roll <= 95): spellLevel = 8; break;
|
||||
case (roll <= 100): spellLevel = 9; break;
|
||||
}
|
||||
}
|
||||
|
||||
options.quality = quality;
|
||||
var spell = self.getSpell(sources, spellLevel, type, options);
|
||||
|
||||
return {
|
||||
'name': 'Scroll of ' + spell.name,
|
||||
'description': '(' + spell.type + ', spell level ' + spellLevel + ', caster level ' + _.max([1, (spellLevel*2-1)]) + ')',
|
||||
'cost': cost[spellLevel],
|
||||
'source': spell.source
|
||||
};
|
||||
};
|
||||
|
||||
this.getPotion = function(sources, quality, level, options) {
|
||||
options = options ? options : {};
|
||||
var chance = (self.chance ? self.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
var cost = [25, 50, 300, 750];
|
||||
|
||||
if(!level || level < 0 || level > 4) {
|
||||
var roll = chance.d100();
|
||||
if(quality == QUALITIES.MINOR) {
|
||||
switch(true) {
|
||||
case (roll <= 20): level = 0; break;
|
||||
case (roll <= 60): level = 1; break;
|
||||
case (roll <= 100): level = 2; break;
|
||||
}
|
||||
}
|
||||
else if(quality == QUALITIES.MEDIUM) {
|
||||
switch(true) {
|
||||
case (roll <= 20): level = 1; break;
|
||||
case (roll <= 60): level = 2; break;
|
||||
case (roll <= 100): level = 3; break;
|
||||
}
|
||||
}
|
||||
else if(quality == QUALITIES.MAJOR) {
|
||||
switch(true) {
|
||||
case (roll <= 20): level = 2; break;
|
||||
case (roll <= 100): level = 3; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
options.typeOverride = TYPES.POTIONS;
|
||||
options.potionLevel = level;
|
||||
var source = selectSource(sources, quality, TYPES.POTIONS, options);
|
||||
|
||||
return {
|
||||
'name': 'Potion/Oil of ' + chance.pick(source.data[TYPES.POTIONS].data[level]),
|
||||
'description': '(spell level ' + level + ', caster level ' + _.max([1, (level*2-1)]) + ')',
|
||||
'cost': cost[level],
|
||||
'source': source.shortName
|
||||
};
|
||||
};
|
||||
|
||||
this.getWand = function(sources, quality, level, options) {
|
||||
options = options ? options : {};
|
||||
var chance = (self.chance ? self.chance : options.seed ? new Chance(options.seed) : new Chance());
|
||||
var cost = [375, 750, 4500, 11250, 21000];
|
||||
|
||||
|
||||
if(!level || level < 0 || level > 4) {
|
||||
var roll = chance.d100();
|
||||
if(quality == QUALITIES.MINOR) {
|
||||
switch(true) {
|
||||
case (roll <= 5): level = 0; break;
|
||||
case (roll <= 60): level = 1; break;
|
||||
case (roll <= 100): level = 2; break;
|
||||
}
|
||||
}
|
||||
else if(quality == QUALITIES.MEDIUM) {
|
||||
switch(true) {
|
||||
case (roll <= 60): level = 2; break;
|
||||
case (roll <= 100): level = 3; break;
|
||||
}
|
||||
}
|
||||
else if(quality == QUALITIES.MAJOR) {
|
||||
switch(true) {
|
||||
case (roll <= 60): level = 3; break;
|
||||
case (roll <= 100): level = 4; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
options.quality = quality;
|
||||
options.typeOverride = TYPES.WANDS;
|
||||
var spell = self.getSpell(sources, level, SPELL_TYPES.ARCANE, options);
|
||||
return {'name': 'Wand of ' + spell.name,
|
||||
'description': '(spell level ' + level + ', caster level ' + _.max([1, (level*2-1)]) + ', 50 charges)',
|
||||
'cost': cost[level],
|
||||
'source': spell.source
|
||||
};
|
||||
};
|
||||
};
|
||||
-417
@@ -1,417 +0,0 @@
|
||||
Table: Random Magic Item Generation
|
||||
Minor Medium Major Item
|
||||
01–04 01–10 01–10 Armor and shields
|
||||
05–09 11–20 11–20 Weapons
|
||||
10–44 21–30 21–25 Potions
|
||||
45–46 31–40 26–35 Rings
|
||||
— 41–50 36–45 Rods
|
||||
47–81 51–65 46–55 Scrolls
|
||||
— 66–68 56–75 Staves
|
||||
82–91 69–83 76–80 Wands
|
||||
92–100 84–100 81–100 Wondrous items
|
||||
|
||||
|
||||
|
||||
Table: Armor and Shields
|
||||
Minor Medium Major Item Base Price
|
||||
01–60 01–05 — +1 shield 1,000 gp
|
||||
61–80 06–10 — +1 armor 1,000 gp
|
||||
81–85 11–20 — +2 shield 4,000 gp
|
||||
86–87 21–30 — +2 armor 4,000 gp
|
||||
— 31–40 01–08 +3 shield 9,000 gp
|
||||
— 41–50 09–16 +3 armor 9,000 gp
|
||||
— 51–55 17–27 +4 shield 16,000 gp
|
||||
— 56–57 28–38 +4 armor 16,000 gp
|
||||
— — 39–49 +5 shield 25,000 gp
|
||||
— — 50–57 +5 armor 25,000 gp
|
||||
— — — +6 armor/shield1 36,000 gp
|
||||
— — — +7 armor/shield1 49,000 gp
|
||||
— — — +8 armor/shield1 64,000 gp
|
||||
— — — +9 armor/shield1 81,000 gp
|
||||
— — — +10 armor/shield1 100,000 gp
|
||||
88–89 58–60 58–60 Specific armor2 —
|
||||
90–91 61–63 61–63 Specific shield3 —
|
||||
92–100 64–100 64–100 Special ability and roll again2,3 —
|
||||
|
||||
1 Armor and shields can't have enhancement bonuses higher than +5. Use these lines to determine price when special abilities are added in.
|
||||
2 Roll on Table: Specific Armors.
|
||||
3 Roll on Table: Specific Shields.
|
||||
|
||||
|
||||
Table: Armor Special Abilities
|
||||
Minor Medium Major Special Ability Base Price Modifier
|
||||
01–25 01–05 01–03 Glamered +2,700 gp
|
||||
26–32 06–08 04 Fortification, light +1 bonus1
|
||||
33–52 09–11 — Slick +3,750 gp
|
||||
53–92 12–17 — Shadow +3,750 gp
|
||||
93–96 18–19 — Spell resistance (13) +2 bonus1
|
||||
97 20–29 05–07 Slick, improved +15,000 gp
|
||||
98–99 30–49 08–13 Shadow, improved +15,000 gp
|
||||
— 50–74 14–28 Energy resistance +18,000 gp
|
||||
— 75–79 29–33 Ghost touch +3 bonus1
|
||||
— 80–84 34–35 Invulnerability +3 bonus1
|
||||
— 85–89 36–40 Fortification, moderate +3 bonus1
|
||||
— 90–94 41–42 Spell resistance (15) +3 bonus1
|
||||
— 95–99 43 Wild +3 bonus1
|
||||
— — 44–48 Slick, greater +33,750 gp
|
||||
— — 49–58 Shadow, greater +33,750 gp
|
||||
— — 59–83 Energy resistance, improved +42,000 gp
|
||||
— — 84–88 Spell resistance (17) +4 bonus1
|
||||
— — 89 Etherealness +49,000 gp
|
||||
— — 90 Undead controlling +49,000 gp
|
||||
— — 91–92 Fortification, heavy +5 bonus1
|
||||
— — 93–94 Spell resistance (19) +5 bonus1
|
||||
— — 95–99 Energy resistance, greater +66,000 gp
|
||||
100 100 100 Roll twice again2 —
|
||||
1 Add to enhancement bonus on Table: Armor and Shields to determine total market price
|
||||
2 If you roll a special ability twice, only one counts. If you roll two versions of the same special ability, use the better.
|
||||
|
||||
Table: Shield Special Abilities
|
||||
Minor Medium Major Special Ability Base Price Modifier
|
||||
01–20 01–10 01–05 Arrow catching +1 bonus1
|
||||
21–40 11–20 06–08 Bashing +1 bonus1
|
||||
41–50 21–25 09–10 Blinding +1 bonus1
|
||||
51–75 26–40 11–15 Fortification, light +1 bonus1
|
||||
76–92 41–50 16–20 Arrow deflection +2 bonus1
|
||||
93–97 51–57 21–25 Animated +2 bonus1
|
||||
98–99 58–59 — Spell resistance (13) +2 bonus1
|
||||
— 60–79 26–41 Energy resistance +18,000 gp
|
||||
— 80–85 42–46 Ghost touch +3 bonus1
|
||||
— 86–95 47–56 Fortification, moderate +3 bonus1
|
||||
— 96–98 57–58 Spell resistance (15) +3 bonus1
|
||||
— 99 59 Wild +3 bonus1
|
||||
— — 60–84 Energy resistance, improved +42,000 gp
|
||||
— — 85–86 Spell resistance (17) +4 bonus1
|
||||
— — 87 Undead controlling +49,000 gp
|
||||
— — 88–91 Fortification, heavy +5 bonus1
|
||||
— — 92–93 Reflecting +5 bonus1
|
||||
— — 94 Spell resistance (19) +5 bonus1
|
||||
— — 95–99 Energy resistance, greater +66,000 gp
|
||||
100 100 100 Roll twice again2 —
|
||||
1 Add to enhancement bonus on Table: Armor and Shields to determine total market price
|
||||
2 If you roll a special ability twice, only one counts. If you roll two versions of the same special ability, use the better.
|
||||
|
||||
|
||||
|
||||
|
||||
Table: Weapons
|
||||
Minor Medium Major Weapon Bonus Base Price1
|
||||
01–70 01–10 — +1 2,000 gp
|
||||
71–85 11–29 — +2 8,000 gp
|
||||
— 30–58 01–20 +3 18,000 gp
|
||||
— 59–62 21–38 +4 32,000 gp
|
||||
— — 39–49 +5 50,000 gp
|
||||
— — — +62 72,000 gp
|
||||
— — — +72 98,000 gp
|
||||
— — — +82 128,000 gp
|
||||
— — — +92 162,000 gp
|
||||
— — — +102 200,000 gp
|
||||
86–90 63–68 50–63 Specific weapon3 —
|
||||
91–100 69–100 64–100 Special ability and roll again4 —
|
||||
1 For ammunition, this price is for 50 arrows, bolts, or bullets.
|
||||
2 A weapon can't have an enhancement bonus higher than +5. Use these lines to determine price when special abilities are added in.
|
||||
3 See Table: Specific Weapons.
|
||||
4 See Table: Melee Weapon Special Abilities for melee weapons and Table: Ranged Weapon Special Abilities for ranged weapons.
|
||||
Table: Melee Weapon Special Abilities
|
||||
Minor Medium Major Special Ability Base Price Modifier1
|
||||
01–10 01–06 01–03 Bane +1 bonus
|
||||
11–17 07–12 — Defending +1 bonus
|
||||
18–27 13–19 04–06 Flaming +1 bonus
|
||||
28–37 20–26 07–09 Frost +1 bonus
|
||||
38–47 27–33 10–12 Shock +1 bonus
|
||||
48–56 34–38 13–15 Ghost touch +1 bonus
|
||||
57–67 39–44 — Keen2 +1 bonus
|
||||
68–71 45–48 16–19 Ki Focus +1 bonus
|
||||
72–75 49–50 — Merciful +1 bonus
|
||||
76–82 51–54 20–21 Mighty cleaving +1 bonus
|
||||
83–87 55–59 22–24 Spell storing +1 bonus
|
||||
88–91 60–63 25–28 Throwing +1 bonus
|
||||
92–95 64–65 29–32 Thundering +1 bonus
|
||||
96–99 66–69 33–36 Vicious +1 bonus
|
||||
— 70–72 37–41 Anarchic +2 bonus
|
||||
— 73–75 42–46 Axiomatic +2 bonus
|
||||
— 76–78 47–49 Disruption3 +2 bonus
|
||||
— 79–81 50–54 Flaming burst +2 bonus
|
||||
— 82–84 55–59 Icy burst +2 bonus
|
||||
— 85–87 60–64 Holy +2 bonus
|
||||
— 88–90 65–69 Shocking burst +2 bonus
|
||||
— 91–93 70–74 Unholy +2 bonus
|
||||
— 94–95 75–78 Wounding +2 bonus
|
||||
— — 79–83 Speed +3 bonus
|
||||
— — 84–86 Brilliant energy +4 bonus
|
||||
— — 87–88 Dancing +4 bonus
|
||||
— — 89–90 Vorpal2 +5 bonus
|
||||
100 96–100 91–100 Roll again twice4 —
|
||||
1 Add to enhancement bonus on Table: Weapons to determine total market price.
|
||||
2 Piercing or slashing weapons only (slashing only for vorpal). Reroll if randomly generated for a bludgeoning weapon.
|
||||
3 Bludgeoning weapons only. Reroll if randomly generated for a piercing or slashing weapon.
|
||||
4 Reroll if you get a duplicate special ability, an ability incompatible with an ability that you've already rolled, or if the extra ability puts you over the +10 limit. A weapon's enhancement bonus and special ability bonus equivalents can't total more than +10.
|
||||
Table: Ranged Weapon Special Abilities
|
||||
Minor Medium Major Special Ability Base Price Modifier1
|
||||
01–12 01–08 01–04 Bane2 +1 bonus
|
||||
13–25 09–16 05–08 Distance +1 bonus
|
||||
26–40 17–28 09–12 Flaming2 +1 bonus
|
||||
41–55 29–40 13–16 Frost2 +1 bonus
|
||||
56–60 41–42 — Merciful2 +1 bonus
|
||||
61–68 43–47 17–21 Returning +1 bonus
|
||||
69–83 48–59 22–25 Shock2 +1 bonus
|
||||
84–93 60–64 26–27 Seeking +1 bonus
|
||||
94–99 65–68 28–29 Thundering2 +1 bonus
|
||||
— 69–71 30–34 Anarchic2 +2 bonus
|
||||
— 72–74 35–39 Axiomatic2 +2 bonus
|
||||
— 75–79 40–49 Flaming burst2 +2 bonus
|
||||
— 80–82 50–54 Holy2 +2 bonus
|
||||
— 83–87 55–64 Icy burst2 +2 bonus
|
||||
— 88–92 65–74 Shocking burst2 +2 bonus
|
||||
— 93–95 75–79 Unholy2 +2 bonus
|
||||
— — 80–84 Speed +3 bonus
|
||||
— — 85–90 Brilliant energy +4 bonus
|
||||
100 96–100 91–100 Roll again twice2 —
|
||||
1 Add to enhancement bonus on Table: Weapons to determine total market price.
|
||||
2 Bows, crossbows, and slings crafted with this ability bestow this power upon their ammunition.
|
||||
3 Reroll if you get a duplicate special ability, an ability incompatible with an ability that you've already rolled, or if the extra ability puts you over the +10 limit. A weapon's enhancement bonus and special ability bonus equivalents can't total more than +10.
|
||||
|
||||
Table: Specific Weapons
|
||||
Minor Medium Major Specific Weapon Market Price
|
||||
01–15 — — Sleep arrow 132 gp
|
||||
16–25 — — Screaming bolt 267 gp
|
||||
26–45 — — Silver dagger, masterwork 322 gp
|
||||
46–65 — — Cold iron longsword, masterwork 330 gp
|
||||
66–75 01–09 — Javelin of lightning 1,500 gp
|
||||
76–80 10–15 — Slaying arrow 2,282 gp
|
||||
81–90 16–24 — Adamantine dagger 3,002 gp
|
||||
91–100 25–33 — Adamantine battleaxe 3,010 gp
|
||||
— 34–37 — Slaying arrow (greater) 4,057 gp
|
||||
— 38–40 — Shatterspike 4,315 gp
|
||||
— 41–46 — Dagger of venom 8,302 gp
|
||||
— 47–51 — Trident of warning 10,115 gp
|
||||
— 52–57 01–04 Assassin's dagger 10,302 gp
|
||||
— 58–62 05–07 Shifter's sorrow 12,780 gp
|
||||
— 63–66 08–09 Trident of fish command 18,650 gp
|
||||
— 67–74 10–13 Flame tongue 20,715 gp
|
||||
— 75–79 14–17 Luck blade (0 wishes) 22,060 gp
|
||||
— 80–86 18–24 Sword of subtlety 22,310 gp
|
||||
— 87–91 25–31 Sword of the planes 22,315 gp
|
||||
— 92–95 32–37 Nine lives stealer 23,057 gp
|
||||
— 96–98 38–42 Oathbow 25,600 gp
|
||||
— 99–100 43–46 Sword of life stealing 25,715 gp
|
||||
— — 47–51 Mace of terror 38,552 gp
|
||||
— — 52–57 Life-drinker 40,320 gp
|
||||
— — 58–62 Sylvan scimitar 47,315 gp
|
||||
— — 63–67 Rapier of puncturing 50,320 gp
|
||||
— — 68–73 Sun blade 50,335 gp
|
||||
— — 74–79 Frost brand 54,475 gp
|
||||
— — 80–84 Dwarven thrower 60,312 gp
|
||||
— — 85–91 Luck blade (1 wish) 62,360 gp
|
||||
— — 92–95 Mace of smiting 75,312 gp
|
||||
— — 96–97 Luck blade (2 wishes) 102,660 gp
|
||||
— — 98–99 Holy avenger 120,630 gp
|
||||
— — 100 Luck blade (3 wishes) 142,960 gp
|
||||
|
||||
|
||||
Table: Potions
|
||||
Minor Medium Major Spell Level Caster Level
|
||||
01–20 — — 0 1st
|
||||
21–60 01–20 — 1st 1st
|
||||
61–100 21–60 01–20 2nd 3rd
|
||||
— 61–100 21–100 3rd 5th
|
||||
|
||||
Potion Costs
|
||||
Spell Level Cleric, Druid, Wizard Sorcerer Bard Paladin, Ranger
|
||||
0 25 gp 25 gp 25 gp —
|
||||
1st 50 gp 50 gp 50 gp 50 gp
|
||||
2nd 300 gp 400 gp 400 gp 400 gp
|
||||
3rd 750 gp 900 gp 1,050 gp 1,050 gp
|
||||
|
||||
|
||||
Table: Scrolls
|
||||
Minor Medium Major Spell Level Caster Level
|
||||
01–05 — — 0 1st
|
||||
06–50 — — 1st 1st
|
||||
51–95 01–05 — 2nd 3rd
|
||||
96–100 06–65 — 3rd 5th
|
||||
— 66–95 01–05 4th 7th
|
||||
— 96–100 06–50 5th 9th
|
||||
— — 51–70 6th 11th
|
||||
— — 71–85 7th 13th
|
||||
— — 86–95 8th 15th
|
||||
— — 96–100 9th 17th
|
||||
Scroll Costs
|
||||
Spell Level Cleric, Druid, Wizard Sorcerer Bard Paladin, Ranger
|
||||
0 12.5 gp 12.5 gp 12.5 gp —
|
||||
1st 25 gp 25 gp 25 gp 25 gp
|
||||
2nd 150 gp 200 gp 200 gp 200 gp
|
||||
3rd 375 gp 450 gp 525 gp 525 gp
|
||||
4th 700 gp 800 gp 1,000 gp 1,000 gp
|
||||
5th 1,125 gp 1,250 gp 1,625 gp —
|
||||
6th 1,650 gp 1,800 gp 2,400 gp —
|
||||
7th 2,275 gp 2,450 gp — —
|
||||
8th 3,000 gp 3,200 gp — —
|
||||
9th 3,825 gp 4,050 gp — —
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Table: Wands
|
||||
Minor Medium Major Spell Level Caster Level
|
||||
01–05 — — 0 1st
|
||||
06–60 — — 1st 1st
|
||||
61–100 01–60 — 2nd 3rd
|
||||
— 61–100 01–60 3rd 5th
|
||||
— — 61–100 4th 7th
|
||||
A wand is a thin baton that contains a single spell of 4th level or lower. A wand has 50 charges when created—each charge allows the use of the wand's spell one time. A wand that runs out of charges is just a stick. The price of a wand is equal to the level of the spell × the creator's caster level × 750 gp. If the wand has a material component cost, it is added to the base price and cost to create once for each charge (50 × material component cost). Table: Wands gives sample prices for wands created at the lowest possible caster level for each spellcasting class. Note that some spells appear at different levels for different casters. The level of such spells depends on the caster crafting the wand.
|
||||
|
||||
Wand Costs
|
||||
Spell Level Cleric, Druid, Wizard Sorcerer Bard Paladin, Ranger
|
||||
0 375 gp 375 gp 375 gp —
|
||||
1st 750 gp 750 gp 750 gp 750 gp
|
||||
2nd 4,500 gp 6,000 gp 6,000 gp 6,000 gp
|
||||
3rd 11,250 gp 13,500 gp 15,750 gp 15,750 gp
|
||||
4th 21,000 gp 24,000 gp 30,000 gp 30,000 gp
|
||||
|
||||
|
||||
|
||||
|
||||
Table: Weapons
|
||||
Simple Weapons Cost Dmg (S) Dmg (M) Critical Range Weight1 Type2 Special
|
||||
Unarmed Attacks
|
||||
Gauntlet 2 gp 1d2 1d3 ×2 — 1 lb. B —
|
||||
Unarmed strike — 1d2 1d3 ×2 — — B nonlethal
|
||||
Light Melee Weapons
|
||||
Dagger 2 gp 1d3 1d4 19–20/×2 10 ft. 1 lb. P or S —
|
||||
Dagger, punching 2 gp 1d3 1d4 ×3 — 1 lb. P —
|
||||
Gauntlet, spiked 5 gp 1d3 1d4 ×2 — 1 lb. P —
|
||||
Mace, light 5 gp 1d4 1d6 ×2 — 4 lbs. B —
|
||||
Sickle 6 gp 1d4 1d6 ×2 — 2 lbs. S trip
|
||||
One-Handed Melee Weapons
|
||||
Club — 1d4 1d6 ×2 10 ft. 3 lbs. B —
|
||||
Mace, heavy 12 gp 1d6 1d8 ×2 — 8 lbs. B —
|
||||
Morningstar 8 gp 1d6 1d8 ×2 — 6 lbs. B and P —
|
||||
Shortspear 1 gp 1d4 1d6 ×2 20 ft. 3 lbs. P —
|
||||
Two-Handed Melee Weapons
|
||||
Longspear 5 gp 1d6 1d8 ×3 — 9 lbs. P brace, reach
|
||||
Quarterstaff — 1d4/1d4 1d6/1d6 ×2 — 4 lbs. B double, monk
|
||||
Spear 2 gp 1d6 1d8 ×3 20 ft. 6 lbs. P brace
|
||||
Ranged Weapons
|
||||
Blowgun 2 gp 1 1d2 ×2 20 ft. 1 lb. P —
|
||||
Darts, blowgun (10) 5 sp — — — — — — —
|
||||
Crossbow, heavy 50 gp 1d8 1d10 19–20/×2 120 ft. 8 lbs. P —
|
||||
Bolts, crossbow (10) 1 gp — — — — 1 lb. — —
|
||||
Crossbow, light 35 gp 1d6 1d8 19–20/×2 80 ft. 4 lbs. P —
|
||||
Bolts, crossbow (10) 1 gp — — — — 1 lb. — —
|
||||
Dart 5 sp 1d3 1d4 ×2 20 ft. 1/2 lb. P —
|
||||
Javelin 1 gp 1d4 1d6 ×2 30 ft. 2 lbs. P —
|
||||
Sling — 1d3 1d4 ×2 50 ft. — B —
|
||||
Bullets, sling (10) 1 sp — — — — 5 lbs. — —
|
||||
Martial Weapons Cost Dmg (S) Dmg (M) Critical Range Weight1 Type2 Special
|
||||
Light Melee Weapons
|
||||
Axe, throwing 8 gp 1d4 1d6 ×2 10 ft. 2 lbs. S —
|
||||
Hammer, light 1 gp 1d3 1d4 ×2 20 ft. 2 lbs. B —
|
||||
Handaxe 6 gp 1d4 1d6 ×3 — 3 lbs. S —
|
||||
Kukri 8 gp 1d3 1d4 18–20/×2 — 2 lbs. S —
|
||||
Pick, light 4 gp 1d3 1d4 ×4 — 3 lbs. P —
|
||||
Sap 1 gp 1d4 1d6 ×2 — 2 lbs. B nonlethal
|
||||
Shield, light special 1d2 1d3 ×2 — special B —
|
||||
Spiked armor special 1d4 1d6 ×2 — special P —
|
||||
Spiked shield, light special 1d3 1d4 ×2 — special P —
|
||||
Starknife 24 gp 1d3 1d4 ×3 20 ft. 3 lbs. P —
|
||||
Sword, short 10 gp 1d4 1d6 19–20/×2 — 2 lbs. P —
|
||||
One-Handed Melee Weapons
|
||||
Battleaxe 10 gp 1d6 1d8 ×3 — 6 lbs. S —
|
||||
Flail 8 gp 1d6 1d8 ×2 — 5 lbs. B disarm, trip
|
||||
Longsword 15 gp 1d6 1d8 19–20/×2 — 4 lbs. S —
|
||||
Pick, heavy 8 gp 1d4 1d6 ×4 — 6 lbs. P —
|
||||
Rapier 20 gp 1d4 1d6 18–20/×2 — 2 lbs. P —
|
||||
Scimitar 15 gp 1d4 1d6 18–20/×2 — 4 lbs. S —
|
||||
Shield, heavy special 1d3 1d4 ×2 — special B —
|
||||
Spiked shield, heavy special 1d4 1d6 ×2 — special P —
|
||||
Trident 15 gp 1d6 1d8 ×2 10 ft. 4 lbs. P brace
|
||||
Warhammer 12 gp 1d6 1d8 ×3 — 5 lbs. B —
|
||||
Two-Handed Melee Weapons
|
||||
Falchion 75 gp 1d6 2d4 18–20/×2 — 8 lbs. S —
|
||||
Glaive 8 gp 1d8 1d10 ×3 — 10 lbs. S reach
|
||||
Greataxe 20 gp 1d10 1d12 ×3 — 12 lbs. S —
|
||||
Greatclub 5 gp 1d8 1d10 ×2 — 8 lbs. B —
|
||||
Flail, heavy 15 gp 1d8 1d10 19–20/×2 — 10 lbs. B disarm, trip
|
||||
Greatsword 50 gp 1d10 2d6 19–20/×2 — 8 lbs. S —
|
||||
Guisarme 9 gp 1d6 2d4 ×3 — 12 lbs. S reach, trip
|
||||
Halberd 10 gp 1d8 1d10 ×3 — 12 lbs. P or S brace, trip
|
||||
Lance 10 gp 1d6 1d8 ×3 — 10 lbs. P reach
|
||||
Ranseur 10 gp 1d6 2d4 ×3 — 12 lbs. P disarm, reach
|
||||
Scythe 18 gp 1d6 2d4 ×4 — 10 lbs. P or S trip
|
||||
Ranged Weapons
|
||||
Longbow 75 gp 1d6 1d8 ×3 100 ft. 3 lbs. P —
|
||||
Arrows (20) 1 gp — — — — 3 lbs. — —
|
||||
Longbow, composite 100 gp 1d6 1d8 ×3 110 ft. 3 lbs. P —
|
||||
Arrows (20) 1 gp — — — — 3 lbs. — —
|
||||
Shortbow 30 gp 1d4 1d6 ×3 60 ft. 2 lbs. P —
|
||||
Arrows (20) 1 gp — — — — 3 lbs. — —
|
||||
Shortbow, composite 75 gp 1d4 1d6 ×3 70 ft. 2 lbs. P —
|
||||
Arrows (20) 1 gp — — — — 3 lbs. — —
|
||||
Exotic Weapons Cost Dmg (S) Dmg (M) Critical Range Weight1 Type2 Special
|
||||
Light Melee Weapons
|
||||
Kama 2 gp 1d4 1d6 ×2 — 2 lbs. S monk, trip
|
||||
Nunchaku 2 gp 1d4 1d6 ×2 — 2 lbs. B disarm, monk
|
||||
Sai 1 gp 1d3 1d4 ×2 — 1 lb. B disarm, monk
|
||||
Siangham 3 gp 1d4 1d6 ×2 — 1 lb. P monk
|
||||
One-Handed Melee Weapons
|
||||
Sword, bastard 35 gp 1d8 1d10 19–20/×2 — 6 lbs. S —
|
||||
Waraxe, dwarven 30 gp 1d8 1d10 ×3 — 8 lbs. S —
|
||||
Whip 1 gp 1d2 1d3 ×2 — 2 lbs. S disarm, nonlethal, reach, trip
|
||||
Two-Handed Melee Weapons
|
||||
Axe, orc double 60 gp 1d6/1d6 1d8/1d8 ×3 — 15 lbs. S double
|
||||
Chain, spiked 25 gp 1d6 2d4 ×2 — 10 lbs. P disarm, trip
|
||||
Curve blade, elven 80 gp 1d8 1d10 18–20/×2 — 7 lbs. S —
|
||||
Flail, dire 90 gp 1d6/1d6 1d8/1d8 ×2 — 10 lbs. B disarm, double, trip
|
||||
Hammer, gnome hooked 20 gp 1d6/1d4 1d8/1d6 ×3/×4 — 6 lbs. B or P double, trip
|
||||
Sword, two-bladed 100 gp 1d6/1d6 1d8/1d8 19–20/×2 — 10 lbs. S double
|
||||
Urgrosh, dwarven 50 gp 1d6/1d4 1d8/1d6 ×3 — 12 lbs. P or S brace, double
|
||||
Ranged Weapons
|
||||
Bolas 5 gp 1d3 1d4 ×2 10 ft. 2 lbs. B nonlethal, trip
|
||||
Crossbow, hand 100 gp 1d3 1d4 19–20/×2 30 ft. 2 lbs. P —
|
||||
Bolts (10) 1 gp — — — — 1 lb. — —
|
||||
Crossbow, repeating heavy 400 gp 1d8 1d10 19–20/×2 120 ft. 12 lbs. P —
|
||||
Bolts (5) 1 gp — — — — 1 lb. — —
|
||||
Crossbow, repeating light 250 gp 1d6 1d8 19–20/×2 80 ft. 6 lbs. P —
|
||||
Bolts (5) 1 gp — — — — 1 lb. — —
|
||||
Net 20 gp — — — 10 ft. 6 lbs. — —
|
||||
Shuriken (5) 1 gp 1 1d2 ×2 10 ft. 1/2 lb. P monk
|
||||
Sling staff, halfling 20 gp 1d6 1d8 ×3 80 ft. 3 lbs. B —
|
||||
Bullets, sling (10) 1 sp — — — — 5 lbs. — —
|
||||
1 Weight figures are for Medium weapons. A Small weapon weighs half as much, and a Large weapon weighs twice as much.
|
||||
2 A weapon with two types is both types if the entry specifies “and,” or either type (wielder's choice) if the entry specifies “or.”
|
||||
|
||||
Table: Armor and Shields
|
||||
Armor Cost Armor/Shield Bonus Maximum Dex Bonus Armor Check Penalty Arcane Spell Failure Chance Speed Weight1
|
||||
30 ft. 20 ft.
|
||||
Light armor
|
||||
Padded 5 gp +1 +8 0 5% 30 ft. 20 ft. 10 lbs.
|
||||
Leather 10 gp +2 +6 0 10% 30 ft. 20 ft. 15 lbs.
|
||||
Studded leather 25 gp +3 +5 –1 15% 30 ft. 20 ft. 20 lbs.
|
||||
Chain shirt 100 gp +4 +4 –2 20% 30 ft. 20 ft. 25 lbs.
|
||||
Medium armor
|
||||
Hide 15 gp +4 +4 –3 20% 20 ft. 15 ft. 25 lbs.
|
||||
Scale mail 50 gp +5 +3 –4 25% 20 ft. 15 ft. 30 lbs.
|
||||
Chainmail 150 gp +6 +2 –5 30% 20 ft. 15 ft. 40 lbs.
|
||||
Breastplate 200 gp +6 +3 –4 25% 20 ft. 15 ft. 30 lbs.
|
||||
Heavy armor
|
||||
Splint mail 200 gp +7 +0 –7 40% 20 ft.2 15 ft.2 45 lbs.
|
||||
Banded mail 250 gp +7 +1 –6 35% 20 ft.2 15 ft.2 35 lbs.
|
||||
Half-plate 600 gp +8 +0 –7 40% 20 ft.2 15 ft.2 50 lbs.
|
||||
Full plate 1,500 gp +9 +1 –6 35% 20 ft.2 15 ft.2 50 lbs.
|
||||
Shields
|
||||
Buckler 5 gp +1 — –1 5% — — 5 lbs.
|
||||
Shield, light wooden 3 gp +1 — –1 5% — — 5 lbs.
|
||||
Shield, light steel 9 gp +1 — –1 5% — — 6 lbs.
|
||||
Shield, heavy wooden 7 gp +2 — –2 15% — — 10 lbs.
|
||||
Shield, heavy steel 20 gp +2 — –2 15% — — 15 lbs.
|
||||
Shield, tower 30 gp +43 +2 –10 50% — — 45 lbs.
|
||||
Extras
|
||||
Armor spikes +50 gp — — — — — — +10 lbs.
|
||||
Gauntlet, locked 8 gp — — special n/a4 — — +5 lbs.
|
||||
Shield spikes +10 gp — — — — — — +5 lbs.
|
||||
1 Weight figures are for armor sized to fit Medium characters. Armor fitted for Small characters weighs half as much, and armor fitted for Large characters weighs twice as much.
|
||||
2 When running in heavy armor, you move only triple your speed, not quadruple.
|
||||
3 A tower shield can instead grant you cover. See the description.
|
||||
4 Hand not free to cast spells.
|
||||
+5
-4
@@ -2,9 +2,10 @@
|
||||
"name": "Advanced Player's Guide",
|
||||
"shortName": "APG",
|
||||
"types": [
|
||||
"Rings",
|
||||
"Rods",
|
||||
"Spells",
|
||||
"Wondrous Items"
|
||||
{"name": "Rings", "source": "APG/Rings.json"},
|
||||
{"name": "Rods", "source": "APG/Rods.json"},
|
||||
{"name": "Spells", "source": "APG/Spells.json"},
|
||||
{"name": "Wands"},
|
||||
{"name": "Wondrous Items", "source": "APG/Wondrous Items.json"}
|
||||
]
|
||||
}
|
||||
+6
-4
@@ -3,9 +3,11 @@
|
||||
"name": "Core Rule Book",
|
||||
"shortName": "CRB",
|
||||
"types": [
|
||||
"Rings",
|
||||
"Rods",
|
||||
"Spells",
|
||||
"Wondrous Items"
|
||||
{"name": "Potions", "source": "CRB/Potions.json"},
|
||||
{"name": "Rings", "source": "CRB/Rings.json"},
|
||||
{"name": "Rods", "source": "CRB/Rods.json"},
|
||||
{"name": "Spells", "source": "CRB/Spells.json"},
|
||||
{"name": "Wands"},
|
||||
{"name": "Wondrous Items", "source": "CRB/Wondrous Items.json"}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"_comment": "These are NOT all from CRB but this seemed like the best place to put them for now. I'll put them in other sources eventually",
|
||||
"_note": "Potions can appear as either potions or oils depending on the specific spell",
|
||||
"data": [
|
||||
["Bleed","Touch of Fatigue","Resistance","Stabilize","Guidance"],
|
||||
["Cure Light Wounds","Chill Touch","Doom","Endure Elements","Enlarge Person","Feather Fall","Hide from Animals",
|
||||
"Hide from Undead","Inflict Light Wounds","Jump","Mage Armor","Magic Fangs","Magic Weapon","Pass without Trace","Protection from Evil",
|
||||
"Reduce Person","Remove Fear","Sanctuary","Shield of Faith"],
|
||||
["Aid","Barkskin","Bear's Endurance","Blindness/Deafness","Blur","Bull's Strength","Cat's Grace","Cure Moderate Wounds",
|
||||
"Darkvision","Delay Poison","Eagle's Splendor","Fox's Cunning","Heroism","Hold Person","Inflict Moderate Wounds","Invisibility",
|
||||
"Owl's Wisdom","Protection From Arrows","Rage","Remove Paralysis","Resist Energy","Restoration, Lesser","Tongues","Touch of Idiocy",
|
||||
"Undetectable Alignment"],
|
||||
["Bestow Curse","Confusion","Contagion","Crushing Despair","Cure Serious Wounds","Deep Slumber","Dispel Magic","Displacement",
|
||||
"Gaseous Form","Good Hope","Haste","Inflict Serious Wounds","Keen Edge","Magic Circle against Evil","Magic Fang, Greater","Magic Weapon, Greater",
|
||||
"Magic Vestment","Neutralize Poison","Nondetection","Poison","Protection from Energy","Remove Blindness/Deafness","Remove Curse","Remove Disease",
|
||||
"Slow","Water Breathing","Water Walking"]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"data": {
|
||||
"lawful": {
|
||||
"good" : ["Erastil", "Iomedae", "Torag"],
|
||||
"neutral" : ["Abadar", "Irori"],
|
||||
"evil" : ["Asmodeus", "Zon-Kuthon"]
|
||||
},
|
||||
"neutral": {
|
||||
"good" : ["Sarenrae"],
|
||||
"neutral" : ["Gozreh", "Pharasma", "Nethys"],
|
||||
"evil" : ["Urgathoa", "Norgorber"]
|
||||
},
|
||||
"chaotic" : {
|
||||
"good" : ["Desna", "Cayden Cailean"],
|
||||
"neutral" : ["Gorum", "Calistria"],
|
||||
"evil" : ["Lamashtu", "Rovagug"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"data": ["acid", "cold", "electricity", "fire", "sonic"]
|
||||
}
|
||||
+3
-1
@@ -1,5 +1,7 @@
|
||||
{
|
||||
"name": "Ultimate Magic",
|
||||
"shortName": "UM",
|
||||
"types": ["Spells"]
|
||||
"types": [
|
||||
{"name": "Spells", "source": "UM/Spells.json"}
|
||||
]
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
Pathfinder magic item automatic roller
|
||||
To do:
|
||||
|
||||
* Input list of mundane armor and shield types (eh, maybe not)
|
||||
* Input list of mundane weapon types (eh, maybe not)
|
||||
* Input list of spells for potions, scrolls, and wands (1/2 DONE)
|
||||
|
||||
|
||||
|
||||
Project
|
||||
* Make generator for the following objects
|
||||
- Armor and shields (DONE!)
|
||||
- Weapons (DONE!)
|
||||
- Potions (DONE!)
|
||||
- Rings (DONE!)
|
||||
- Rods (DONE!)
|
||||
- Scrolls (DONE!)
|
||||
- Staves (DONE!)
|
||||
- Wands (DONE!)
|
||||
- Wondrous items (DONE!)
|
||||
* Roll to make each item (DONE!)
|
||||
|
||||
* Implement IRC bot part (later)
|
||||
@@ -1,517 +0,0 @@
|
||||
/*global _:false */
|
||||
/*global Intelligence:false */
|
||||
"use strict";
|
||||
var WondrousItems = {};
|
||||
WondrousItems.getAllItems = function() {
|
||||
return [
|
||||
{
|
||||
"name": "Core Rule Book",
|
||||
"shortName": "CRB",
|
||||
"baseUrl": "http://paizo.com/pathfinderRPG/prd/magicItems/wondrousItems.html",
|
||||
"minor" : [
|
||||
{ "name" : "Feather token, anchor", "cost" : 50, "url" : "#feather-token" },
|
||||
{ "name" : "Universal solvent", "cost" : 50, "url" : "" },
|
||||
{ "name" : "Elixir of love", "cost" : 150, "url" : "" },
|
||||
{ "name" : "Unguent of timelessness", "cost" : 150, "url" : "" },
|
||||
{ "name" : "Feather token, fan", "cost" : 200, "url" : "" },
|
||||
{ "name" : "Dust of tracelessness", "cost" : 250, "url" : "" },
|
||||
{ "name" : "Elixir of hiding", "cost" : 250, "url" : "" },
|
||||
{ "name" : "Elixir of tumbling", "cost" : 250, "url" : "" },
|
||||
{ "name" : "Elixir of swimming", "cost" : 250, "url" : "" },
|
||||
{ "name" : "Elixir of vision", "cost" : 250, "url" : "" },
|
||||
{ "name" : "Silversheen", "cost" : 250, "url" : "" },
|
||||
{ "name" : "Feather token, bird", "cost" : 300, "url" : "" },
|
||||
{ "name" : "Feather token, tree", "cost" : 400, "url" : "" },
|
||||
{ "name" : "Feather token, swan boat", "cost" : 450, "url" : "" },
|
||||
{ "name" : "Elixir of truth", "cost" : 500, "url" : "" },
|
||||
{ "name" : "Feather token, whip", "cost" : 500, "url" : "" },
|
||||
{ "name" : "Dust of dryness", "cost" : 850, "url" : "" },
|
||||
{ "name" : "Hand of the mage", "cost" : 900, "url" : "" },
|
||||
{ "name" : "Bracers of armor +1", "cost" : 1000, "url" : "" },
|
||||
{ "name" : "Cloak of resistance +1", "cost" : 1000, "url" : "" },
|
||||
{ "name" : "Pearl of power, 1st-level spell", "cost" : 1000,
|
||||
"url" : "" },
|
||||
{ "name" : "Phylactery of faithfulness", "cost" : 1000, "url" : "" },
|
||||
{ "name" : "Salve of slipperiness", "cost" : 1000, "url" : "" },
|
||||
{ "name" : "Elixir of fire breath", "cost" : 1100, "url" : "" },
|
||||
{ "name" : "Pipes of the sewers", "cost" : 1150, "url" : "" },
|
||||
{ "name" : "Dust of illusion", "cost" : 1200, "url" : "" },
|
||||
{ "name" : "Brooch of shielding", "cost" : 1500, "url" : "" },
|
||||
{ "name" : "Necklace of fireballs type I", "cost" : 1650, "url" : "" },
|
||||
{ "name" : "Dust of appearance", "cost" : 1800, "url" : "" },
|
||||
{ "name" : "Hat of disguise", "cost" : 1800, "url" : "" },
|
||||
{ "name" : "Pipes of sounding", "cost" : 1800, "url" : "" },
|
||||
{ "name" : "Efficient quiver", "cost" : 1800, "url" : "" },
|
||||
{ "name" : "Amulet of natural armor +1", "cost" : 2000, "url" : "" },
|
||||
{ "name" : "Handy haversack", "cost" : 2000, "url" : "" },
|
||||
{ "name" : "Horn of fog", "cost" : 2000, "url" : "" },
|
||||
{ "name" : "Elemental gem", "cost" : 2250, "url" : "" },
|
||||
{ "name" : "Robe of bones", "cost" : 2400, "url" : "" },
|
||||
{ "name" : "Sovereign glue", "cost" : 2400, "url" : "" },
|
||||
{ "name" : "Bag of holding type I", "cost" : 2500, "url" : "" },
|
||||
{ "name" : "Boots of elvenkind", "cost" : 2500, "url" : "" },
|
||||
{ "name" : "Boots of the winterlands", "cost" : 2500, "url" : "" },
|
||||
{ "name" : "Candle of truth", "cost" : 2500, "url" : "" },
|
||||
{ "name" : "Cloak of elvenkind", "cost" : 2500, "url" : "" },
|
||||
{ "name" : "Eyes of the eagle", "cost" : 2500, "url" : "" },
|
||||
{ "name" : "Goggles of minute seeing", "cost" : 2500, "url" : "" },
|
||||
{ "name" : "Scarab, golembane", "cost" : 2500, "url" : "" },
|
||||
{ "name" : "Necklace of fireballs type II", "cost" : 2700, "url" : "" },
|
||||
{ "name" : "Stone of alarm", "cost" : 2700, "url" : "" },
|
||||
{ "name" : "Bead of force", "cost" : 3000, "url" : "" },
|
||||
{ "name" : "Chime of opening", "cost" : 3000, "url" : "" },
|
||||
{ "name" : "Horseshoes of speed", "cost" : 3000, "url" : "" },
|
||||
{ "name" : "Rope of climbing", "cost" : 3000, "url" : "" },
|
||||
{ "name" : "Bag of tricks, gray", "cost" : 3400, "url" : "" },
|
||||
{ "name" : "Dust of disappearance", "cost" : 3500, "url" : "" },
|
||||
{ "name" : "Lens of detection", "cost" : 3500, "url" : "" },
|
||||
{ "name" : "Druid's Vestment", "cost" : 3750, "url" : "" },
|
||||
{ "name" : "Figurine of wondrous power, silver raven", "cost" : 3800,
|
||||
"url" : "" },
|
||||
{ "name" : "Belt of giant strength +2", "cost" : 4000, "url" : "" },
|
||||
{ "name" : "Belt of incredible dexterity +2", "cost" : 4000,
|
||||
"url" : "" },
|
||||
{ "name" : "Belt of mighty constitution +2", "cost" : 4000,
|
||||
"url" : "" },
|
||||
{ "name" : "Bracers of armor +2", "cost" : 4000, "url" : "" },
|
||||
{ "name" : "Cloak of resistance +2", "cost" : 4000, "url" : "" },
|
||||
{ "name" : "Gloves of arrow snaring", "cost" : 4000, "url" : "" },
|
||||
{ "name" : "Headband of alluring charisma +2", "cost" : 4000,
|
||||
"url" : "" },
|
||||
{ "name" : "Headband of inspired wisdom +2", "cost" : 4000,
|
||||
"url" : "" },
|
||||
{ "name" : "Headband of vast intelligence +2", "cost" : 4000,
|
||||
"url" : "" },
|
||||
{ "name" : "Ioun stone, clear spindle", "cost" : 4000, "url" : "" },
|
||||
{ "name" : "Restorative ointment", "cost" : 4000, "url" : "" },
|
||||
{ "name" : "Marvelous pigments", "cost" : 4000, "url" : "" },
|
||||
{ "name" : "Pearl of power, 2nd-level spell", "cost" : 4000,
|
||||
"url" : "" },
|
||||
{ "name" : "Stone salve", "cost" : 4000, "url" : "" },
|
||||
{ "name" : "Necklace of fireballs type III", "cost" : 4350,
|
||||
"url" : "" },
|
||||
{ "name" : "Circlet of persuasion", "cost" : 4500, "url" : "" },
|
||||
{ "name" : "Slippers of spider climbing", "cost" : 4800, "url" : "" },
|
||||
{ "name" : "Incense of meditation", "cost" : 4900, "url" : "" },
|
||||
{ "name" : "Amulet of mighty fists +1", "cost" : 5000, "url" : "" },
|
||||
{ "name" : "Bag of holding type II", "cost" : 5000, "url" : "" },
|
||||
{ "name" : "Bracers of archery, lesser", "cost" : 5000, "url" : "" },
|
||||
{ "name" : "Ioun stone, dusty rose prism", "cost" : 5000, "url" : "" },
|
||||
{ "name" : "Helm of comprehend languages and read magic", "cost" : 5200,
|
||||
"url" : "" },
|
||||
{ "name" : "Vest of escape", "cost" : 5200, "url" : "" },
|
||||
{ "name" : "Eversmoking bottle", "cost" : 5400, "url" : "" },
|
||||
{ "name" : "Sustaining spoon", "cost" : 5400, "url" : "" },
|
||||
{ "name" : "Necklace of fireballs type IV", "cost" : 5400, "url" : "" },
|
||||
{ "name" : "Boots of striding and springing", "cost" : 5500,
|
||||
"url" : "" },
|
||||
{ "name" : "Wind fan", "cost" : 5500, "url" : "" },
|
||||
{ "name" : "Necklace of fireballs type V", "cost" : 5850, "url" : "" },
|
||||
{ "name" : "Horseshoes of a zephyr", "cost" : 6000, "url" : "" },
|
||||
{ "name" : "Pipes of haunting", "cost" : 6000, "url" : "" },
|
||||
{ "name" : "Gloves of swimming and climbing", "cost" : 6250,
|
||||
"url" : "" },
|
||||
{ "name" : "Crown of blasting, minor", "cost" : 6480, "url" : "" },
|
||||
{ "name" : "Horn of goodness/evil", "cost" : 6500, "url" : "" },
|
||||
{ "name" : "Robe of useful items", "cost" : 7000, "url" : "" },
|
||||
{ "name" : "Boat, folding", "cost" : 7200, "url" : "" },
|
||||
{ "name" : "Cloak of the manta ray", "cost" : 7200, "url" : "" },
|
||||
{ "name" : "Bottle of air", "cost" : 7250, "url" : "" },
|
||||
{ "name" : "Bag of holding type III", "cost" : 7400, "url" : "" },
|
||||
{ "name" : "Periapt of health", "cost" : 7400, "url" : "" },
|
||||
{ "name" : "Boots of levitation", "cost" : 7500, "url" : "" },
|
||||
{ "name" : "Harp of charming", "cost" : 750, "url" : "" }],
|
||||
"medium" : [
|
||||
{ "name" : "Amulet of natural armor +2", "cost" : 8000,
|
||||
"url" : "#amulet-of-natural-armor" },
|
||||
{ "name" : "Golem manual, flesh", "cost" : 8000, "url" : "" },
|
||||
{ "name" : "Hand of glory", "cost" : 8000, "url" : "" },
|
||||
{ "name" : "Ioun stone, deep red sphere", "cost" : 8000, "url" : "" },
|
||||
{ "name" : "Ioun stone, incandescent blue sphere", "cost" : 8000,
|
||||
"url" : "" },
|
||||
{ "name" : "Ioun stone, pale blue rhomboid", "cost" : 8000,
|
||||
"url" : "" },
|
||||
{ "name" : "Ioun stone, pink and green sphere", "cost" : 8000,
|
||||
"url" : "" },
|
||||
{ "name" : "Ioun stone, pink rhomboid", "cost" : 8000, "url" : "" },
|
||||
{ "name" : "Ioun stone, scarlet and blue sphere", "cost" : 8000,
|
||||
"url" : "" },
|
||||
{ "name" : "Deck of illusions", "cost" : 8100, "url" : "" },
|
||||
{ "name" : "Necklace of fireballs type VI", "cost" : 8100, "url" : "" },
|
||||
{ "name" : "Candle of invocation", "cost" : 8400, "url" : "" },
|
||||
{ "name" : "Robe of blending", "cost" : 8400, "url" : "" },
|
||||
{ "name" : "Bag of tricks, rust", "cost" : 8500, "url" : "" },
|
||||
{ "name" : "Necklace of fireballs type VII", "cost" : 8700,
|
||||
"url" : "" },
|
||||
{ "name" : "Bracers of armor +3", "cost" : 9000, "url" : "" },
|
||||
{ "name" : "Cloak of resistance +3", "cost" : 9000, "url" : "" },
|
||||
{ "name" : "Decanter of endless water", "cost" : 9000, "url" : "" },
|
||||
{ "name" : "Necklace of adaptation", "cost" : 9000, "url" : "" },
|
||||
{ "name" : "Pearl of power, 3rd-level spell", "cost" : 9000,
|
||||
"url" : "" },
|
||||
{ "name" : "Figurine of wondrous power, serpentine owl", "cost" : 9100,
|
||||
"url" : "" },
|
||||
{ "name" : "Strand of prayer beads, lesser", "cost" : 9600,
|
||||
"url" : "" },
|
||||
{ "name" : "Bag of holding type IV", "cost" : 10000, "url" : "" },
|
||||
{ "name" : "Belt of physical might +2", "cost" : 10000, "url" : "" },
|
||||
{ "name" : "Figurine of wondrous power, bronze griffon", "cost" : 10000,
|
||||
"url" : "" },
|
||||
{ "name" : "Figurine of wondrous power, ebony fly", "cost" : 10000,
|
||||
"url" : "" },
|
||||
{ "name" : "Glove of storing", "cost" : 10000, "url" : "" },
|
||||
{ "name" : "Headband of mental prowess +2", "cost" : 10000,
|
||||
"url" : "" },
|
||||
{ "name" : "Ioun stone, dark blue rhomboid", "cost" : 10000,
|
||||
"url" : "" },
|
||||
{ "name" : "Cape of the mountebank", "cost" : 10080, "url" : "" },
|
||||
{ "name" : "Phylactery of negative channeling", "cost" : 11000,
|
||||
"url" : "" },
|
||||
{ "name" : "Phylactery of positive channeling", "cost" : 11000,
|
||||
"url" : "" },
|
||||
{ "name" : "Gauntlet of rust", "cost" : 11500, "url" : "" },
|
||||
{ "name" : "Boots of speed", "cost" : 12000, "url" : "" },
|
||||
{ "name" : "Goggles of night", "cost" : 12000, "url" : "" },
|
||||
{ "name" : "Golem manual, clay", "cost" : 12000, "url" : "" },
|
||||
{ "name" : "Medallion of thoughts", "cost" : 12000, "url" : "" },
|
||||
{ "name" : "Blessed book", "cost" : 12500, "url" : "" },
|
||||
{ "name" : "Gem of brightness", "cost" : 13000, "url" : "" },
|
||||
{ "name" : "Lyre of building", "cost" : 13000, "url" : "" },
|
||||
{ "name" : "Monk's Robe", "cost" : 13000, "url" : "" },
|
||||
{ "name" : "Cloak of arachnida", "cost" : 14000, "url" : "" },
|
||||
{ "name" : "Belt of dwarvenkind", "cost" : 14900, "url" : "" },
|
||||
{ "name" : "Periapt of wound closure", "cost" : 15000, "url" : "" },
|
||||
{ "name" : "Pearl of the sirines", "cost" : 15300, "url" : "" },
|
||||
{ "name" : "Figurine of wondrous power, onyx dog", "cost" : 15500,
|
||||
"url" : "" },
|
||||
{ "name" : "Bag of tricks, tan", "cost" : 16000, "url" : "" },
|
||||
{ "name" : "Belt of giant strength +4", "cost" : 16000, "url" : "" },
|
||||
{ "name" : "Belt of incredible dexterity +4", "cost" : 16000,
|
||||
"url" : "" },
|
||||
{ "name" : "Belt of mighty constitution +4", "cost" : 16000,
|
||||
"url" : "" },
|
||||
{ "name" : "Belt of physical perfection +2", "cost" : 16000,
|
||||
"url" : "" },
|
||||
{ "name" : "Boots, winged", "cost" : 16000, "url" : "" },
|
||||
{ "name" : "Bracers of armor +4", "cost" : 16000, "url" : "" },
|
||||
{ "name" : "Cloak of resistance +4", "cost" : 16000, "url" : "" },
|
||||
{ "name" : "Headband of alluring charisma +4", "cost" : 16000,
|
||||
"url" : "" },
|
||||
{ "name" : "Headband of inspired wisdom +4", "cost" : 16000,
|
||||
"url" : "" },
|
||||
{ "name" : "Headband of mental superiority +2", "cost" : 16000,
|
||||
"url" : "" },
|
||||
{ "name" : "Headband of vast intelligence +4", "cost" : 16000,
|
||||
"url" : "" },
|
||||
{ "name" : "Pearl of power, 4th-level spell", "cost" : 16000,
|
||||
"url" : "" },
|
||||
{ "name" : "Scabbard of keen edges", "cost" : 16000, "url" : "" },
|
||||
{ "name" : "Figurine of wondrous power, golden lions", "cost" : 16500,
|
||||
"url" : "" },
|
||||
{ "name" : "Chime of interruption", "cost" : 16800, "url" : "" },
|
||||
{ "name" : "Broom of flying", "cost" : 17000, "url" : "" },
|
||||
{ "name" : "Figurine of wondrous power, marble elephant",
|
||||
"cost" : 17000, "url" : "" },
|
||||
{ "name" : "Amulet of natural armor +3", "cost" : 18000, "url" : "" },
|
||||
{ "name" : "Ioun stone, iridescent spindle", "cost" : 18000,
|
||||
"url" : "" },
|
||||
{ "name" : "Bracelet of friends", "cost" : 19000, "url" : "" },
|
||||
{ "name" : "Amulet of mighty fists +2", "cost" : 20000, "url" : "" },
|
||||
{ "name" : "Carpet of flying, 5 ft. by 5 ft.", "cost" : 20000,
|
||||
"url" : "" },
|
||||
{ "name" : "Horn of blasting", "cost" : 20000, "url" : "" },
|
||||
{ "name" : "Ioun stone, pale lavender ellipsoid", "cost" : 20000,
|
||||
"url" : "" },
|
||||
{ "name" : "Ioun stone, pearly white spindle", "cost" : 20000,
|
||||
"url" : "" },
|
||||
{ "name" : "Portable hole", "cost" : 20000, "url" : "" },
|
||||
{ "name" : "Stone of good luck (luckstone)", "cost" : 20000,
|
||||
"url" : "" },
|
||||
{ "name" : "Figurine of wondrous power, ivory goats", "cost" : 21000,
|
||||
"url" : "" },
|
||||
{ "name" : "Rope of entanglement", "cost" : 21000, "url" : "" },
|
||||
{ "name" : "Golem manual, stone", "cost" : 22000, "url" : "" },
|
||||
{ "name" : "Mask of the skull", "cost" : 22000, "url" : "" },
|
||||
{ "name" : "Mattock of the titans", "cost" : 23348, "url" : "" },
|
||||
{ "name" : "Crown of blasting, major", "cost" : 23760, "url" : "" },
|
||||
{ "name" : "Cloak of displacement, minor", "cost" : 24000, "url" : "" },
|
||||
{ "name" : "Helm of underwater action", "cost" : 24000, "url" : "" },
|
||||
{ "name" : "Bracers of archery, greater", "cost" : 25000, "url" : "" },
|
||||
{ "name" : "Bracers of armor +5", "cost" : 25000, "url" : "" },
|
||||
{ "name" : "Cloak of resistance +5", "cost" : 25000, "url" : "" },
|
||||
{ "name" : "Eyes of doom", "cost" : 25000, "url" : "" },
|
||||
{ "name" : "Pearl of power, 5th-level spell", "cost" : 25000,
|
||||
"url" : "" },
|
||||
{ "name" : "Maul of the titans", "cost" : 25305, "url" : "" },
|
||||
{ "name" : "Cloak of the bat", "cost" : 26000, "url" : "" },
|
||||
{ "name" : "Iron bands of binding", "cost" : 26000, "url" : "" },
|
||||
{ "name" : "Cube of frost resistance", "cost" : 27000, "url" : "" },
|
||||
{ "name" : "Helm of telepathy", "cost" : 27000, "url" : "" },
|
||||
{ "name" : "Periapt of proof against poison", "cost" : 27000,
|
||||
"url" : "" },
|
||||
{ "name" : "Robe of scintillating colors", "cost" : 27000, "url" : "" },
|
||||
{ "name" : "Manual of bodily health +1", "cost" : 27500, "url" : "" },
|
||||
{ "name" : "Manual of gainful exercise +1", "cost" : 27500,
|
||||
"url" : "" },
|
||||
{ "name" : "Manual of quickness in action +1", "cost" : 27500,
|
||||
"url" : "" },
|
||||
{ "name" : "Tome of clear thought +1", "cost" : 27500, "url" : "" },
|
||||
{ "name" : "Tome of leadership and influence +1", "cost" : 27500,
|
||||
"url" : "" },
|
||||
{ "name" : "Tome of understanding +1", "cost" : 2750, "url" : "" }],
|
||||
"major"
|
||||
: [{ "name" : "Dimensional shackles", "cost" : 28000,
|
||||
"url" : "#dimensional-shackles" },
|
||||
{ "name" : "Figurine of wondrous power, obsidian steed", "cost" : 28500,
|
||||
"url" : "" },
|
||||
{ "name" : "Drums of panic", "cost" : 30000, "url" : "" },
|
||||
{ "name" : "Ioun stone, orange prism", "cost" : 30000, "url" : "" },
|
||||
{ "name" : "Ioun stone, pale green prism", "cost" : 30000, "url" : "" },
|
||||
{ "name" : "Lantern of revealing", "cost" : 30000, "url" : "" },
|
||||
{ "name" : "Amulet of natural armor +4", "cost" : 32000, "url" : "" },
|
||||
{ "name" : "Amulet of proof against detection and location",
|
||||
"cost" : 35000, "url" : "" },
|
||||
{ "name" : "Carpet of flying, 5 ft. by 10 ft.", "cost" : 35000,
|
||||
"url" : "" },
|
||||
{ "name" : "Golem manual, iron", "cost" : 35000, "url" : "" },
|
||||
{ "name" : "Belt of giant strength +6", "cost" : 36000, "url" : "" },
|
||||
{ "name" : "Belt of incredible dexterity +6", "cost" : 36000,
|
||||
"url" : "" },
|
||||
{ "name" : "Belt of mighty constitution +6", "cost" : 36000,
|
||||
"url" : "" },
|
||||
{ "name" : "Bracers of armor +6", "cost" : 36000, "url" : "" },
|
||||
{ "name" : "Headband of alluring charisma +6", "cost" : 36000,
|
||||
"url" : "" },
|
||||
{ "name" : "Headband of inspired wisdom +6", "cost" : 36000,
|
||||
"url" : "" },
|
||||
{ "name" : "Headband of vast intelligence +6", "cost" : 36000,
|
||||
"url" : "" },
|
||||
{ "name" : "Ioun stone, vibrant purple prism", "cost" : 36000,
|
||||
"url" : "" },
|
||||
{ "name" : "Pearl of power, 6th-level spell", "cost" : 36000,
|
||||
"url" : "" },
|
||||
{ "name" : "Scarab of protection", "cost" : 38000, "url" : "" },
|
||||
{ "name" : "Belt of physical might +4", "cost" : 40000, "url" : "" },
|
||||
{ "name" : "Headband of mental prowess +4", "cost" : 40000,
|
||||
"url" : "" },
|
||||
{ "name" : "Ioun stone, lavender and green ellipsoid", "cost" : 40000,
|
||||
"url" : "" },
|
||||
{ "name" : "Ring gates", "cost" : 40000, "url" : "" },
|
||||
{ "name" : "Crystal ball", "cost" : 42000, "url" : "" },
|
||||
{ "name" : "Golem manual, stone guardian", "cost" : 44000, "url" : "" },
|
||||
{ "name" : "Amulet of mighty fists +3", "cost" : 45000, "url" : "" },
|
||||
{ "name" : "Strand of prayer beads", "cost" : 45800, "url" : "" },
|
||||
{ "name" : "Orb of storms", "cost" : 48000, "url" : "" },
|
||||
{ "name" : "Boots of teleportation", "cost" : 49000, "url" : "" },
|
||||
{ "name" : "Bracers of armor +7", "cost" : 49000, "url" : "" },
|
||||
{ "name" : "Pearl of power, 7th-level spell", "cost" : 49000,
|
||||
"url" : "" },
|
||||
{ "name" : "Amulet of natural armor +5", "cost" : 50000, "url" : "" },
|
||||
{ "name" : "Cloak of displacement, major", "cost" : 50000, "url" : "" },
|
||||
{ "name" : "Crystal ball with see invisibility", "cost" : 50000,
|
||||
"url" : "" },
|
||||
{ "name" : "Horn of Valhalla", "cost" : 50000, "url" : "" },
|
||||
{ "name" : "Crystal ball with detect thoughts", "cost" : 51000,
|
||||
"url" : "" },
|
||||
{ "name" : "Wings of flying", "cost" : 54000, "url" : "" },
|
||||
{ "name" : "Cloak of etherealness", "cost" : 55000, "url" : "" },
|
||||
{ "name" : "Instant fortress", "cost" : 55000, "url" : "" },
|
||||
{ "name" : "Manual of bodily health +2", "cost" : 55000, "url" : "" },
|
||||
{ "name" : "Manual of gainful exercise +2", "cost" : 55000,
|
||||
"url" : "" },
|
||||
{ "name" : "Manual of quickness in action +2", "cost" : 55000,
|
||||
"url" : "" },
|
||||
{ "name" : "Tome of clear thought +2", "cost" : 55000, "url" : "" },
|
||||
{ "name" : "Tome of leadership and influence +2", "cost" : 55000,
|
||||
"url" : "" },
|
||||
{ "name" : "Tome of understanding +2", "cost" : 55000, "url" : "" },
|
||||
{ "name" : "Eyes of charming", "cost" : 56000, "url" : "" },
|
||||
{ "name" : "Robe of stars", "cost" : 58000, "url" : "" },
|
||||
{ "name" : "Carpet of flying, 10 ft. by 10 ft.", "cost" : 60000,
|
||||
"url" : "" },
|
||||
{ "name" : "Darkskull", "cost" : 60000, "url" : "" },
|
||||
{ "name" : "Cube of force", "cost" : 62000, "url" : "" },
|
||||
{ "name" : "Belt of physical perfection +4", "cost" : 64000,
|
||||
"url" : "" },
|
||||
{ "name" : "Bracers of armor +8", "cost" : 64000, "url" : "" },
|
||||
{ "name" : "Headband of mental superiority +4", "cost" : 64000,
|
||||
"url" : "" },
|
||||
{ "name" : "Pearl of power, 8th-level spell", "cost" : 64000,
|
||||
"url" : "" },
|
||||
{ "name" : "Crystal ball with telepathy", "cost" : 70000, "url" : "" },
|
||||
{ "name" : "Horn of blasting, greater", "cost" : 70000, "url" : "" },
|
||||
{ "name" : "Pearl of power, two spells", "cost" : 70000, "url" : "" },
|
||||
{ "name" : "Helm of teleportation", "cost" : 73500, "url" : "" },
|
||||
{ "name" : "Gem of seeing", "cost" : 75000, "url" : "" },
|
||||
{ "name" : "Robe of the archmagi", "cost" : 75000, "url" : "" },
|
||||
{ "name" : "Mantle of faith", "cost" : 76000, "url" : "" },
|
||||
{ "name" : "Amulet of mighty fists +4", "cost" : 80000, "url" : "" },
|
||||
{ "name" : "Crystal ball with true seeing", "cost" : 80000,
|
||||
"url" : "" },
|
||||
{ "name" : "Pearl of power, 9th-level spell", "cost" : 81000,
|
||||
"url" : "" },
|
||||
{ "name" : "Well of many worlds", "cost" : 82000, "url" : "" },
|
||||
{ "name" : "Manual of bodily health +3", "cost" : 82500, "url" : "" },
|
||||
{ "name" : "Manual of gainful exercise +3", "cost" : 82500,
|
||||
"url" : "" },
|
||||
{ "name" : "Manual of quickness in action +3", "cost" : 82500,
|
||||
"url" : "" },
|
||||
{ "name" : "Tome of clear thought +3", "cost" : 82500, "url" : "" },
|
||||
{ "name" : "Tome of leadership and influence +3", "cost" : 82500,
|
||||
"url" : "" },
|
||||
{ "name" : "Tome of understanding +3", "cost" : 82500, "url" : "" },
|
||||
{ "name" : "Apparatus of the crab", "cost" : 90000, "url" : "" },
|
||||
{ "name" : "Belt of physical might +6", "cost" : 90000, "url" : "" },
|
||||
{ "name" : "Headband of mental prowess +6", "cost" : 90000,
|
||||
"url" : "" },
|
||||
{ "name" : "Mantle of spell resistance", "cost" : 90000, "url" : "" },
|
||||
{ "name" : "Mirror of opposition", "cost" : 92000, "url" : "" },
|
||||
{ "name" : "Strand of prayer beads, greater", "cost" : 95800,
|
||||
"url" : "" },
|
||||
{ "name" : "Manual of bodily health +4", "cost" : 110000, "url" : "" },
|
||||
{ "name" : "Manual of gainful exercise +4", "cost" : 110000,
|
||||
"url" : "" },
|
||||
{ "name" : "Manual of quickness in action +4", "cost" : 110000,
|
||||
"url" : "" },
|
||||
{ "name" : "Tome of clear thought +4", "cost" : 110000, "url" : "" },
|
||||
{ "name" : "Tome of leadership and influence +4", "cost" : 110000,
|
||||
"url" : "" },
|
||||
{ "name" : "Tome of understanding +4", "cost" : 110000, "url" : "" },
|
||||
{ "name" : "Amulet of the planes", "cost" : 120000, "url" : "" },
|
||||
{ "name" : "Robe of eyes", "cost" : 120000, "url" : "" },
|
||||
{ "name" : "Amulet of mighty fists +5", "cost" : 125000, "url" : "" },
|
||||
{ "name" : "Helm of Brilliance", "cost" : 125000, "url" : "" },
|
||||
{ "name" : "Manual of bodily health +5", "cost" : 137500, "url" : "" },
|
||||
{ "name" : "Manual of gainful exercise +5", "cost" : 137500,
|
||||
"url" : "" },
|
||||
{ "name" : "Manual of quickness in action +5", "cost" : 137500,
|
||||
"url" : "" },
|
||||
{ "name" : "Tome of clear thought +5", "cost" : 137500, "url" : "" },
|
||||
{ "name" : "Tome of leadership and influence +5", "cost" : 137500,
|
||||
"url" : "" },
|
||||
{ "name" : "Tome of understanding +5", "cost" : 137500, "url" : "" },
|
||||
{ "name" : "Belt of physical perfection +6", "cost" : 144000,
|
||||
"url" : "" },
|
||||
{ "name" : "Headband of mental superiority +6", "cost" : 144000,
|
||||
"url" : "" },
|
||||
{ "name" : "Efreeti bottle", "cost" : 145000, "url" : "" },
|
||||
{ "name" : "Cubic gate", "cost" : 164000, "url" : "" },
|
||||
{ "name" : "Iron flask", "cost" : 170000, "url" : "" },
|
||||
{ "name" : "Mirror of life trapping", "cost" : 20000, "url" : "" }]
|
||||
},
|
||||
{
|
||||
"name": "Advanced Player's Guide",
|
||||
"shortName": "APG",
|
||||
"baseUrl": "http://paizo.com/pathfinderRPG/prd/advanced/magicItems/wondrousItems.html",
|
||||
"minor" : [
|
||||
{"name": "Ioun torch", "cost": 75, "url": "#_ioun-torch"},
|
||||
{"name": "War paint of the terrible visage", "cost" : 100, "url" : ""},
|
||||
{"name": "Assisting glove", "cost" : 180, "url" : ""},
|
||||
{"name": "Bandages of rapid recovery", "cost" : 200, "url" : ""},
|
||||
{"name": "Catching cape", "cost" : 200, "url" : ""},
|
||||
{"name": "Soul soap", "cost" : 200, "url" : ""},
|
||||
{"name": "Bottle of messages", "cost" : 300, "url" : ""},
|
||||
{"name": "Key of lock jamming", "cost" : 400, "url" : ""},
|
||||
{"name": "Campfire bead", "cost" : 720, "url" : ""},
|
||||
{"name": "Defoliant polish", "cost" : 800, "url" : ""},
|
||||
{"name": "Dust of emulation", "cost" : 800, "url" : ""},
|
||||
{"name": "Muleback cords", "cost" : 1000, "url" : ""},
|
||||
{"name": "All tools vest", "cost" : 1800, "url" : ""},
|
||||
{"name": "Cowardly crouching cloak", "cost" : 1800, "url" : ""},
|
||||
{"name": "Scabbard of vigor", "cost" : 1800, "url" : ""},
|
||||
{"name": "Clamor box", "cost" : 2000, "url" : ""},
|
||||
{"name": "Glowing glove", "cost" : 2000, "url" : ""},
|
||||
{"name": "Manacles of cooperation", "cost" : 2000, "url" : ""},
|
||||
{"name": "Knight's pennon (honor)", "cost" : 2200, "url" : ""},
|
||||
{"name": "Flying ointment", "cost" : 2250, "url" : ""},
|
||||
{"name": "Boots of friendly terrain", "cost" : 2400, "url" : ""},
|
||||
{"name": "Apple of eternal sleep", "cost" : 2500, "url" : ""},
|
||||
{"name": "Cauldron of brewing", "cost" : 3000, "url" : ""},
|
||||
{"name": "Philter of love", "cost" : 3000, "url" : ""},
|
||||
{"name": "Sash of the war champion", "cost" : 4000, "url" : ""},
|
||||
{"name": "Knight's pennon (battle)", "cost" : 4500, "url" : ""},
|
||||
{"name": "Knight's pennon (parley)", "cost" : 4500, "url" : ""},
|
||||
{"name": "Helm of fearsome mien", "cost" : 5000, "url" : ""},
|
||||
{"name": "Horn of the huntmaster", "cost" : 5000, "url" : ""},
|
||||
{"name": "Scabbard of staunching", "cost" : 5000, "url" : ""},
|
||||
{"name": "Sheath of bladestealth", "cost" : 5000, "url" : ""},
|
||||
],
|
||||
"medium": [
|
||||
{"name": "Grappler's mask", "cost": 5000, "url": "#grappler's-mask"},
|
||||
{"name": "Torc of lionheart fury", "cost": 8000, "url": ""},
|
||||
{"name": "Amulet of spell cunning", "cost": 10000, "url": ""},
|
||||
{"name": "Construct channel brick", "cost": 10000, "url": ""},
|
||||
{"name": "Doomharp", "cost": 10000, "url": ""},
|
||||
{"name": "Ki mat", "cost": 10000, "url": ""},
|
||||
{"name": "Lord's banner (swiftness)", "cost": 10000, "url": ""},
|
||||
{"name": "Crystal of healing hands", "cost": 12000, "url": ""},
|
||||
{"name": "Book of the loremaster", "cost": 15000, "url": ""},
|
||||
{"name": "Bracelet of mercy", "cost": 15000, "url": ""},
|
||||
{"name": "Cauldron of plenty", "cost": 15000, "url": ""},
|
||||
{"name": "Gloves of dueling", "cost": 15000, "url": ""},
|
||||
{"name": "Necklace of ki serenity", "cost": 16000, "url": ""},
|
||||
{"name": "Robes of arcane heritage", "cost": 16000, "url": ""},
|
||||
{"name": "Silver smite bracelet", "cost": 16000, "url": ""},
|
||||
{"name": "Vest of the cockroach", "cost": 16000, "url": ""},
|
||||
{"name": "Amulet of magecraft", "cost": 20000, "url": ""},
|
||||
{"name": "Horn of antagonism", "cost": 20000, "url": ""},
|
||||
{"name": "Moon circlet", "cost": 20000, "url": ""},
|
||||
{"name": "Necromancer's athame", "cost": 20000, "url": ""},
|
||||
{"name": "Sniper goggles", "cost": 20000, "url": ""},
|
||||
{"name": "Annihilation spectacles", "cost": 25000, "url": ""},
|
||||
],
|
||||
"major": [
|
||||
{"name": "Cauldron of the dead", "cost": 30000, "url": "#cauldron-of-the-dead"},
|
||||
{"name": "Mask of giants (lesser)", "cost": 30000, "url": ""},
|
||||
{"name": "Cauldron of resurrection", "cost": 33000, "url": ""},
|
||||
{"name": "Cauldron of flying", "cost": 40000, "url": ""},
|
||||
{"name": "Cauldron of seeing", "cost": 42000, "url": ""},
|
||||
{"name": "Lord's banner (terror)", "cost": 56000, "url": ""},
|
||||
{"name": "Lord's banner (victory)", "cost": 75000, "url": ""},
|
||||
{"name": "Mask of giants (greater)", "cost": 90000, "url": ""},
|
||||
{"name": "Lord's banner (crusades)", "cost": 100000, "url": ""},
|
||||
]
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
WondrousItems.getItem = function(type, source) {
|
||||
var item = {};
|
||||
var sourceItems = [];
|
||||
if(source === undefined) {
|
||||
_.forEach(this.getAllItems(), function(s) {
|
||||
sourceItems = _(sourceItems).concat(s[type]).value();
|
||||
});
|
||||
}
|
||||
else {
|
||||
sourceItems = _.findWhere(this.getAllItems(), function(s) {
|
||||
return s.shortName === source.toUpperCase();
|
||||
})[type];
|
||||
//spell = _.sample(sourceSpells[type][level]);
|
||||
}
|
||||
|
||||
//I *know* that the APG has it"s own roll table but I really don"t care...
|
||||
item = _.sample(sourceItems);
|
||||
|
||||
//remember that consumable items should NEVER have intelligence
|
||||
if(_.random(1,100) === 1) {
|
||||
item.name = "Intelligent " + item.name;
|
||||
item.intelligence = Intelligence.getItemIntelligence(item.cost);
|
||||
item.cost += item.intelligence.cost;
|
||||
}
|
||||
if(_.random(1,100) <= 20)
|
||||
item.name += " with a clue as to its purpose";
|
||||
return item;
|
||||
};
|
||||
|
||||
WondrousItems.getMinor = function() {
|
||||
return this.getItem("minor");
|
||||
};
|
||||
|
||||
WondrousItems.getMedium = function() {
|
||||
return this.getItem("medium");
|
||||
};
|
||||
|
||||
WondrousItems.getMajor = function() {
|
||||
return this.getItem("major");
|
||||
};
|
||||
Reference in new issue
Block a user