Slowly converting codebase to new system

This commit is contained in:
Russell Champoux committed 2015-03-11 17:51:43 -04:00
1 parent f1ddc43f9a
commit 6028b7a3fe
13 files changed
+435 -1278

No files matched your search

-1
View File
@@ -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
View File
@@ -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;
};
-6
View File
@@ -1,6 +0,0 @@
/*global _:false */
/*global Grimoire:true */
'use strict';
Grimoire.getEnergyResistance = function() {
return _.sample(['acid', 'cold', 'electricity', 'fire', 'sonic']);
};
+381 -268
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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"}
]
}
+18
View File
@@ -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"]
]
}
+19
View File
@@ -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"]
}
}
}
+3
View File
@@ -0,0 +1,3 @@
{
"data": ["acid", "cold", "electricity", "fire", "sonic"]
}
+3 -1
View File
@@ -1,5 +1,7 @@
{
"name": "Ultimate Magic",
"shortName": "UM",
"types": ["Spells"]
"types": [
{"name": "Spells", "source": "UM/Spells.json"}
]
}
-23
View File
@@ -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)
-517
View File
@@ -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");
};