mirror of
https://github.com/RussellChamp/GrimoireJS.git
synced 2026-10-27 22:42:32 +00:00
Revival of the GrimoireJS project
This commit is contained in:
1 parent
6845ce4a5f
commit
c190be3236
20 files changed
+3652
No files matched your search
@@ -0,0 +1,2 @@
|
||||
lodash.js
|
||||
jquery*.js
|
||||
@@ -0,0 +1,36 @@
|
||||
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
|
||||
|
||||
Grimoire currently only rolls for items based on the Pathfinder Core Rulebook
|
||||
I hope to add roll tables for the Pathfinder Advanced Player's Guide soon
|
||||
|
||||
While the primary purpose of this project is to be used as a library accessed by other projects, you can manually generate items by following these steps
|
||||
1. Open grimoire.html in a web browser
|
||||
2. Hit F12 to open the developer console
|
||||
3. All commands are within the following objects:
|
||||
* Grimoire
|
||||
* Armors
|
||||
* Weapons
|
||||
* Deities
|
||||
* Intelligence
|
||||
* Potions
|
||||
* Rings
|
||||
* Rods
|
||||
* Scrolls
|
||||
* Shields
|
||||
* Staves
|
||||
* Wands
|
||||
* Weapons
|
||||
* WondrousItems
|
||||
Tip: All get*() function take a "type" argument that can be either 'minor', 'medium', or 'major'
|
||||
Tip: Try running Grimoire.getItems(2,2,2) to generate several minor, medium, and major items
|
||||
|
||||
Send questions, feedback, or bug reports/fixes to RussellChamp [at] gmail [dot] com
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
/*global _:false */
|
||||
'use strict';
|
||||
|
||||
//TODO: Program the "Roll twice" logic
|
||||
|
||||
var Armors = {};
|
||||
Armors.specificBaseUrl = 'http://paizo.com/pathfinderRPG/prd/magicItems/armor.html';
|
||||
Armors.getSpecifics = function() {
|
||||
return [
|
||||
{'name': 'Mithral shirt', 'bonus': 0, 'cost': 1100, 'url': '#mithril-shirt'},
|
||||
{'name': 'Dragonhide plate', 'bonus': 0, 'cost': 3300, 'url':''},
|
||||
{'name': 'Elven chain', 'bonus': 0, 'cost': 5150, 'url':''},
|
||||
{'name': 'Rhino hide', 'bonus': 0, 'cost': 5165, 'url':''},
|
||||
{'name': 'Adamantine breastplate', 'bonus': 0, 'cost': 10200, 'url':''},
|
||||
{'name': 'Dwarven plate', 'bonus': 0, 'cost': 16500, 'url':''},
|
||||
{'name': 'Banded mail of luck', 'bonus': 0, 'cost': 18900, 'url':''},
|
||||
{'name': 'Celestial armor', 'bonus': 0, 'cost': 22400, 'url':''},
|
||||
{'name': 'Plate armor of the deep', 'bonus': 0, 'cost': 24650, 'url':''},
|
||||
{'name': 'Breastplate of command', 'bonus': 0, 'cost': 25400, 'url':''},
|
||||
{'name': 'Mithral full plate of speed', 'bonus': 0, 'cost': 26500, 'url':''},
|
||||
{'name': 'Demon armor', 'bonus': 0, 'cost': 52260, 'url':''},
|
||||
];
|
||||
};
|
||||
|
||||
Armors.getSpecific = function(type) {
|
||||
var roll = _.random(1,100);
|
||||
var armor = {};
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 50): armor = Armors.getSpecifics()[0]; break;
|
||||
case (roll <= 80): armor = Armors.getSpecifics()[1]; break;
|
||||
case (roll <= 100): armor = Armors.getSpecifics()[2]; break;
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 25): armor = Armors.getSpecifics()[0]; break;
|
||||
case (roll <= 45): armor = Armors.getSpecifics()[1]; break;
|
||||
case (roll <= 57): armor = Armors.getSpecifics()[2]; break;
|
||||
case (roll <= 67): armor = Armors.getSpecifics()[3]; break;
|
||||
case (roll <= 82): armor = Armors.getSpecifics()[4]; break;
|
||||
case (roll <= 97): armor = Armors.getSpecifics()[5]; break;
|
||||
case (roll <= 100): armor = Armors.getSpecifics()[6]; break;
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 10): armor = Armors.getSpecifics()[4]; break;
|
||||
case (roll <= 20): armor = Armors.getSpecifics()[5]; break;
|
||||
case (roll <= 32): armor = Armors.getSpecifics()[6]; break;
|
||||
case (roll <= 50): armor = Armors.getSpecifics()[7]; break;
|
||||
case (roll <= 60): armor = Armors.getSpecifics()[8]; break;
|
||||
case (roll <= 75): armor = Armors.getSpecifics()[9]; break;
|
||||
case (roll <= 90): armor = Armors.getSpecifics()[10]; break;
|
||||
case (roll <= 100): armor = Armors.getSpecifics()[11]; break;
|
||||
}
|
||||
}
|
||||
return armor;
|
||||
};
|
||||
|
||||
Armors.getArmors = function() {
|
||||
//5 possible roll'able armors. Specific type of armor is left up to DM
|
||||
return [
|
||||
{'name': '+1 armor', 'bonus': 1, 'cost': 1000},
|
||||
{'name': '+2 armor', 'bonus': 2, 'cost': 4000},
|
||||
{'name': '+3 armor', 'bonus': 3, 'cost': 9000},
|
||||
{'name': '+4 armor', 'bonus': 4, 'cost': 16000},
|
||||
{'name': '+5 armor', 'bonus': 5, 'cost': 25000},
|
||||
{'name': '+6 armor', 'bonus': 6, 'cost': 36000},
|
||||
{'name': '+7 armor', 'bonus': 7, 'cost': 49000},
|
||||
{'name': '+8 armor', 'bonus': 8, 'cost': 64000},
|
||||
{'name': '+9 armor', 'bonus': 9, 'cost': 81000},
|
||||
{'name': '+10 armor', 'bonus': 10,'cost': 10000}
|
||||
];
|
||||
};
|
||||
|
||||
Armors.getSpecials = function() {
|
||||
return [
|
||||
{'name': 'Glamered', 'bonus': 0, 'cost': 2700},
|
||||
{'name': 'Light Fortification', 'bonus': 1, 'cost': 0},
|
||||
{'name': 'Slick', 'bonus': 0, 'cost': 3750},
|
||||
{'name': 'Shadow', 'bonus': 0, 'cost': 3750},
|
||||
{'name': 'Spell resistance (13)', 'bonus': 2, 'cost': 0},
|
||||
{'name': 'Improved Slick', 'bonus': 0, 'cost': 15000},
|
||||
{'name': 'Improved Shadow', 'bonus': 0, 'cost': 15000},
|
||||
{'name': 'Energy resistance', 'bonus': 0, 'cost': 18000},
|
||||
{'name': 'Ghost touch', 'bonus': 3, 'cost': 0},
|
||||
{'name': 'Invulnerability', 'bonus': 3, 'cost': 0},
|
||||
{'name': 'Moderate Fortification', 'bonus': 3, 'cost': 0},
|
||||
{'name': 'Spell resistance (15)', 'bonus': 3, 'cost': 0},
|
||||
{'name': 'Wild', 'bonus': 3, 'cost': 0},
|
||||
{'name': 'Slick, greater', 'bonus': 0, 'cost': 33750},
|
||||
{'name': 'Shadow, greater', 'bonus': 0, 'cost': 33750},
|
||||
{'name': 'Improved Energy resistance', 'bonus': 0, 'cost': 42000},
|
||||
{'name': 'Spell resistance (17)', 'bonus': 4, 'cost': 0},
|
||||
{'name': 'Etherealness', 'bonus': 0, 'cost': 49000},
|
||||
{'name': 'Undead controlling', 'bonus': 0, 'cost': 49000},
|
||||
{'name': 'Fortification, heavy', 'bonus': 5, 'cost': 0},
|
||||
{'name': 'Spell resistance (19)', 'bonus': 5, 'cost': 0},
|
||||
{'name': 'Energy resistance, greater', 'bonus': 0, 'cost': 66000}
|
||||
//100 Roll again twice
|
||||
];
|
||||
};
|
||||
|
||||
Armors.getSpecial = function(type) {
|
||||
var roll = _.random(1,100);
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 25): return Armors.getSpecials()[0];
|
||||
case (roll <= 32): return Armors.getSpecials()[1];
|
||||
case (roll <= 52): return Armors.getSpecials()[2];
|
||||
case (roll <= 92): return Armors.getSpecials()[3];
|
||||
case (roll <= 96): return Armors.getSpecials()[4];
|
||||
case (roll <= 97): return Armors.getSpecials()[5];
|
||||
case (roll <= 99): return Armors.getSpecials()[6];
|
||||
case (roll <= 100): /*roll twice*/ break;
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 5): return Armors.getSpecials()[0];
|
||||
case (roll <= 8): return Armors.getSpecials()[1];
|
||||
case (roll <= 11): return Armors.getSpecials()[2];
|
||||
case (roll <= 17): return Armors.getSpecials()[3];
|
||||
case (roll <= 19): return Armors.getSpecials()[4];
|
||||
case (roll <= 29): return Armors.getSpecials()[5];
|
||||
case (roll <= 49): return Armors.getSpecials()[6];
|
||||
case (roll <= 74): return Armors.getSpecials()[7];
|
||||
case (roll <= 79): return Armors.getSpecials()[8];
|
||||
case (roll <= 84): return Armors.getSpecials()[9];
|
||||
case (roll <= 89): return Armors.getSpecials()[10];
|
||||
case (roll <= 94): return Armors.getSpecials()[11];
|
||||
case (roll <= 99): return Armors.getSpecials()[12];
|
||||
case (roll <= 100): /*roll twice*/ break;
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 3): return Armors.getSpecials()[0];
|
||||
case (roll <= 4): return Armors.getSpecials()[1];
|
||||
case (roll <= 7): return Armors.getSpecials()[5];
|
||||
case (roll <= 13): return Armors.getSpecials()[6];
|
||||
case (roll <= 28): return Armors.getSpecials()[7];
|
||||
case (roll <= 33): return Armors.getSpecials()[8];
|
||||
case (roll <= 35): return Armors.getSpecials()[9];
|
||||
case (roll <= 40): return Armors.getSpecials()[10];
|
||||
case (roll <= 42): return Armors.getSpecials()[11];
|
||||
case (roll <= 43): return Armors.getSpecials()[12];
|
||||
case (roll <= 48): return Armors.getSpecials()[13];
|
||||
case (roll <= 58): return Armors.getSpecials()[14];
|
||||
case (roll <= 83): return Armors.getSpecials()[15];
|
||||
case (roll <= 88): return Armors.getSpecials()[16];
|
||||
case (roll <= 89): return Armors.getSpecials()[17];
|
||||
case (roll <= 90): return Armors.getSpecials()[18];
|
||||
case (roll <= 92): return Armors.getSpecials()[19];
|
||||
case (roll <= 94): return Armors.getSpecials()[20];
|
||||
case (roll <= 99): return Armors.getSpecials()[21];
|
||||
case (roll <= 100): /*roll twice*/ break;
|
||||
}
|
||||
}
|
||||
if(['minor','medium','major'].indexOf(type) >= 0 && roll == 100) {
|
||||
var special1 = Armors.getSpecial(type);
|
||||
var special2 = Armors.getSpecial(type);
|
||||
//there exists a possibility of getting the same bonus or a bonus over +10
|
||||
//this is hilarious and has not been fixed
|
||||
return {'name': special1.name + ' ' + special2.name,
|
||||
'bonus': special1.bonus + special2.bonus,
|
||||
'cost': special1.cost + special2.cost
|
||||
};
|
||||
}
|
||||
};
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
/*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']);
|
||||
return _.sample(Grimoire.getDeities()[alignment1][alignment2]);
|
||||
};
|
||||
+138
@@ -0,0 +1,138 @@
|
||||
//GrimoireJS v0.1
|
||||
//by Russell Champoux
|
||||
//Grimoire magic item generator for the Pathfinder roleplaying game
|
||||
/*global _:false, console:true */
|
||||
/*global Armors, Weapons, Potions, Rings, Rods, Scrolls, Shields, Staves, Wands, WondrousItems*/
|
||||
/*
|
||||
module Grimoire
|
||||
# A = Armor and shields
|
||||
# W = Weapons
|
||||
# P = Potions
|
||||
# R = Rings
|
||||
# O = rOds
|
||||
# C = sCrolls
|
||||
# T = sTaves
|
||||
# N = waNds
|
||||
# S = wondrouS items
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
var Grimoire = {};
|
||||
Grimoire.getItems = function(num_minor, num_medium, num_major, total_value) {
|
||||
var items = [];
|
||||
_(num_minor).times(function() {
|
||||
var roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 4): items.push(Grimoire.getArmorOrShield('minor')); break;
|
||||
case (roll <= 9): items.push(Weapons.getWeapon('minor')); break;
|
||||
case (roll <= 44): items.push(Potions.getPotion('minor')); break;
|
||||
case (roll <= 46): items.push(Rings.getRing('minor')); break;
|
||||
case (roll <= 81): items.push(Scrolls.getScroll('minor')); break;
|
||||
case (roll <= 91): items.push(Wands.getWand('minor')); break;
|
||||
case (roll <= 100): items.push(WondrousItems.getItem('minior')); break;
|
||||
}
|
||||
});
|
||||
_(num_medium).times(function() {
|
||||
var roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 10): items.push(Grimoire.getArmorOrShield('medium')); break;
|
||||
case (roll <= 20): items.push(Weapons.getWeapon('medium')); break;
|
||||
case (roll <= 30): items.push(Potions.getPotion('medium')); break;
|
||||
case (roll <= 40): items.push(Rings.getRing('medium')); break;
|
||||
case (roll <= 50): items.push(Rods.getRod('medium')); break;
|
||||
case (roll <= 65): items.push(Scrolls.getScroll('medium')); break;
|
||||
case (roll <= 68): items.push(Staves.getStaff('medium')); break;
|
||||
case (roll <= 83): items.push(Wands.getWand('medium')); break;
|
||||
case (roll <= 100): items.push(WondrousItems.getItem('medium')); break;
|
||||
}
|
||||
});
|
||||
_(num_major).times(function() {
|
||||
var roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 10): items.push(Grimoire.getArmorOrShield('major')); break;
|
||||
case (roll <= 20): items.push(Weapons.getWeapon('major')); break;
|
||||
case (roll <= 25): items.push(Potions.getPotion('major')); break;
|
||||
case (roll <= 35): items.push(Rings.getRing('major')); break;
|
||||
case (roll <= 45): items.push(Rods.getRod('major')); break;
|
||||
case (roll <= 55): items.push(Scrolls.getScroll('major')); break;
|
||||
case (roll <= 75): items.push(Staves.getStaff('major')); break;
|
||||
case (roll <= 80): items.push(Wands.getWand('major')); break;
|
||||
case (roll <= 100): items.push(WondrousItems.getItem('major')); break;
|
||||
}
|
||||
});
|
||||
items.forEach(function(i) { console.log(i);});
|
||||
return items;
|
||||
|
||||
};
|
||||
|
||||
Grimoire.getArmorOrShield = function(type, final) {
|
||||
final = typeof final !== 'undefined' ? final : true; //set to false when we recursively call getArmorOrShield
|
||||
var roll = _.random(1,100);
|
||||
if(type === 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 60): return Shields.getShields()[0];
|
||||
case (roll <= 80): return Armors.getArmors()[0];
|
||||
case (roll <= 85): return Shields.getShields()[1];
|
||||
case (roll <= 87): return Armors.getArmors()[1];
|
||||
case (roll <= 89): return Armors.getSpecific('minor');
|
||||
case (roll <= 91): return Shields.getSpecific('minor');
|
||||
case (roll <= 100): /*add modifier*/ break;
|
||||
}
|
||||
}
|
||||
else if(type === 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 5): return Shields.getShields()[0];
|
||||
case (roll <= 10): return Armors.getArmors()[0];
|
||||
case (roll <= 20): return Shields.getShields()[1];
|
||||
case (roll <= 30): return Armors.getArmors()[1];
|
||||
case (roll <= 40): return Shields.getShields()[2];
|
||||
case (roll <= 50): return Armors.getArmors()[2];
|
||||
case (roll <= 55): return Shields.getShields()[3];
|
||||
case (roll <= 57): return Armors.getArmors()[3];
|
||||
case (roll <= 60): return Armors.getSpecific('medium');
|
||||
case (roll <= 63): return Shields.getSpecific('medium');
|
||||
case (roll <= 100): /*add modifier*/ break;
|
||||
}
|
||||
}
|
||||
else if(type === 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 8): return Shields.getShields()[2];
|
||||
case (roll <= 16): return Armors.getArmors()[2];
|
||||
case (roll <= 27): return Shields.getShields()[3];
|
||||
case (roll <= 38): return Armors.getArmors()[3];
|
||||
case (roll <= 49): return Shields.getShields()[4];
|
||||
case (roll <= 57): return Armors.getArmors()[4];
|
||||
case (roll <= 60): return Armors.getSpecific('major');
|
||||
case (roll <= 63): return Shields.getSpecific('major');
|
||||
case (roll <= 100): /*add modifier*/ break;
|
||||
}
|
||||
}
|
||||
if(['minor','medium','major'].indexOf(type) >= 0) {
|
||||
//this means that we hit an 'add a special effect' in one of the above cases
|
||||
var item = Grimoire.getArmorOrShield(type, false);
|
||||
var special = {'name': '', 'bonus': 0, 'cost': 0};
|
||||
//in case we can't figure out if it's an armor or shield, we can use default values
|
||||
|
||||
if(item.name.search(/shield|buckler/) >= 0) {
|
||||
special = Shields.getSpecial(type);
|
||||
}
|
||||
else if (item.name.search(/armor|shirt|plate|chain|hide|mail/) >= 0) {
|
||||
special = Armors.getSpecial(type);
|
||||
}
|
||||
|
||||
if(item.bonus + special.bonus <= 10) { //not alowed to go over 10
|
||||
item = {
|
||||
'name': special.name + ' ' + item.name,
|
||||
'bonus': special.bonus + item.bonus,
|
||||
'cost': special.cost + item.cost +
|
||||
Armors.getArmors()[special.bonus+item.bonus].cost - Armors.getArmors()[item.bonus].cost
|
||||
};
|
||||
}
|
||||
var i = item.name.indexOf('+');
|
||||
if(i !== -1) {
|
||||
//move the '+X' to the front
|
||||
item.name = item.name.slice(i, i+3) + item.name.slice(0, i) + item.name.slice(i+3);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
};
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>GrimoireJS</title>
|
||||
<script src="./jquery-2.1.1.min.js"></script>
|
||||
<script src="./lodash.js"></script>
|
||||
<script type="application/javascript" src="grimoire.js"></script>
|
||||
<script type="application/javascript" src="intelligence.js"></script>
|
||||
<script type="application/javascript" src="weapons.js"></script>
|
||||
<script type="application/javascript" src="wondrousItems.js"></script>
|
||||
<script type="application/javascript" src="rings.js"></script>
|
||||
<script type="application/javascript" src="rods.js"></script>
|
||||
<script type="application/javascript" src="spells.js"></script>
|
||||
<script type="application/javascript" src="scrolls.js"></script>
|
||||
<script type="application/javascript" src="deities.js"></script>
|
||||
<script type="application/javascript" src="potions.js"></script>
|
||||
<script type="application/javascript" src="wands.js"></script>
|
||||
<script type="application/javascript" src="staves.js"></script>
|
||||
<script type="application/javascript" src="armors.js"></script>
|
||||
<script type="application/javascript" src="shields.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h2>GrimoireJS</h2>
|
||||
<strong>========</strong>
|
||||
<div><strong>GrimoireJS: Magic item generator for the Pathfinder tabletop RPG</strong></div>
|
||||
<div>Written by Russell Champoux</div>
|
||||
<br/>
|
||||
<div>This project contains a series of function under the 'Grimoire' object.</div>
|
||||
<div>Jquery and lodash (or underscore) are required by this project</div>
|
||||
<br/>
|
||||
<div>Grimoire currently only rolls for items based on the Pathfinder Core Rulebook.</div>
|
||||
<div>I hope to add roll tables for the Pathfinder Advanced Player's Guide soon</div>
|
||||
<br/>
|
||||
<div>While the primary purpose of this project is to be used as a library accessed by other projects, you can manually generate items by following these steps</div>
|
||||
<ol>
|
||||
<li>Open grimoire.html in a web browser</li>
|
||||
<li>Hit F12 to open the developer console</li>
|
||||
<li>All commands are within the following objects:</li>
|
||||
</ol>
|
||||
<ul>
|
||||
<li>Grimoire</li>
|
||||
<li>Armors</li>
|
||||
<li>Weapons</li>
|
||||
<li>Deities</li>
|
||||
<li>Intelligence</li>
|
||||
<li>Potions</li>
|
||||
<li>Rings</li>
|
||||
<li>Rods</li>
|
||||
<li>Scrolls</li>
|
||||
<li>Shields</li>
|
||||
<li>Staves</li>
|
||||
<li>Wands</li>
|
||||
<li>Weapons</li>
|
||||
<li>WondrousItems</li>
|
||||
</ul>
|
||||
|
||||
<h3>Tips</h3>
|
||||
<ul style="list-style-type:square">
|
||||
<li>All get*() function take a "type" argument that can be either 'minor', 'medium', or 'major'</li>
|
||||
<li>Try running Grimoire.getItems(2,2,2) to generate several minor, medium, and major items</li>
|
||||
<li>Many get*() functions also have an optional paramater "source" that specifies which source material to pull from. Currently, only "CRB" and "APG" are supported.</li>
|
||||
</ul>
|
||||
<br/>
|
||||
<div>One of the funnest things in this library (imho) is the item intelligence module.<br/>
|
||||
Create an intelligence by running Intelligence.getItemIntelligence().print()</div>
|
||||
<br/>
|
||||
<div>Send questions, feedback, or bug reports/fixes to RussellChamp [at] gmail [dot] com</div>
|
||||
<br/>
|
||||
<h2>To do</h2>
|
||||
<ul>
|
||||
<li>Make interactive webpage</li>
|
||||
<li>Already input spells for wizard/sorceror, cleric, and druid. Check for other arcane and divine spells from other classes</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
+390
@@ -0,0 +1,390 @@
|
||||
/*global _:false */
|
||||
/*global Grimoire:true, Spells:true, Weapons:true */
|
||||
'use strict';
|
||||
|
||||
Grimoire.alignments = ['Chaotic good', 'Chaotic neutral', 'Chaotic evil', 'Neutral evil',
|
||||
'Lawful evil', 'Lawful good', 'Lawful neutral', 'Neutral good', 'True neutral']; //9 alignments
|
||||
|
||||
Grimoire.getAlignment = function() {
|
||||
var roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 10): return 'Chaotic good';
|
||||
case (roll <= 20): return 'Chaotic neutral';
|
||||
case (roll <= 35): return 'Chaotic evil';
|
||||
case (roll <= 45): return 'Neutral evil';
|
||||
case (roll <= 55): return 'Lawful evil';
|
||||
case (roll <= 70): return 'Lawful good';
|
||||
case (roll <= 80): return 'Lawful neutral';
|
||||
case (roll <= 90): return 'Neutral good';
|
||||
case (roll <= 100): return 'True neutral';
|
||||
}
|
||||
};
|
||||
|
||||
var Intelligence = {};
|
||||
|
||||
Intelligence.abilityScore = [
|
||||
//ability_score = [score, base price modifier, ego modifier]
|
||||
{'score': 10, 'priceMod': 0, 'egoMod': 0},
|
||||
{'score': 11, 'priceMod': 200, 'egoMod': 0},
|
||||
{'score': 12, 'priceMod': 500, 'egoMod': 1},
|
||||
{'score': 13, 'priceMod': 700, 'egoMod': 1},
|
||||
{'score': 14, 'priceMod': 1000, 'egoMod': 2},
|
||||
{'score': 15, 'priceMod': 1400, 'egoMod': 2},
|
||||
{'score': 16, 'priceMod': 2000, 'egoMod': 3},
|
||||
{'score': 17, 'priceMod': 2800, 'egoMod': 3},
|
||||
{'score': 18, 'priceMod': 4000, 'egoMod': 4},
|
||||
{'score': 19, 'priceMod': 5200, 'egoMod': 4},
|
||||
{'score': 20, 'priceMod': 8000, 'egoMod': 5},
|
||||
];
|
||||
|
||||
Intelligence.getAbilityScore = function() {
|
||||
var roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 10): return Intelligence.abilityScore[0];
|
||||
case (roll <= 20): return Intelligence.abilityScore[1];
|
||||
case (roll <= 40): return Intelligence.abilityScore[2];
|
||||
case (roll <= 50): return Intelligence.abilityScore[3];
|
||||
case (roll <= 70): return Intelligence.abilityScore[4];
|
||||
case (roll <= 75): return Intelligence.abilityScore[5];
|
||||
case (roll <= 80): return Intelligence.abilityScore[6];
|
||||
case (roll <= 85): return Intelligence.abilityScore[7];
|
||||
case (roll <= 90): return Intelligence.abilityScore[8];
|
||||
case (roll <= 95): return Intelligence.abilityScore[9];
|
||||
case (roll <= 100): return Intelligence.abilityScore[10];
|
||||
}
|
||||
};
|
||||
|
||||
Intelligence.skills = {
|
||||
//Craft has been left off the skills list since an object would have a hard time crafting anything
|
||||
'int': ['Appraise', 'Knowledge (arcana)', 'Knowledge (dungeoneering)', 'Knowledge (engineering)',
|
||||
'Knowledge (geography)', 'Knowledge (history)', 'Knowledge (local)', 'Knowledge (nature)',
|
||||
'Knowledge (nobility)', 'Knowledge (planes)', 'Knowledge (religion)', 'Linguistics', 'Spellcraft'],
|
||||
'cha': ['Bluff', 'Diplomacy', 'Intimidate', 'Perform'],
|
||||
'wis': ['Perception', 'Sense Motive', 'Survival'],
|
||||
};
|
||||
|
||||
Intelligence.getSkill = function (type) {
|
||||
if(['int','cha','wis'].indexOf(type) >= 0) {
|
||||
return _.sample(Intelligence.skills[type]);
|
||||
}
|
||||
else {
|
||||
return _(Intelligence.skills.int)
|
||||
.concat(Intelligence.skills.cha)
|
||||
.concat(Intelligence.skills.wis)
|
||||
.sample();
|
||||
}
|
||||
};
|
||||
|
||||
//I've tried to keep things orderly in public arrays but item powers are a bit messy
|
||||
//item_power = [description, base price modifier, ego modifier]
|
||||
Intelligence.getItemPower = function() {
|
||||
var roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 10):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(0).name + ' at will',
|
||||
'priceMod': 1000, 'egoMod': 1};
|
||||
case (roll <= 20):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(1).name + ' 3/day',
|
||||
'priceMod': 1200, 'egoMod': 1};
|
||||
case (roll <= 25):
|
||||
return {'description': 'Item can use Magic Aura on itself at will',
|
||||
'priceMod': 2000, 'egoMod': 1};
|
||||
case (roll <= 35):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(2).name + ' 1/day',
|
||||
'priceMod': 2400, 'egoMod': 1};
|
||||
case (roll <= 45):
|
||||
return {'description': 'Item has 5 ranks in ' + Intelligence.getSkill(),
|
||||
'priceMod': 2500, 'egoMod': 1};
|
||||
case (roll <= 50):
|
||||
return {'description': 'Item can sprout limbs and move with a speed of 10 feet',
|
||||
'priceMod': 5000, 'egoMod': 1};
|
||||
case (roll <= 55):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(3).name + ' 1/day',
|
||||
'priceMod': 6000, 'egoMod': 1};
|
||||
case (roll <= 60):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(2).name + ' 3/day',
|
||||
'priceMod': 1000, 'egoMod': 1};
|
||||
case (roll <= 70):
|
||||
return {'description': 'Item has 10 ranks in ' + Intelligence.getSkill(),
|
||||
'priceMod': 10000, 'egoMod': 2};
|
||||
case (roll <= 75):
|
||||
return {'description': 'Item can change shape into one other form of the same size',
|
||||
'priceMod': 10000, 'egoMod': 2};
|
||||
case (roll <= 80):
|
||||
return {'description': 'Item can fly, as per the spell, at a speed of 30 feet',
|
||||
'priceMod': 10000, 'egoMod': 2};
|
||||
case (roll <= 85):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(4).name + ' 1/day',
|
||||
'priceMod': 11200, 'egoMod': 2};
|
||||
case (roll <= 90):
|
||||
return {'description': 'Item can cast teleport itself 1/day',
|
||||
'priceMod': 15000, 'egoMod': 2};
|
||||
case (roll <= 95):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(3).name + ' 3/day',
|
||||
'priceMod': 18000, 'egoMod': 2};
|
||||
case (roll <= 100):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(4).name + ' 3/day',
|
||||
'priceMod': 33600, 'egoMod': 2};
|
||||
}
|
||||
};
|
||||
|
||||
//this one was also a bit messy
|
||||
//item_purpose = [description, ego modifier]
|
||||
Intelligence.getItemPurpose = function() {
|
||||
var roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 20):
|
||||
return {'description': 'Defeat/slay diametrically opposed alignment',
|
||||
'egoMod': 2};
|
||||
case (roll <= 30):
|
||||
return {'description': 'Defeat/slay arcane spellcasters (including spellcasting monsters and those that use spell-like abilities)',
|
||||
'egoMod': 2};
|
||||
case (roll <= 40):
|
||||
return {'description': 'Defeat/slay divine spellcasters (including divine entities and servitors)',
|
||||
'egoMod': 2};
|
||||
case (roll <= 50):
|
||||
return {'description': 'Defeat/slay non-spellcasters',
|
||||
'egoMod': 2};
|
||||
case (roll <= 55):
|
||||
return {'description': 'Defeat/slay all ' + Weapons.getBane().slice(8), //this probably isn't quite right but we'll keep it for now',
|
||||
'egoMod': 2};
|
||||
case (roll <= 60):
|
||||
return {'description': 'Defeat/slay all ' + _.sample(['Humanoids (' + Grimoire.getHumanoidType() + ')', 'Outsiders (' + Grimoire.getOutsiderType() + ')']),
|
||||
'egoMod': 2};
|
||||
case (roll <= 70):
|
||||
return {'description': 'Defend all ' + _.sample(['Humanoids (' + Grimoire.getHumanoidType() + ')', 'Outsiders (' + Grimoire.getOutsiderType() + ')']),
|
||||
'egoMod': 2};
|
||||
case (roll <= 80):
|
||||
return {'description': 'Defeat/slay the servants of ' + Grimoire.getDeity(),
|
||||
'egoMod': 2};
|
||||
case (roll <= 90):
|
||||
return {'description': 'Defend the servants of ' + Grimoire.getDeity(),
|
||||
'egoMod': 2};
|
||||
case (roll <= 95):
|
||||
return {'description': 'Defeat/slay all (other than the item and the wielder)',
|
||||
'egoMod': 2};
|
||||
case (roll <= 100):
|
||||
return {'description': 'Make something up! (GM discression)',
|
||||
'egoMod': 2};
|
||||
}
|
||||
};
|
||||
|
||||
//another messy one
|
||||
//dedicated_power = [description, base price modifier, ego modifier]
|
||||
Intelligence.getDedicatedPower = function() {
|
||||
var roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 20):
|
||||
return {'description': 'Item can detect any special purpose foes within 60 feet',
|
||||
'priceMod': 10000, 'egoMod': 1};
|
||||
case (roll <= 35):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(4).name + ' at will',
|
||||
'priceMod': 56000, 'egoMod': 2};
|
||||
case (roll <= 50):
|
||||
return {'description': 'Wielder gets +2 luck bonus on attacks, saves, and checks',
|
||||
'priceMod': 80000, 'egoMod': 2};
|
||||
case (roll <= 65):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(5).name + ' at will',
|
||||
'priceMod': 90000, 'egoMod': 2};
|
||||
case (roll <= 80):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(6).name + ' at will',
|
||||
'priceMod': 132000, 'egoMod': 2};
|
||||
case (roll <= 95):
|
||||
return {'description': 'Item can cast ' + Spells.getLevelSpell(7).name + ' at will',
|
||||
'priceMod': 182000, 'egoMod': 2};
|
||||
case (roll <= 100):
|
||||
return {'description': 'Item can cast true resurrection on weilder, once per month',
|
||||
'priceMod': 200000, 'egoMod': 2};
|
||||
}
|
||||
};
|
||||
|
||||
Intelligence.communication = [
|
||||
{'description': 'Empathy', 'priceMod': 0, 'egoMod': 0},
|
||||
{'description': 'Speech', 'priceMod': 500, 'egoMod': 0},
|
||||
{'description': 'Telepathy', 'priceMod': 1000, 'egoMod': 1},
|
||||
];
|
||||
Intelligence.basicSenses = [
|
||||
{'description': 'Senses (30 ft.)', 'priceMod': 0, 'egoMod': 0},
|
||||
{'description': 'Senses (60 ft.)', 'priceMod': 500, 'egoMod': 0},
|
||||
{'description': 'Senses (120 ft.)', 'priceMod': 1000, 'egoMod': 0},
|
||||
];
|
||||
Intelligence.specialSenses = [
|
||||
{'description': '', 'priceMod': 0, 'egoMod': 0},
|
||||
{'description': 'Darkvision', 'priceMod': 500, 'egoMod': 0},
|
||||
{'description': 'Blindsense', 'priceMod': 5000, 'egoMod': 1},
|
||||
{'description': 'Read languages', 'priceMod': 1000, 'egoMod': 1},
|
||||
{'description': 'Read magic', 'priceMod': 2000, 'egoMod': 1},
|
||||
];
|
||||
|
||||
//Common was left out since ALL intelligent items speak common
|
||||
//Druidic was left out since only Druids know it
|
||||
//I was thinking of separating languages into generally 'good' or 'evil' but realized that was more up to DM discression
|
||||
Intelligence.languages = ['Abyssal', 'Aklo', 'Aquan', 'Auran', 'Celestial', 'Draconic',
|
||||
'Dwarven', 'Elven', 'Giant', 'Gnome', 'Goblin', 'Gnoll', 'Halfling',
|
||||
'Ignan', 'Infernal', 'Orc', 'Sylvan', 'Terran', 'Undercommon'];
|
||||
|
||||
//returns ['all stats, powers, and abilities', cost]
|
||||
Intelligence.getItemIntelligence = function(basePrice) {
|
||||
var cost = 500 + (basePrice === undefined ? 0 : basePrice);
|
||||
var ego = 0;
|
||||
switch(true) {
|
||||
case (basePrice <= 1000): ego += 0; break;
|
||||
case (basePrice <= 5000): ego += 1; break;
|
||||
case (basePrice <= 10000): ego += 2; break;
|
||||
case (basePrice <= 20000): ego += 3; break;
|
||||
case (basePrice <= 50000): ego += 4; break;
|
||||
case (basePrice <= 100000): ego += 6; break;
|
||||
case (basePrice <= 200000): ego += 8; break;
|
||||
case (basePrice > 200000): ego += 12; break;
|
||||
}
|
||||
|
||||
var sInt = Intelligence.getAbilityScore();
|
||||
var sCha = Intelligence.getAbilityScore();
|
||||
var sWis = Intelligence.getAbilityScore();
|
||||
|
||||
cost += sInt.priceMod + sCha.priceMod + sWis.priceMod;
|
||||
ego += sInt.egoMod + sCha.egoMod + sWis.egoMod;
|
||||
|
||||
var languages = ['Common'];
|
||||
var bonusLanguages = Math.floor((sInt.score-10)/2);
|
||||
//extra languages will be calculated after we see if it picked up ranks in Linguistics
|
||||
|
||||
var communication = {};
|
||||
var roll = _.random(1,100);
|
||||
//get communication ability for the item. there was no roll table so I made this up
|
||||
switch(true) {
|
||||
case (roll <= 30): communication = Intelligence.communication[0]; break;
|
||||
case (roll <= 70): communication = Intelligence.communication[1]; break;
|
||||
case (roll <= 100): communication = Intelligence.communication[2]; break;
|
||||
}
|
||||
var basicSenses = {};
|
||||
//get senses for the item. there was no roll table so I made this up
|
||||
roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 50): basicSenses = Intelligence.basicSenses[0]; break;
|
||||
case (roll <= 80): basicSenses = Intelligence.basicSenses[1]; break;
|
||||
case (roll <= 100): basicSenses = Intelligence.basicSenses[2]; break;
|
||||
}
|
||||
var specialSenses = {};
|
||||
//get special senses for the item. there was no roll table so I made this up
|
||||
//and limited it to only 1 special per item
|
||||
roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 50): specialSenses = Intelligence.specialSenses[0]; break;
|
||||
case (roll <= 70): specialSenses = Intelligence.specialSenses[0]; break;
|
||||
case (roll <= 75): specialSenses = Intelligence.specialSenses[0]; break;
|
||||
case (roll <= 90): specialSenses = Intelligence.specialSenses[0]; break;
|
||||
case (roll <= 100): specialSenses = Intelligence.specialSenses[0]; break;
|
||||
}
|
||||
cost += communication.priceMod + basicSenses.priceMod + specialSenses.priceMod;
|
||||
ego += communication.egoMod + basicSenses.egoMod + specialSenses.egoMod;
|
||||
|
||||
|
||||
//Get item powers!
|
||||
//So I was thinking of making the number of powers an item had somewhat based on the base cost
|
||||
//but decided to instead roll it pure random items randomly get between 1-5 powers
|
||||
//There is the possibility to get repeats of the SAME power
|
||||
//In that case, I guess you would just add the numerical parts
|
||||
// eg if 'fly at 30 ft/round' is rolled twice, it becomes 'fly at 60 ft/round'
|
||||
var powers = [];
|
||||
_.times(_.random(1,5), function() {
|
||||
var power = Intelligence.getItemPower();
|
||||
powers.push(power);
|
||||
cost += power.priceMod;
|
||||
ego += power.egoMod;
|
||||
if(power.description.indexOf('linguistics') >= 0) {
|
||||
bonusLanguages += parseInt(power.description.match(/\d+/)[0]);
|
||||
}
|
||||
});
|
||||
|
||||
//add any extra languages to the known languages list
|
||||
languages = _(languages).concat(_.sample(Intelligence.languages, bonusLanguages)).value();
|
||||
|
||||
//determining purpose
|
||||
//there was NO roll chart for determining if an item has a purpose so I made this up
|
||||
//I figure 20% of the time sounds good
|
||||
|
||||
var purpose = {'description':'', 'egoMod': 0};
|
||||
var dedicatedPowers = [];
|
||||
if(_.random(1,100) > 80) {
|
||||
purpose = Intelligence.getItemPurpose();
|
||||
ego += purpose.egoMod;
|
||||
|
||||
var pPowersNum = 1;
|
||||
//I decided that purposed items get between 1-3 dedicated powers, heavily leaning on 1
|
||||
roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 70): pPowersNum = 1; break;
|
||||
case (roll <= 90): pPowersNum = 2; break;
|
||||
case (roll <= 100): pPowersNum = 3; break;
|
||||
}
|
||||
|
||||
_.times(pPowersNum, function() {
|
||||
var pPower = Intelligence.getDedicatedPower();
|
||||
dedicatedPowers.push(pPower);
|
||||
cost += pPower.priceMod;
|
||||
ego += pPower.egoMod;
|
||||
});
|
||||
}
|
||||
|
||||
var item = {};
|
||||
item.alignment = Grimoire.getAlignment();
|
||||
item.ego = ego;
|
||||
item.intScore = sInt.score;
|
||||
item.chaScore = sCha.score;
|
||||
item.wisScore = sWis.score;
|
||||
|
||||
item.communication = communication;
|
||||
item.languages = languages;
|
||||
|
||||
item.basicSenses = basicSenses;
|
||||
item.specialSenses = specialSenses;
|
||||
|
||||
item.powers = powers;
|
||||
item.purpose = purpose;
|
||||
item.dedicatedPowers = dedicatedPowers;
|
||||
item.cost = cost;
|
||||
item.print = function() {
|
||||
var retStr = 'Alignment: ' + this.alignment +
|
||||
'; Stats: Ego ' + this.ego + ' Int ' + this.intScore + ' Cha ' + this.chaScore + ' Wis ' + this.wisScore +
|
||||
'; Communication: ' + this.communication.description;
|
||||
this.languages.forEach(function(l, index) { retStr += ((index === 0) ? '; Languages: ' : ', ') + l;});
|
||||
retStr += '; Senses: ' + basicSenses.description + (!specialSenses.description) ? '' : (', ' + specialSenses.description);
|
||||
this.powers.forEach(function(p, index) {
|
||||
retStr += ((index === 0) ? '; Powers: ' : ', ') + p.description;
|
||||
});
|
||||
if(this.purpose.description) {
|
||||
retStr += '; Purpose: ' + this.purpose.description;
|
||||
this.dedicatedPowers.forEach(function(p, index) {
|
||||
retStr += ((index === 0) ? ', Dedicated Powers: ' : ', ') + p.description;
|
||||
});
|
||||
}
|
||||
retStr += '; Cost: ' + this.cost;
|
||||
return retStr;
|
||||
};
|
||||
|
||||
return item;
|
||||
};
|
||||
/*
|
||||
|
||||
|
||||
purpose += ' Dedicated Powers: '
|
||||
first = true
|
||||
purpose_powers_num.times{
|
||||
purpose_power, cost_bonus, ego_bonus = get_dedicated_power()
|
||||
if first
|
||||
purpose += purpose_power
|
||||
first = false
|
||||
else
|
||||
purpose += ', ' + purpose_power
|
||||
end
|
||||
cost += cost_bonus
|
||||
ego += ego_bonus
|
||||
}
|
||||
end
|
||||
return ['Alignment: ' + alignment + ' Stats: Ego ' + ego.to_s + ' Int ' + stat_int.to_s + ' Cha ' + stat_cha.to_s + ' Wis ' +
|
||||
stat_wis.to_s + senses_and_communication + item_languages + powers + purpose, cost]
|
||||
end
|
||||
|
||||
end
|
||||
*/
|
||||
+417
@@ -0,0 +1,417 @@
|
||||
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.
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
var Potions = {}
|
||||
|
||||
Potions.baseUrl = "http://paizo.com/pathfinderRPG/prd/spells/bleed.html";
|
||||
//list of potion-able spells taken from
|
||||
//http://paizo.com/threads/rzs2loj8?Alchemists-Lab-Potion-List-and-Questions
|
||||
//TODO: implement url list later
|
||||
Potions.getPotions = function() {
|
||||
return [
|
||||
/*level 0*/['Bleed','Touch of Fatigue','Resistance','Stabilize','Guidance'],
|
||||
/*level 1*/['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'],
|
||||
/*level 2*/['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'],
|
||||
/*level 3*/['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']
|
||||
];
|
||||
};
|
||||
Potions.cost = [25, 50, 300, 750];
|
||||
|
||||
Potions.getLevelPotion = function(level) {
|
||||
if(level < 0 || level > 3) return;
|
||||
var potion = _.sample(Potions.getPotions()[level]);
|
||||
return {"name": "Potion/Oil of " + potion,
|
||||
"description": "(spell level " + level + ", caster level " + _.max([1, (level*2-1)]) + ")",
|
||||
"cost": Potions.cost[level]
|
||||
};
|
||||
};
|
||||
|
||||
Potions.getPotion = function(type) {
|
||||
var roll = _.random(1,100);
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 20): return Potions.getLevelPotion(0); break;
|
||||
case (roll <= 60): return Potions.getLevelPotion(1); break;
|
||||
case (roll <= 100): return Potions.getLevelPotion(2); break;
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 20): return Potions.getLevelPotion(1); break;
|
||||
case (roll <= 60): return Potions.getLevelPotion(2); break;
|
||||
case (roll <= 100): return Potions.getLevelPotion(3); break;
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 20): return Potions.getLevelPotion(2); break;
|
||||
case (roll <= 100): return Potions.getLevelPotion(3); break;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,174 @@
|
||||
/*global _:false */
|
||||
'use strict';
|
||||
var Rings = {};
|
||||
Rings.getRingsAll = function() {
|
||||
return [
|
||||
{
|
||||
'name': 'Core Rule Book',
|
||||
'shortName': 'CRB',
|
||||
'baseUrl': 'http://paizo.com/pathfinderRPG/prd/magicItems/rings.html',
|
||||
'items' : [
|
||||
{ 'name' : 'Ring of Protection +1', 'cost' : 2000, 'url' : '#_ring-of-protection' },
|
||||
{ 'name' : 'Ring of Feather falling', 'cost' : 2200, 'url' : '' },
|
||||
{ 'name' : 'Ring of Sustenance', 'cost' : 2500, 'url' : '' },
|
||||
{ 'name' : 'Ring of Climbing', 'cost' : 2500, 'url' : '' },
|
||||
{ 'name' : 'Ring of Jumping', 'cost' : 2500, 'url' : '' },
|
||||
{ 'name' : 'Ring of Swimming', 'cost' : 2500, 'url' : '' },
|
||||
{ 'name' : 'Ring of Counterspells', 'cost' : 400, 'url' : '' },
|
||||
{ 'name' : 'Ring of Mind shielding', 'cost' : 800, 'url' : '' },
|
||||
{ 'name' : 'Ring of Protection +2', 'cost' : 800, 'url' : '' },
|
||||
{ 'name' : 'Ring of Force shield', 'cost' : 8500, 'url' : '' },
|
||||
{ 'name' : 'Ring of the Ram', 'cost' : 8600, 'url' : '' },
|
||||
{ 'name' : 'Ring of Climbing, improved', 'cost' : 1000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Jumping, improved', 'cost' : 1000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Swimming, improved', 'cost' : 1000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Animal friendship', 'cost' : 10800, 'url' : '' },
|
||||
{ 'name' : 'Ring of Energy resistance, minor', 'cost' : 1200, 'url' : '' },
|
||||
{ 'name' : 'Ring of Chameleon power', 'cost' : 12700, 'url' : '' },
|
||||
{ 'name' : 'Ring of Water walking', 'cost' : 1500, 'url' : '' },
|
||||
{ 'name' : 'Ring of Protection +3', 'cost' : 1800, 'url' : '' },
|
||||
{ 'name' : 'Ring of Spell storing, minor', 'cost' : 1800, 'url' : '' },
|
||||
{ 'name' : 'Ring of Invisibility', 'cost' : 2000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Wizardry (I)', 'cost' : 2000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Evasion', 'cost' : 2500, 'url' : '' },
|
||||
{ 'name' : 'Ring of X-ray vision', 'cost' : 2500, 'url' : '' },
|
||||
{ 'name' : 'Ring of Blinking', 'cost' : 2700, 'url' : '' },
|
||||
{ 'name' : 'Ring of Energy resistance, major', 'cost' : 2800, 'url' : '' },
|
||||
{ 'name' : 'Ring of Protection +4', 'cost' : 3200, 'url' : '' },
|
||||
{ 'name' : 'Ring of Wizardry (II)', 'cost' : 4000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Freedom of movement', 'cost' : 4000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Energy resistance, greater', 'cost' : 4400, 'url' : '' },
|
||||
{ 'name' : 'Ring of Friend shield (pair)', 'cost' : 5000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Protection +5', 'cost' : 5000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Shooting stars', 'cost' : 5000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Spell storing', 'cost' : 5000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Wizardry (III)', 'cost' : 7000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Telekinesis', 'cost' : 7500, 'url' : '' },
|
||||
{ 'name' : 'Ring of Regeneration', 'cost' : 9000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Spell turning', 'cost' : 10000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Wizardry (IV)', 'cost' : 10000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Three wishes', 'cost' : 12000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Djinni calling', 'cost' : 12500, 'url' : '' },
|
||||
{ 'name' : 'Ring of Elemental command (air)', 'cost' : 20000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Elemental command (earth)', 'cost' : 20000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Elemental command (fire)', 'cost' : 20000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Elemental command (water)', 'cost' : 20000, 'url' : '' },
|
||||
{ 'name' : 'Ring of Spell storing, major', 'cost' : 2000, 'url' : '' },
|
||||
]
|
||||
},
|
||||
{
|
||||
'name': 'Advanced Player\'s Guide',
|
||||
'shortName': 'APG',
|
||||
'baseUrl': 'http://paizo.com/pathfinderRPG/prd/advanced/magicItems/rings.html',
|
||||
'items' : [
|
||||
{ 'name' : 'Dungeon ring, prisoner\'s', 'cost': 250, 'url': '#dungeon-ring'},
|
||||
{ 'name' : 'Arcane signets', 'cost': 1000, 'url': '' },
|
||||
{ 'name' : 'Maniacal Devices', 'cost': 5000, 'url': '' },
|
||||
{ 'name' : 'Delayed doom (1 stone)', 'cost': 5000, 'url': '' },
|
||||
{ 'name' : 'Forcefangs', 'cost': 8000, 'url': '' },
|
||||
{ 'name' : 'Revelation, lesser', 'cost': 10000, 'url': '' },
|
||||
{ 'name' : 'Delayed doom (2 stones)', 'cost': 10000, 'url': '' },
|
||||
{ 'name' : 'Delayed doom (3 stones)', 'cost': 15000, 'url': '' },
|
||||
{ 'name' : 'Retribution', 'cost': 15000, 'url': '' },
|
||||
{ 'name' : 'Dungeon ring, jailer\'s', 'cost': 16000, 'url': '' },
|
||||
{ 'name' : 'Revelation, greater', 'cost': 16000, 'url': '' },
|
||||
{ 'name' : 'Delayed doom (4 stones)', 'cost': 20000, 'url': '' },
|
||||
{ 'name' : 'Revelation, superior', 'cost': 24000, 'url': '' },
|
||||
{ 'name' : 'Delayed doom (5 stones)', 'cost': 25000, 'url': '' },
|
||||
{ 'name' : 'Delayed doom (6 stones)', 'cost': 30000, 'url': '' },
|
||||
{ 'name' : 'Delayed doom (7 stones)', 'cost': 35000, 'url': '' },
|
||||
{ 'name' : 'Delayed doom (8 stones)', 'cost': 40000, 'url': '' },
|
||||
{ 'name' : 'Delayed doom (9 stones)', 'cost': 45000, 'url': '' },
|
||||
]
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
Rings.getRings = function() {
|
||||
return Rings.getRingsAll()[0].items;
|
||||
};
|
||||
|
||||
Rings.getRing = function(type) {
|
||||
var roll = _.random(1,100);
|
||||
var ring = '';
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 18): ring = Rings.getRings()[0]; break;
|
||||
case (roll <= 28): ring = Rings.getRings()[1]; break;
|
||||
case (roll <= 36): ring = Rings.getRings()[2]; break;
|
||||
case (roll <= 44): ring = Rings.getRings()[3]; break;
|
||||
case (roll <= 52): ring = Rings.getRings()[4]; break;
|
||||
case (roll <= 60): ring = Rings.getRings()[5]; break;
|
||||
case (roll <= 70): ring = Rings.getRings()[6]; break;
|
||||
case (roll <= 75): ring = Rings.getRings()[7]; break;
|
||||
case (roll <= 80): ring = Rings.getRings()[8]; break;
|
||||
case (roll <= 85): ring = Rings.getRings()[9]; break;
|
||||
case (roll <= 90): ring = Rings.getRings()[10]; break;
|
||||
case (roll <= 93): ring = Rings.getRings()[14]; break;
|
||||
case (roll <= 96): ring = Rings.getRings()[15]; break;
|
||||
case (roll <= 98): ring = Rings.getRings()[16]; break;
|
||||
case (roll <= 100): ring = Rings.getRings()[17]; break;
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 5): ring = Rings.getRings()[6]; break;
|
||||
case (roll <= 8): ring = Rings.getRings()[7]; break;
|
||||
case (roll <= 18): ring = Rings.getRings()[8]; break;
|
||||
case (roll <= 23): ring = Rings.getRings()[9]; break;
|
||||
case (roll <= 28): ring = Rings.getRings()[10]; break;
|
||||
case (roll <= 34): ring = Rings.getRings()[11]; break;
|
||||
case (roll <= 40): ring = Rings.getRings()[12]; break;
|
||||
case (roll <= 46): ring = Rings.getRings()[13]; break;
|
||||
case (roll <= 50): ring = Rings.getRings()[14]; break;
|
||||
case (roll <= 56): ring = Rings.getRings()[15]; break;
|
||||
case (roll <= 61): ring = Rings.getRings()[16]; break;
|
||||
case (roll <= 66): ring = Rings.getRings()[17]; break;
|
||||
case (roll <= 71): ring = Rings.getRings()[18]; break;
|
||||
case (roll <= 76): ring = Rings.getRings()[19]; break;
|
||||
case (roll <= 81): ring = Rings.getRings()[20]; break;
|
||||
case (roll <= 85): ring = Rings.getRings()[21]; break;
|
||||
case (roll <= 90): ring = Rings.getRings()[22]; break;
|
||||
case (roll <= 93): ring = Rings.getRings()[23]; break;
|
||||
case (roll <= 97): ring = Rings.getRings()[24]; break;
|
||||
case (roll <= 100): ring = Rings.getRings()[25]; break;
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 2): ring = Rings.getRings()[15]; break;
|
||||
case (roll <= 7): ring = Rings.getRings()[18]; break;
|
||||
case (roll <= 10): ring = Rings.getRings()[19]; break;
|
||||
case (roll <= 15): ring = Rings.getRings()[20]; break;
|
||||
case (roll <= 19): ring = Rings.getRings()[21]; break;
|
||||
case (roll <= 25): ring = Rings.getRings()[22]; break;
|
||||
case (roll <= 28): ring = Rings.getRings()[23]; break;
|
||||
case (roll <= 32): ring = Rings.getRings()[24]; break;
|
||||
case (roll <= 39): ring = Rings.getRings()[25]; break;
|
||||
case (roll <= 49): ring = Rings.getRings()[26]; break;
|
||||
case (roll <= 55): ring = Rings.getRings()[27]; break;
|
||||
case (roll <= 60): ring = Rings.getRings()[28]; break;
|
||||
case (roll <= 63): ring = Rings.getRings()[29]; break;
|
||||
case (roll <= 65): ring = Rings.getRings()[30]; break;
|
||||
case (roll <= 70): ring = Rings.getRings()[31]; break;
|
||||
case (roll <= 74): ring = Rings.getRings()[32]; break;
|
||||
case (roll <= 79): ring = Rings.getRings()[33]; break;
|
||||
case (roll <= 83): ring = Rings.getRings()[34]; break;
|
||||
case (roll <= 86): ring = Rings.getRings()[35]; break;
|
||||
case (roll <= 88): ring = Rings.getRings()[36]; break;
|
||||
case (roll <= 91): ring = Rings.getRings()[37]; break;
|
||||
case (roll <= 93): ring = Rings.getRings()[38]; break;
|
||||
case (roll == 94): ring = Rings.getRings()[39]; break;
|
||||
case (roll == 95): ring = Rings.getRings()[40]; break;
|
||||
case (roll == 96): ring = Rings.getRings()[41]; break;
|
||||
case (roll == 97): ring = Rings.getRings()[42]; break;
|
||||
case (roll == 98): ring = Rings.getRings()[43]; break;
|
||||
case (roll == 99): ring = Rings.getRings()[44]; break;
|
||||
case (roll == 100): ring = Rings.getRings()[45]; break;
|
||||
}
|
||||
}
|
||||
if(_.random(1,100) <= 30) {
|
||||
ring.name += ' (with a clue as to its purpose)';
|
||||
}
|
||||
return ring;
|
||||
};
|
||||
@@ -0,0 +1,247 @@
|
||||
/*global _:false, console:true */
|
||||
/*global Intelligence:true */
|
||||
'use strict';
|
||||
var Rods = {};
|
||||
Rods.getAllRods = function() {
|
||||
return [
|
||||
{'name': 'Core Rule Book',
|
||||
'shortName': 'CRB',
|
||||
'baseUrl': 'http://paizo.com/pathfinderRPG/prd/magicItems/rods.html',
|
||||
'count': {'medium': 17, 'major': 29},
|
||||
'items': [
|
||||
{'name': 'Rod of Metamagic, Enlarge, lesser', 'cost': 3000, 'url': '#metamagic-enlarge'},
|
||||
{'name': 'Rod of Metamagic, Extend, lesser', 'cost': 3000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Silent, lesser', 'cost': 3000, 'url': ''},
|
||||
{'name': 'Rod of Immovable', 'cost': 5000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Empower, lesser', 'cost': 9000, 'url': ''},
|
||||
{'name': 'Rod of Metal and mineral detection', 'cost': 10500, 'url': ''},
|
||||
{'name': 'Rod of Cancellation', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Enlarge', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Extend', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Silent', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Wonder', 'cost': 12000, 'url': ''},
|
||||
{'name': 'Rod of Python', 'cost': 13000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Maximize, lesser', 'cost': 14000, 'url': ''},
|
||||
{'name': 'Rod of Flame extinguishing', 'cost': 15000, 'url': ''},
|
||||
{'name': 'Rod of Viper', 'cost': 19000, 'url': ''},
|
||||
{'name': 'Rod of Enemy detection', 'cost': 23500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Enlarge, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Extend, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Silent, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Splendor', 'cost': 25000, 'url': ''},
|
||||
{'name': 'Rod of Withering', 'cost': 25000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Empower', 'cost': 32500, 'url': ''},
|
||||
{'name': 'Rod of Thunder and lightning', 'cost': 33000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Quicken, lesser', 'cost': 35000, 'url': ''},
|
||||
{'name': 'Rod of Negation', 'cost': 37000, 'url': ''},
|
||||
{'name': 'Rod of Absorption', 'cost': 50000, 'url': ''},
|
||||
{'name': 'Rod of Flailing', 'cost': 50000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Maximize', 'cost': 54000, 'url': ''},
|
||||
{'name': 'Rod of Rulership', 'cost': 60000, 'url': ''},
|
||||
{'name': 'Rod of Security', 'cost': 61000, 'url': ''},
|
||||
{'name': 'Rod of Lordly might', 'cost': 70000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Empower, greater', 'cost': 73000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Quicken', 'cost': 75500, 'url': ''},
|
||||
{'name': 'Rod of Alertness', 'cost': 85000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Maximize, greater', 'cost': 121500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, Quicken, greater', 'cost': 170000, 'url': ''},
|
||||
]},
|
||||
{'name': 'Advanced Player\'s Guide',
|
||||
'shortName': 'APG',
|
||||
'baseUrl': 'http://paizo.com/pathfinderRPG/prd/advanced/magicItems/rods.html',
|
||||
'count': {'medium': 25, 'major': 28},
|
||||
'items': [
|
||||
{'name': 'Rod of Metamagic, merciful, lesser', 'cost': 1500, 'url': '#metamagic,-merciful'},
|
||||
{'name': 'Rod of Metamagic, bouncing, lesser', 'cost': 3000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, disruptive, lesser', 'cost': 3000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, ectoplasmic, lesser', 'cost': 3000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, elemental, lesser', 'cost': 3000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, focused, lesser', 'cost': 3000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, intensified, lesser', 'cost': 3000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, lingering, lesser', 'cost': 3000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, reach, lesser', 'cost': 3000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, selective, lesser', 'cost': 3000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, merciful', 'cost': 5500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, persistent, lesser', 'cost': 9000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, sickening, lesser', 'cost': 9000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, thundering, lesser', 'cost': 9000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, bouncing', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, disruptive', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, ectoplasmic', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, elemental', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, focused', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, intensified', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, lingering', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, reach', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, selective', 'cost': 11000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, merciful, greater', 'cost': 12250, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, dazing, lesser', 'cost': 14000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, bouncing, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, disruptive, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, ectoplasmic, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, elemental, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, focused, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, intensified, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, lingering, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, reach, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, selective, greater', 'cost': 24500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, persistent', 'cost': 32500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, sickening', 'cost': 32500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, thundering', 'cost': 32500, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, dazing', 'cost': 54000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, persistent, greater', 'cost': 73000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, sickening, greater', 'cost': 73000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, thundering, greater', 'cost': 73000, 'url': ''},
|
||||
{'name': 'Rod of Metamagic, dazing, greater', 'cost': 121500, 'url': ''},
|
||||
]}
|
||||
];
|
||||
};
|
||||
|
||||
Rods.getRod = function(type, source) {
|
||||
var roll = _.random(1,100);
|
||||
var rod = {};
|
||||
if(source === undefined) {
|
||||
source = 'CRB';
|
||||
}
|
||||
|
||||
if(type == 'minor') {
|
||||
console.log('Error: There are no minor rods');
|
||||
return;
|
||||
}
|
||||
|
||||
var sourceRods = _.findWhere(Rods.getAllRods(), function(s) {
|
||||
return s.shortName == source.toUpperCase();
|
||||
}).items;
|
||||
|
||||
if(source.toUpperCase() == 'CRB')
|
||||
{
|
||||
if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 7): rod = sourceRods[0]; break;
|
||||
case (roll <= 14): rod = sourceRods[1]; break;
|
||||
case (roll <= 21): rod = sourceRods[2]; break;
|
||||
case (roll <= 28): rod = sourceRods[3]; break;
|
||||
case (roll <= 35): rod = sourceRods[4]; break;
|
||||
case (roll <= 42): rod = sourceRods[5]; break;
|
||||
case (roll <= 53): rod = sourceRods[6]; break;
|
||||
case (roll <= 57): rod = sourceRods[7]; break;
|
||||
case (roll <= 61): rod = sourceRods[8]; break;
|
||||
case (roll <= 65): rod = sourceRods[9]; break;
|
||||
case (roll <= 71): rod = sourceRods[10]; break;
|
||||
case (roll <= 79): rod = sourceRods[11]; break;
|
||||
case (roll <= 83): rod = sourceRods[12]; break;
|
||||
case (roll <= 89): rod = sourceRods[13]; break;
|
||||
case (roll <= 97): rod = sourceRods[14]; break;
|
||||
case (roll <= 99): rod = sourceRods[21]; break;
|
||||
case (roll <= 100): rod = sourceRods[23]; break;
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 4): rod = sourceRods[6]; break;
|
||||
case (roll <= 6): rod = sourceRods[7]; break;
|
||||
case (roll <= 8): rod = sourceRods[8]; break;
|
||||
case (roll <= 10): rod = sourceRods[9]; break;
|
||||
case (roll <= 14): rod = sourceRods[10]; break;
|
||||
case (roll <= 19): rod = sourceRods[11]; break;
|
||||
case (roll <= 21): rod = sourceRods[13]; break;
|
||||
case (roll <= 25): rod = sourceRods[14]; break;
|
||||
case (roll <= 30): rod = sourceRods[15]; break;
|
||||
case (roll <= 36): rod = sourceRods[16]; break;
|
||||
case (roll <= 42): rod = sourceRods[17]; break;
|
||||
case (roll <= 48): rod = sourceRods[18]; break;
|
||||
case (roll <= 53): rod = sourceRods[19]; break;
|
||||
case (roll <= 58): rod = sourceRods[20]; break;
|
||||
case (roll <= 64): rod = sourceRods[21]; break;
|
||||
case (roll <= 69): rod = sourceRods[22]; break;
|
||||
case (roll <= 73): rod = sourceRods[23]; break;
|
||||
case (roll <= 77): rod = sourceRods[24]; break;
|
||||
case (roll <= 80): rod = sourceRods[25]; break;
|
||||
case (roll <= 84): rod = sourceRods[26]; break;
|
||||
case (roll <= 86): rod = sourceRods[27]; break;
|
||||
case (roll <= 88): rod = sourceRods[28]; break;
|
||||
case (roll <= 90): rod = sourceRods[29]; break;
|
||||
case (roll <= 92): rod = sourceRods[30]; break;
|
||||
case (roll <= 94): rod = sourceRods[31]; break;
|
||||
case (roll <= 96): rod = sourceRods[32]; break;
|
||||
case (roll <= 98): rod = sourceRods[33]; break;
|
||||
case (roll <= 99): rod = sourceRods[34]; break;
|
||||
case (roll <= 100): rod = sourceRods[35]; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(source.toUpperCase() == 'APG') {
|
||||
if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 3): rod = sourceRods[0]; break;
|
||||
case (roll <= 6): rod = sourceRods[1]; break;
|
||||
case (roll <= 11): rod = sourceRods[2]; break;
|
||||
case (roll <= 21): rod = sourceRods[3]; break;
|
||||
case (roll <= 27): rod = sourceRods[4]; break;
|
||||
case (roll <= 33): rod = sourceRods[5]; break;
|
||||
case (roll <= 36): rod = sourceRods[6]; break;
|
||||
case (roll <= 39): rod = sourceRods[7]; break;
|
||||
case (roll <= 43): rod = sourceRods[8]; break;
|
||||
case (roll <= 53): rod = sourceRods[9]; break;
|
||||
case (roll <= 55): rod = sourceRods[10]; break;
|
||||
case (roll <= 58): rod = sourceRods[11]; break;
|
||||
case (roll <= 62): rod = sourceRods[12]; break;
|
||||
case (roll <= 66): rod = sourceRods[13]; break;
|
||||
case (roll <= 70): rod = sourceRods[14]; break;
|
||||
case (roll <= 74): rod = sourceRods[15]; break;
|
||||
case (roll <= 80): rod = sourceRods[16]; break;
|
||||
case (roll <= 83): rod = sourceRods[17]; break;
|
||||
case (roll <= 86): rod = sourceRods[18]; break;
|
||||
case (roll <= 88): rod = sourceRods[19]; break;
|
||||
case (roll <= 90): rod = sourceRods[20]; break;
|
||||
case (roll <= 93): rod = sourceRods[21]; break;
|
||||
case (roll <= 97): rod = sourceRods[22]; break;
|
||||
case (roll <= 98): rod = sourceRods[23]; break;
|
||||
case (roll <= 100): rod = sourceRods[24]; break;
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 3): rod = sourceRods[14]; break;
|
||||
case (roll <= 9): rod = sourceRods[15]; break;
|
||||
case (roll <= 20): rod = sourceRods[16]; break;
|
||||
case (roll <= 28): rod = sourceRods[17]; break;
|
||||
case (roll <= 36): rod = sourceRods[18]; break;
|
||||
case (roll <= 39): rod = sourceRods[19]; break;
|
||||
case (roll <= 43): rod = sourceRods[20]; break;
|
||||
case (roll <= 46): rod = sourceRods[21]; break;
|
||||
case (roll <= 54): rod = sourceRods[22]; break;
|
||||
case (roll <= 56): rod = sourceRods[23]; break;
|
||||
case (roll <= 58): rod = sourceRods[24]; break;
|
||||
case (roll <= 60): rod = sourceRods[25]; break;
|
||||
case (roll <= 63): rod = sourceRods[26]; break;
|
||||
case (roll <= 69): rod = sourceRods[27]; break;
|
||||
case (roll <= 73): rod = sourceRods[28]; break;
|
||||
case (roll <= 77): rod = sourceRods[29]; break;
|
||||
case (roll <= 79): rod = sourceRods[30]; break;
|
||||
case (roll <= 80): rod = sourceRods[31]; break;
|
||||
case (roll <= 82): rod = sourceRods[32]; break;
|
||||
case (roll <= 86): rod = sourceRods[33]; break;
|
||||
case (roll <= 89): rod = sourceRods[34]; break;
|
||||
case (roll <= 91): rod = sourceRods[35]; break;
|
||||
case (roll <= 93): rod = sourceRods[36]; break;
|
||||
case (roll <= 95): rod = sourceRods[37]; break;
|
||||
case (roll <= 97): rod = sourceRods[38]; break;
|
||||
case (roll <= 98): rod = sourceRods[39]; break;
|
||||
case (roll <= 99): rod = sourceRods[40]; break;
|
||||
case (roll <= 100): rod = sourceRods[41]; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(rod) {
|
||||
roll = _.random(1,100);
|
||||
if(roll == 1) {
|
||||
rod.name = 'Intelligent ' + rod.name;
|
||||
rod.intelligence = Intelligence.getItemIntelligence(rod.cost);
|
||||
}
|
||||
else if(roll <= 30) {
|
||||
rod.name += ' (with a clue as to its purpose)';
|
||||
}
|
||||
return rod;
|
||||
}
|
||||
};
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
/*global _:false */
|
||||
/*global Spells:true */
|
||||
'use strict';
|
||||
var Scrolls = {};
|
||||
Scrolls.cost = [12.5, 25, 150, 375, 700, 1125, 1650, 2275, 3000, 3825];
|
||||
|
||||
Scrolls.getLevelScroll = function(level, type) {
|
||||
if(level < 0 || level > 9) return;
|
||||
if(type === undefined) {
|
||||
type = _.random(0,1) ? 'arcane' : 'divine';
|
||||
}
|
||||
var spell = Spells.getLevelSpell(level, type);
|
||||
return {'name': 'Scroll of ' + spell.name,
|
||||
'description': '(' + type + ', spell level ' + level + ', caster level ' + _.max([1, (level*2-1)]) + ')',
|
||||
'cost': Scrolls.cost[level],
|
||||
};
|
||||
};
|
||||
|
||||
Scrolls.getScroll = function(type) {
|
||||
var roll = _.random(1,100);
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 5): return Scrolls.getLevelScroll(0);
|
||||
case (roll <= 50): return Scrolls.getLevelScroll(1);
|
||||
case (roll <= 95): return Scrolls.getLevelScroll(2);
|
||||
case (roll <= 100): return Scrolls.getLevelScroll(3);
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 5): return Scrolls.getLevelScroll(2);
|
||||
case (roll <= 65): return Scrolls.getLevelScroll(3);
|
||||
case (roll <= 95): return Scrolls.getLevelScroll(4);
|
||||
case (roll <= 100): return Scrolls.getLevelScroll(5);
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 5): return Scrolls.getLevelScroll(4);
|
||||
case (roll <= 50): return Scrolls.getLevelScroll(5);
|
||||
case (roll <= 70): return Scrolls.getLevelScroll(6);
|
||||
case (roll <= 85): return Scrolls.getLevelScroll(7);
|
||||
case (roll <= 95): return Scrolls.getLevelScroll(8);
|
||||
case (roll <= 100): return Scrolls.getLevelScroll(9);
|
||||
}
|
||||
}
|
||||
};
|
||||
+159
@@ -0,0 +1,159 @@
|
||||
/*global _:false */
|
||||
'use strict';
|
||||
|
||||
//TODO: Program the "Roll twice" logic
|
||||
|
||||
var Shields = {};
|
||||
Shields.specificBaseUrl = 'http://paizo.com/pathfinderRPG/prd/magicItems/armor.html';
|
||||
Shields.getSpecifics = function() {
|
||||
return [
|
||||
{'name': 'Darkwood buckler', 'bonus': 0, 'cost': 203, 'url': '#darkwood-buckler'},
|
||||
{'name': 'Darkwood shield', 'bonus': 0, 'cost': 257, 'url': ''},
|
||||
{'name': 'Mithral heavy shield', 'bonus': 0, 'cost': 1020, 'url': ''},
|
||||
{'name': 'Caster\'s shield', 'bonus': 0, 'cost': 3153, 'url': ''},
|
||||
{'name': 'Spined shield', 'bonus': 0, 'cost': 5580, 'url': ''},
|
||||
{'name': 'Lion\'s shield', 'bonus': 0, 'cost': 9170, 'url': ''},
|
||||
{'name': 'Winged shield', 'bonus': 0, 'cost': 17257, 'url': ''},
|
||||
{'name': 'Absorbing shield', 'bonus': 0, 'cost': 5017, 'url': ''}
|
||||
];
|
||||
};
|
||||
|
||||
Shields.getSpecific = function(type) {
|
||||
var roll = _.random(1,100);
|
||||
var shield = {};
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 30): shield = Shields.getSpecifics()[0]; break;
|
||||
case (roll <= 80): shield = Shields.getSpecifics()[1]; break;
|
||||
case (roll <= 95): shield = Shields.getSpecifics()[2]; break;
|
||||
case (roll <= 100): shield = Shields.getSpecifics()[3]; break;
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 20): shield = Shields.getSpecifics()[0]; break;
|
||||
case (roll <= 45): shield = Shields.getSpecifics()[1]; break;
|
||||
case (roll <= 70): shield = Shields.getSpecifics()[2]; break;
|
||||
case (roll <= 85): shield = Shields.getSpecifics()[3]; break;
|
||||
case (roll <= 90): shield = Shields.getSpecifics()[4]; break;
|
||||
case (roll <= 95): shield = Shields.getSpecifics()[5]; break;
|
||||
case (roll <= 100): shield = Shields.getSpecifics()[6]; break;
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 20): shield = Shields.getSpecifics()[3]; break;
|
||||
case (roll <= 40): shield = Shields.getSpecifics()[4]; break;
|
||||
case (roll <= 62): shield = Shields.getSpecifics()[5]; break;
|
||||
case (roll <= 90): shield = Shields.getSpecifics()[6]; break;
|
||||
case (roll <= 100): shield = Shields.getSpecifics()[7]; break;
|
||||
}
|
||||
}
|
||||
return shield;
|
||||
};
|
||||
|
||||
Shields.getShields = function() {
|
||||
//5 possible roll'able shields. Specific type of shield is left up to DM
|
||||
return [
|
||||
{'name': '+1 shield', 'bonus': 1, 'cost': 1000},
|
||||
{'name': '+2 shield', 'bonus': 2, 'cost': 4000},
|
||||
{'name': '+3 shield', 'bonus': 3, 'cost': 9000},
|
||||
{'name': '+4 shield', 'bonus': 4, 'cost': 16000},
|
||||
{'name': '+5 shield', 'bonus': 5, 'cost': 25000},
|
||||
{'name': '+6 shield', 'bonus': 6, 'cost': 36000},
|
||||
{'name': '+7 shield', 'bonus': 7, 'cost': 49000},
|
||||
{'name': '+8 shield', 'bonus': 8, 'cost': 64000},
|
||||
{'name': '+9 shield', 'bonus': 9, 'cost': 81000},
|
||||
{'name': '+10 shield', 'bonus': 10,'cost': 10000}
|
||||
];
|
||||
};
|
||||
|
||||
Shields.getSpecials = function() {
|
||||
return [
|
||||
{'name': 'Arrow catching', 'bonus': 1, 'cost': 0},
|
||||
{'name': 'Bashing', 'bonus': 1, 'cost': 0},
|
||||
{'name': 'Blinding', 'bonus': 1, 'cost': 0},
|
||||
{'name': 'Light Fortification', 'bonus': 1, 'cost': 0},
|
||||
{'name': 'Arrow deflection', 'bonus': 2, 'cost': 0},
|
||||
{'name': 'Animated', 'bonus': 2, 'cost': 0},
|
||||
{'name': 'Spell resistance (13)', 'bonus': 2, 'cost': 0},
|
||||
{'name': 'Energy resistance', 'bonus': 0, 'cost': 18000},
|
||||
{'name': 'Ghost touch', 'bonus': 3, 'cost': 0},
|
||||
{'name': 'Moderate Fortification', 'bonus': 3, 'cost': 0},
|
||||
{'name': 'Spell resistance (15)', 'bonus': 3, 'cost': 0},
|
||||
{'name': 'Wild', 'bonus': 3, 'cost': 0},
|
||||
{'name': 'Improved Energy resistance', 'bonus': 0, 'cost': 42000},
|
||||
{'name': 'Spell resistance (17)', 'bonus': 4, 'cost': 0},
|
||||
{'name': 'Undead controlling', 'bonus': 0, 'cost': 49000},
|
||||
{'name': 'Fortification, heavy', 'bonus': 5, 'cost': 0},
|
||||
{'name': 'Reflecting', 'bonus': 5, 'cost': 0},
|
||||
{'name': 'Spell resistance (19)', 'bonus': 5, 'cost': 0},
|
||||
{'name': 'Energy resistance, greater', 'bonus': 0, 'cost': 6600}
|
||||
];
|
||||
};
|
||||
|
||||
Shields.getSpecial = function(type) {
|
||||
var roll = _.random(1,100);
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 20): return Shields.getSpecials()[0];
|
||||
case (roll <= 40): return Shields.getSpecials()[1];
|
||||
case (roll <= 50): return Shields.getSpecials()[2];
|
||||
case (roll <= 75): return Shields.getSpecials()[3];
|
||||
case (roll <= 92): return Shields.getSpecials()[4];
|
||||
case (roll <= 97): return Shields.getSpecials()[5];
|
||||
case (roll <= 99): return Shields.getSpecials()[6];
|
||||
case (roll <= 100): /*roll twice*/ break;
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 10): return Shields.getSpecials()[0];
|
||||
case (roll <= 20): return Shields.getSpecials()[1];
|
||||
case (roll <= 25): return Shields.getSpecials()[2];
|
||||
case (roll <= 40): return Shields.getSpecials()[3];
|
||||
case (roll <= 50): return Shields.getSpecials()[4];
|
||||
case (roll <= 57): return Shields.getSpecials()[5];
|
||||
case (roll <= 59): return Shields.getSpecials()[6];
|
||||
case (roll <= 79): return Shields.getSpecials()[7];
|
||||
case (roll <= 85): return Shields.getSpecials()[8];
|
||||
case (roll <= 95): return Shields.getSpecials()[9];
|
||||
case (roll <= 98): return Shields.getSpecials()[10];
|
||||
case (roll <= 99): return Shields.getSpecials()[11];
|
||||
case (roll <= 100): /*roll twice*/ break;
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 5): return Shields.getSpecials()[0];
|
||||
case (roll <= 8): return Shields.getSpecials()[1];
|
||||
case (roll <= 10): return Shields.getSpecials()[2];
|
||||
case (roll <= 15): return Shields.getSpecials()[3];
|
||||
case (roll <= 20): return Shields.getSpecials()[4];
|
||||
case (roll <= 25): return Shields.getSpecials()[5];
|
||||
case (roll <= 41): return Shields.getSpecials()[7];
|
||||
case (roll <= 46): return Shields.getSpecials()[8];
|
||||
case (roll <= 56): return Shields.getSpecials()[9];
|
||||
case (roll <= 58): return Shields.getSpecials()[10];
|
||||
case (roll <= 59): return Shields.getSpecials()[11];
|
||||
case (roll <= 84): return Shields.getSpecials()[12];
|
||||
case (roll <= 86): return Shields.getSpecials()[13];
|
||||
case (roll <= 87): return Shields.getSpecials()[14];
|
||||
case (roll <= 91): return Shields.getSpecials()[15];
|
||||
case (roll <= 93): return Shields.getSpecials()[16];
|
||||
case (roll <= 94): return Shields.getSpecials()[17];
|
||||
case (roll <= 99): return Shields.getSpecials()[18];
|
||||
case (roll <= 100): /*roll twice*/ break;
|
||||
}
|
||||
}
|
||||
if(['minor','medium','major'].indexOf(type) >= 0 && roll == 100) {
|
||||
var special1 = Shields.getSpecial(type);
|
||||
var special2 = Shields.getSpecial(type);
|
||||
//there exists a possibility of getting the same bonus or a bonus over +10
|
||||
//this is hilarious and has not been fixed
|
||||
return {'name': special1.name + ' ' + special2.name,
|
||||
'bonus': special1.bonus + special2.bonus,
|
||||
'cost': special1.cost + special2.cost
|
||||
};
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,506 @@
|
||||
/*global _:false */
|
||||
'use strict';
|
||||
var Spells = {};
|
||||
Spells.getSpells = function() {
|
||||
return [
|
||||
{
|
||||
'name': 'Core Rule Book',
|
||||
'shortName': 'CRB',
|
||||
'baseUrl': '',
|
||||
'arcane': [
|
||||
// arcane spells contain all Wizard/Sorcerer spells (at the wizard
|
||||
// cost). I may add the others later
|
||||
// level 0
|
||||
['Resistance',
|
||||
'Acid Splash', 'Detect Magic', 'Detect Poison', 'Read Magic',
|
||||
'Daze', 'Dancing Lights', 'Flare', 'Light', 'Ray of Frost',
|
||||
'Ghost Sound', 'Bleed', 'Disrupt Undead', 'Touch of Fatigue',
|
||||
'Mage Hand', 'Mending', 'Message', 'Open/Close', 'Arcane Mark',
|
||||
'Prestidigitation'],
|
||||
// level 1
|
||||
['Alarm',
|
||||
'Endure Elements', 'Hold Portal', 'Protection from Chaos',
|
||||
'Protection from Evil', 'Protection from Good',
|
||||
'Protection from Law', 'Shield', 'Grease', 'Mage Armor',
|
||||
'Mount', 'Obscuring Mist', 'Summon Monster I', 'Unseen Servant',
|
||||
'Comprehend Languages', 'Detect Secret Doors', 'Detect Undead',
|
||||
'Identify', 'True Strike', 'Charm Person', 'Hypnotism', 'Sleep',
|
||||
'Burning Hands', 'Floating Disk', 'Magic Missile',
|
||||
'Shocking Grasp', 'Color Spray', 'Disguise Self', 'Magic Aura',
|
||||
'Silent Image', 'Ventriloquism', 'Cause Fear', 'Chill Touch',
|
||||
'Ray of Enfeeblement', 'Animate Rope', 'Enlarge Person',
|
||||
'Erase', 'Expeditious Retreat', 'Feather Fall', 'Jump',
|
||||
'Magic Weapon', 'Reduce Person'],
|
||||
// level2
|
||||
['Arcane Lock',
|
||||
'Obscure Object', 'Protection from Arrows', 'Resist Energy',
|
||||
'Acid Arrow', 'Fog Cloud', 'Glitterdust', 'Summon Monster II',
|
||||
'Summon Swarm', 'Web', 'Detect Thoughts', 'Locate Object',
|
||||
'See Invisibility', 'Daze Monster', 'Hideous Laughter',
|
||||
'Touch of Idiocy', 'Continual Flame', 'Darkness',
|
||||
'Flaming Sphere', 'Gust of Wind', 'Scorching Ray', 'Shatter',
|
||||
'Blur', 'Hypnotic Pattern', 'Invisibility', 'Magic Mouth',
|
||||
'Minor Image', 'Mirror Image', 'Misdirection', 'Phantom Trap',
|
||||
'Blindness/Deafness', 'Command Undead', 'False Life',
|
||||
'Ghoul Touch', 'Scare', 'Spectral Hand', 'Alter Self',
|
||||
'Bear\'s Endurance', 'Bull\'s Strength', 'Cat\'s Grace',
|
||||
'Darkvision', 'Eagle\'s Splendor', 'Fox\'s Cunning', 'Knock',
|
||||
'Levitate', 'Make Whole', 'Owl\'s Wisdom', 'Pyrotechnics',
|
||||
'Rope Trick', 'Spider Climb', 'Whispering Wind'],
|
||||
// level3
|
||||
['Dispel Magic',
|
||||
'Explosive Runes', 'Magic Circle against Chaos',
|
||||
'Magic Circle against Evil', 'Magic Circle against Good',
|
||||
'Magic Circle against Law', 'Nondetection',
|
||||
'Protection from Energy', 'Phantom Steed', 'Sepia Snake Sigil',
|
||||
'Sleet Storm', 'Stinking Cloud', 'Summon Monster III',
|
||||
'Arcane Sight', 'Clairaudience/Clairvoyance', 'Tongues',
|
||||
'Deep Slumber', 'Heroism', 'Hold Person', 'Rage', 'Suggestion',
|
||||
'Daylight', 'Fireball', 'Lightning Bolt', 'Tiny Hut',
|
||||
'Wind Wall', 'Displacement', 'Illusory Script',
|
||||
'Invisibility Sphere', 'Major Image', 'Gentle Repose',
|
||||
'Halt Undead', 'Ray of Exhaustion', 'Vampiric Touch',
|
||||
'Beast Shape I', 'Blink', 'Flame Arrow', 'Fly', 'Gaseous Form',
|
||||
'Haste', 'Keen Edge', 'Magic Weapon, Greater', 'Secret Page',
|
||||
'Shrink Item', 'Slow', 'Water Breathing'],
|
||||
// level4
|
||||
['Dimensional Anchor',
|
||||
'Fire Trap', 'Globe of Invulnerability, Lesser', 'Remove Curse',
|
||||
'Stoneskin', 'Black Tentacles', 'Dimension Door',
|
||||
'Minor Creation', 'Secure Shelter', 'Solid Fog',
|
||||
'Summon Monster IV', 'Arcane Eye', 'Detect Scrying',
|
||||
'Locate Creature', 'Scrying', 'Charm Monster', 'Confusion',
|
||||
'Crushing Despair', 'Geas, Lesser', 'Fire Shield', 'Ice Storm',
|
||||
'Resilient Sphere', 'Shout', 'Wall of Fire', 'Wall of Ice',
|
||||
'Hallucinatory Terrain', 'Illusory Wall',
|
||||
'Invisibility, Greater', 'Phantasmal Killer', 'Rainbow Pattern',
|
||||
'Shadow Conjuration', 'Animate Dead', 'Bestow Curse',
|
||||
'Contagion', 'Enervation', 'Fear', 'Beast Shape II',
|
||||
'Elemental Body I', 'Enlarge Person, Mass', 'Mnemonic Enhancer',
|
||||
'Reduce Person, Mass', 'Stone Shape'],
|
||||
// level5
|
||||
['Break Enchantment',
|
||||
'Dismissal', 'Mage\'s Private Sanctum', 'Cloudkill',
|
||||
'Mage\'s Faithful Hound', 'Major Creation',
|
||||
'Planar Binding, Lesser', 'Secret Chest', 'Summon Monster V',
|
||||
'Teleport', 'Wall of Stone', 'Contact Other Plane',
|
||||
'Prying Eyes', 'Telepathic Bond', 'Dominate Person',
|
||||
'Feeblemind', 'Hold Monster', 'Mind Fog', 'Symbol of Sleep',
|
||||
'Cone of Cold', 'Interposing Hand', 'Sending', 'Wall of Force',
|
||||
'Dream', 'False Vision', 'Mirage Arcana', 'Nightmare',
|
||||
'Persistent Image', 'Seeming', 'Shadow Evocation', 'Blight',
|
||||
'Magic Jar', 'Symbol of Pain', 'Waves of Fatigue',
|
||||
'Animal Growth', 'Baleful Polymorph', 'Beast Shape III',
|
||||
'Elemental Body II', 'Fabricate', 'Overland Flight', 'Passwall',
|
||||
'Plant Shape I', 'Polymorph', 'Telekinesis',
|
||||
'Transmute Mud to Rock', 'Transmute Rock to Mud', 'Permanency'],
|
||||
// level6
|
||||
['Antimagic Field',
|
||||
'Dispel Magic, Greater', 'Globe of Invulnerability',
|
||||
'Guards and Wards', 'Repulsion', 'Acid Fog', 'Planar Binding',
|
||||
'Summon Monster VI', 'Wall of Iron', 'Analyze Dweomer',
|
||||
'Legend Lore', 'True Seeing', 'Geas/Quest', 'Heroism, Greater',
|
||||
'Suggestion, Mass', 'Symbol of Persuasion', 'Chain Lightning',
|
||||
'Contingency', 'Forceful Hand', 'Freezing Sphere', 'Mislead',
|
||||
'Permanent Image', 'Programmed Image', 'Shadow Walk', 'Veil',
|
||||
'Circle of Death', 'Create Undead', 'Eyebite', 'Symbol of Fear',
|
||||
'Undeath to Death', 'Bear\'s Endurance, Mass', 'Beast Shape IV',
|
||||
'Bull\'s Strength, Mass', 'Cat\'s Grace, Mass', 'Control Water',
|
||||
'Disintegrate', 'Eagle\'s Splendor, Mass', 'Elemental Body III',
|
||||
'Flesh to Stone', 'Form of the Dragon I', 'Fox\'s Cunning, Mass',
|
||||
'Mage\'s Lucubration', 'Move Earth', 'Owl\'s Wisdom, Mass',
|
||||
'Plant Shape II', 'Stone to Flesh', 'Transformation'],
|
||||
// level7
|
||||
['Banishment',
|
||||
'Sequester', 'Spell Turning', 'Instant Summons',
|
||||
'Mage\'s Magnificent Mansion', 'Phase Door', 'Plane Shift',
|
||||
'Summon Monster VII', 'Teleport, Greater', 'Teleport Object',
|
||||
'Arcane Sight, Greater', 'Scrying, Greater', 'Vision',
|
||||
'Hold Person, Mass', 'Insanity', 'Power Word Blind',
|
||||
'Symbol of Stunning', 'Delayed Blast Fireball', 'Forcecage',
|
||||
'Grasping Hand', 'Mage\'s Sword', 'Prismatic Spray',
|
||||
'Invisibility, Mass', 'Project Image',
|
||||
'Shadow Conjuration, Greater', 'Simulacrum', 'Control Undead',
|
||||
'Finger of Death', 'Symbol of Weakness', 'Waves of Exhaustion',
|
||||
'Control Weather', 'Elemental Body IV', 'Ethereal Jaunt',
|
||||
'Form of the Dragon II', 'Giant Form I', 'Plant Shape III',
|
||||
'Polymorph, Greater', 'Reverse Gravity', 'Statue',
|
||||
'Limited Wish'],
|
||||
// level8
|
||||
['Dimensional Lock',
|
||||
'Mind Blank', 'Prismatic Wall', 'Protection from Spells',
|
||||
'Incendiary Cloud', 'Maze', 'Planar Binding, Greater',
|
||||
'Summon Monster VIII', 'Trap the Soul', 'Discern Location',
|
||||
'Moment of Prescience', 'Prying Eyes, Greater', 'Antipathy',
|
||||
'Binding', 'Charm Monster, Mass', 'Demand',
|
||||
'Irresistible Dance', 'Power Word Stun', 'Symbol of Insanity',
|
||||
'Sympathy', 'Clenched Fist', 'Polar Ray', 'Shout, Greater',
|
||||
'Sunburst', 'Telekinetic Sphere', 'Scintillating Pattern',
|
||||
'Screen', 'Shadow Evocation, Greater', 'Clone',
|
||||
'Create Greater Undead', 'Horrid Wilting', 'Symbol of Death',
|
||||
'Form of the Dragon III', 'Giant Form II', 'Iron Body',
|
||||
'Polymorph Any Object', 'Temporal Stasis'],
|
||||
// level9
|
||||
['Freedom',
|
||||
'Imprisonment', 'Mage\'s Disjunction', 'Prismatic Sphere',
|
||||
'Gate', 'Refuge', 'Summon Monster IX', 'Teleportation Circle',
|
||||
'Foresight', 'Dominate Monster', 'Hold Monster, Mass',
|
||||
'Power Word Kill', 'Crushing Hand', 'Meteor Swarm', 'Shades',
|
||||
'Weird', 'Astral Projection', 'Energy Drain', 'Soul Bind',
|
||||
'Wail of the Banshee', 'Etherealness', 'Shapechange',
|
||||
'Time Stop', 'Wish']
|
||||
], //end arcaneSpells
|
||||
|
||||
'divine' : [
|
||||
// divine spells contain all cleric and druid spells but only
|
||||
// ONE instance at whichever LOWER spell level
|
||||
// level 0
|
||||
['Bleed',
|
||||
'Create Water', 'Detect Magic', 'Detect Poison', 'Guidance',
|
||||
'Light', 'Mending', 'Purify Food and Drink', 'Read Magic',
|
||||
'Resistance', 'Stabilize', 'Virtue', 'Flare', 'Know Direction'],
|
||||
// level1
|
||||
['Bane',
|
||||
'Bless', 'Bless Water', 'Cause Fear', 'Command',
|
||||
'Comprehend Languages', 'Cure Light Wounds', 'Curse Water',
|
||||
'Deathwatch', 'Detect Chaos', 'Detect Evil', 'Detect Good',
|
||||
'Detect Law', 'Detect Undead', 'Divine Favor', 'Doom',
|
||||
'Endure Elements', 'Entropic Shield', 'Hide from Undead',
|
||||
'Inflict Light Wounds', 'Magic Stone', 'Magic Weapon',
|
||||
'Obscuring Mist', 'Protection from Chaos',
|
||||
'Protection from Evil', 'Protection from Good',
|
||||
'Protection from Law', 'Remove Fear', 'Sanctuary',
|
||||
'Shield of Faith', 'Summon Monster I', 'Calm Animals',
|
||||
'Charm Animal', 'Detect Animals or Plants',
|
||||
'Detect Snares and Pits', 'Entangle', 'Faerie Fire',
|
||||
'Goodberry', 'Hide from Animals', 'Jump', 'Longstrider',
|
||||
'Magic Fang', 'Pass without Trace', 'Produce Flame',
|
||||
'Shillelagh', 'Speak with Animals', 'Summon Nature\'s Ally I'],
|
||||
// level2
|
||||
['Aid',
|
||||
'Align Weapon', 'Augury', 'Bear\'s Endurance', 'Bull\'s Strength',
|
||||
'Calm Emotions', 'Consecrate', 'Cure Moderate Wounds',
|
||||
'Darkness', 'Death Knell', 'Delay Poison', 'Desecrate',
|
||||
'Eagle\'s Splendor', 'Enthrall', 'Find Traps', 'Gentle Repose',
|
||||
'Hold Person', 'Inflict Moderate Wounds', 'Make Whole',
|
||||
'Owl\'s Wisdom', 'Remove Paralysis', 'Resist Energy',
|
||||
'Restoration, Lesser', 'Shatter', 'Shield Other', 'Silence',
|
||||
'Sound Burst', 'Spiritual Weapon', 'Status',
|
||||
'Summon Monster II', 'Undetectable Alignment', 'Zone of Truth',
|
||||
'Animal Messenger', 'Animal Trance', 'Barkskin', 'Cat\'s Grace',
|
||||
'Chill Metal', 'Delay Poison', 'Fire Trap', 'Flame Blade',
|
||||
'Flaming Sphere', 'Fog Cloud', 'Gust of Wind', 'Heat Metal',
|
||||
'Hold Animal', 'Reduce Animal', 'Soften Earth and Stone',
|
||||
'Spider Climb', 'Summon Nature\'s Ally II', 'Summon Swarm',
|
||||
'Tree Shape', 'Warp Wood', 'Wood Shape'],
|
||||
// level3
|
||||
['Animate Dead',
|
||||
'Bestow Curse', 'Blindness/Deafness', 'Contagion',
|
||||
'Continual Flame', 'Create Food and Water',
|
||||
'Cure Serious Wounds', 'Daylight', 'Deeper Darkness',
|
||||
'Dispel Magic', 'Glyph of Warding', 'Helping Hand',
|
||||
'Inflict Serious Wounds', 'Invisibility Purge', 'Locate Object',
|
||||
'Magic Circle against Chaos', 'Magic Circle against Evil',
|
||||
'Magic Circle against Good', 'Magic Circle against Law',
|
||||
'Magic Vestment', 'Meld into Stone', 'Obscure Object', 'Prayer',
|
||||
'Protection from Energy', 'Remove Blindness/Deafness',
|
||||
'Remove Curse', 'Remove Disease', 'Searing Light',
|
||||
'Speak with Dead', 'Stone Shape', 'Summon Monster III',
|
||||
'Water Breathing', 'Water Walk', 'Wind Wall', 'Call Lightning',
|
||||
'Diminish Plants', 'Dominate Animal', 'Magic Fang, Greater',
|
||||
'Meld into Stone', 'Neutralize Poison', 'Plant Growth',
|
||||
'Poison', 'Quench', 'Sleet Storm', 'Snare', 'Speak with Plants',
|
||||
'Spike Growth', 'Summon Nature\'s Ally III'],
|
||||
// level4
|
||||
['Air Walk',
|
||||
'Chaos Hammer', 'Control Water', 'Cure Critical Wounds',
|
||||
'Death Ward', 'Dimensional Anchor', 'Discern Lies', 'Dismissal',
|
||||
'Divination', 'Divine Power', 'Freedom of Movement',
|
||||
'Giant Vermin', 'Holy Smite', 'Imbue with Spell Ability',
|
||||
'Inflict Critical Wounds', 'Magic Weapon, Greater',
|
||||
'Neutralize Poison', 'Order\'s Wrath', 'Planar Ally, Lesser',
|
||||
'Poison', 'Repel Vermin', 'Restoration', 'Sending',
|
||||
'Spell Immunity', 'Summon Monster IV', 'Tongues',
|
||||
'Unholy Blight', 'Antiplant Shell', 'Blight', 'Command Plants',
|
||||
'Flame Strike', 'Freedom of Movement', 'Giant Vermin',
|
||||
'Ice Storm', 'Reincarnate', 'Repel Vermin', 'Rusting Grasp',
|
||||
'Scrying', 'Spike Stones', 'Summon Nature\'s Ally IV'],
|
||||
// level5
|
||||
['Atonement',
|
||||
'Break Enchantment', 'Breath of Life', 'Command, Greater',
|
||||
'Commune', 'Cure Light Wounds, Mass', 'Dispel Chaos',
|
||||
'Dispel Evil', 'Dispel Good', 'Dispel Law', 'Disrupting Weapon',
|
||||
'Flame Strike', 'Hallow', 'Inflict Light Wounds, Mass',
|
||||
'Insect Plague', 'Mark of Justice', 'Plane Shift', 'Raise Dead',
|
||||
'Righteous Might', 'Slay Living', 'Spell Resistance',
|
||||
'Summon Monster V', 'Symbol of Pain', 'Symbol of Sleep',
|
||||
'True Seeing', 'Unhallow', 'Wall of Stone', 'Animal Growth',
|
||||
'Awaken', 'Baleful Polymorph', 'Call Lightning Storm',
|
||||
'Commune with Nature', 'Control Winds', 'Death Ward',
|
||||
'Insect Plague', 'Stoneskin', 'Summon Nature\'s Ally V',
|
||||
'Transmute Mud to Rock', 'Transmute Rock to Mud', 'Tree Stride',
|
||||
'Wall of Fire', 'Wall of Thorns'],
|
||||
// level6
|
||||
['Animate Objects',
|
||||
'Antilife Shell', 'Banishment', 'Bear\'s Endurance, Mass',
|
||||
'Blade Barrier', 'Bull\'s Strength, Mass', 'Create Undead',
|
||||
'Cure Moderate Wounds, Mass', 'Dispel Magic, Greater',
|
||||
'Eagle\'s Splendor, Mass', 'Find the Path', 'Forbiddance',
|
||||
'Geas/Quest', 'Glyph of Warding, Greater', 'Harm', 'Heal',
|
||||
'Heroes\' Feast', 'Inflict Moderate Wounds, Mass',
|
||||
'Owl\'s Wisdom, Mass', 'Planar Ally', 'Summon Monster VI',
|
||||
'Symbol of Fear', 'Symbol of Persuasion', 'Undeath to Death',
|
||||
'Wind Walk', 'Word of Recall', 'Antilife Shell',
|
||||
'Cat\'s Grace, Mass', 'Fire Seeds', 'Ironwood', 'Liveoak',
|
||||
'Move Earth', 'Owl\'s Wisdom, Mass', 'Repel Wood', 'Spellstaff',
|
||||
'Stone Tell', 'Summon Nature\'s Ally VI', 'Transport via Plants',
|
||||
'Wall of Stone'],
|
||||
// level7
|
||||
['Blasphemy',
|
||||
'Control Weather', 'Cure Serious Wounds, Mass', 'Destruction',
|
||||
'Dictum', 'Ethereal Jaunt', 'Holy Word',
|
||||
'Inflict Serious Wounds, Mass', 'Refuge', 'Regenerate',
|
||||
'Repulsion', 'Restoration, Greater', 'Resurrection',
|
||||
'Scrying, Greater', 'Summon Monster VII', 'Symbol of Stunning',
|
||||
'Symbol of Weakness', 'Word of Chaos', 'Animate Plants',
|
||||
'Changestaff', 'Control Weather', 'Creeping Doom', 'Fire Storm',
|
||||
'Summon Nature\'s Ally VII', 'Sunbeam',
|
||||
'Transmute Metal to Wood', 'True Seeing'],
|
||||
// level8
|
||||
['Antimagic Field',
|
||||
'Cloak of Chaos', 'Create Greater Undead',
|
||||
'Cure Critical Wounds, Mass', 'Dimensional Lock',
|
||||
'Discern Location', 'Earthquake', 'Fire Storm', 'Holy Aura',
|
||||
'Inflict Critical Wounds, Mass', 'Planar Ally, Greater',
|
||||
'Shield of Law', 'Spell Immunity, Greater',
|
||||
'Summon Monster VIII', 'Symbol of Death', 'Symbol of Insanity',
|
||||
'Unholy Aura', 'Animal Shapes', 'Control Plants',
|
||||
'Finger of Death', 'Repel Metal or Stone', 'Reverse Gravity',
|
||||
'Summon Nature\'s Ally VIII', 'Sunburst', 'Whirlwind',
|
||||
'Word of Recall'],
|
||||
// level9
|
||||
['Astral Projection',
|
||||
'Energy Drain', 'Etherealness', 'Gate', 'Heal, Mass',
|
||||
'Implosion', 'Miracle', 'Soul Bind', 'Storm of Vengeance',
|
||||
'Summon Monster IX', 'True Resurrection', 'Antipathy',
|
||||
'Elemental Swarm', 'Foresight', 'Regenerate', 'Shambler',
|
||||
'Shapechange', 'Summon Nature\'s Ally IX', 'Sympathy']
|
||||
] //end divine
|
||||
},
|
||||
{
|
||||
'name': 'Advanced Player Guide',
|
||||
'shortName': 'APG',
|
||||
'baseUrl': '',
|
||||
'arcane': [
|
||||
//level0
|
||||
['Sift', 'Spark', 'Unwitting Ally', 'Message', 'Acid Splash', 'Ray of Frost', 'Putrefy Food and Drink'],
|
||||
//level1
|
||||
['Beguiling Gift', 'Borrow Skill', 'Dancing Lantern', 'Feather Step', 'Flare Burst', 'Innocence', 'Invigorate', 'Memory Lapse',
|
||||
'Restful Sleep', 'Saving Finale', 'Share Language', 'Solid Note', 'Timely Inspiration', 'Touch of Gracelessness', 'Vanish', 'Alter Winds', 'Feather Fall',
|
||||
'Shocking Grasp', 'Expeditious Excavation', 'Grease', 'Stone Fist', 'Burning Hands', 'Hydraulic Push', 'Obscuring Mist', 'Touch of the Sea', 'Ant Haul',
|
||||
'Break', 'Crafter\'s Curse', 'Crafter\'s Fortune', 'Gravity Bow', 'Sculpt Corpse', 'Stumble Gap', 'Rejuvenate Eidolon, Lesser', 'Unfetter', 'Ill Omen',
|
||||
'Mask Dweomer'],
|
||||
//level2
|
||||
['Blood Biography', 'Cacophonous Call', 'Create Treasure Map', 'Dust of Twilight', 'Enter Image', 'Gallant Inspiration',
|
||||
'Ghostbane Dirge', 'Hidden Speech', 'Honeyed Tongue', 'Versatile Weapon', 'Elemental Speech', 'Elemental Touch', 'Resist Energy', 'Summon Monster II',
|
||||
'Glide', 'Gust of Wind', 'Levitate', 'Whispering Wind', 'Acid Arrow', 'Create Pit', 'Glitterdust', 'Shatter', 'Stone Call', 'Burning Gaze', 'Fire Breath',
|
||||
'Flaming Sphere', 'Pyrotechnics', 'Scorching Ray', 'Accelerate Poison', 'Fog Cloud', 'Slipstream', 'Arrow Eruption', 'Create Treasure Map', 'Share Language',
|
||||
'Create Pit', 'Evolution Surge, Lesser', 'Summon Eidolon', 'Feast of Ashes', 'Fester', 'Perceive Cues', 'Pox Pustules', 'Vomit Swarm'],
|
||||
//level3
|
||||
['Arcane Concordance', 'Campfire Wall', 'Coordinated Effort', 'Elemental Speech', 'Feather Step, Mass', 'Invigorate, Mass',
|
||||
'Jester\'s Jaunt', 'Purging Finale', 'Reviving Finale', 'Seek Thoughts', 'Thunderous Drums', 'Draconic Reservoir', 'Elemental Aura', 'Protection From Energy',
|
||||
'Cloak of Winds', 'Fly', 'Gaseous Form', 'Lightning Bolt', 'Wind Wall', 'Shifting Sand', 'Spiked Pit', 'Stinking Cloud', 'Fireball', 'Flame Arrow', 'Aqueous Orb',
|
||||
'Hydraulic Torrent', 'Sleet Storm', 'Water Breathing', 'Blood Biography', 'Devolution', 'Enter Image', 'Pain Strike', 'Twilight Knife', 'Versatile Weapon',
|
||||
'Evolution Surge', 'Rejuvenate Eidolon', 'Cup of Dust', 'Guiding Star', 'Nature\'s Exile', 'Screech', 'Share Senses'],
|
||||
//level4
|
||||
['Denounce', 'Discordant Blast', 'Ghostbane Dirge, Mass', 'Heroic Finale', 'Treasure Stitching', 'Wandering Star Motes', 'Detonate',
|
||||
'Dragon\'s Breath', 'Elemental Body I', 'Summon Monster IV', 'Ball Lightning', 'River of Wind', 'Shout', 'Acid Pit', 'Calcific Touch', 'Stone Shape', 'Stoneskin',
|
||||
'Fire Shield', 'Fire Trap', 'Firefall', 'Wall of Fire', 'Ice Storm', 'Solid Fog', 'Wall of Ice', 'Acid Pit', 'Detonate', 'Moonstruck', 'Shadow Projection',
|
||||
'Share Senses', 'True Form', 'Evolution Surge, Greater', 'Purified Calling', 'Transmogrify', 'Sleepwalk', 'Spite', 'Threefold Aspect'],
|
||||
//level5
|
||||
['Bard\'s Escape', 'Cacophonous Call, Mass', 'Cloak of Dreams', 'Deafening Song Bolt', 'Foe to Friend', 'Frozen Note', 'Phantasmal Web',
|
||||
'Stunning Finale', 'Unwilling Shield', 'Elemental Body II', 'Planar Adaptation', 'Planar Binding, Lesser', 'Summon Monster V', 'Overland Flight', 'Suffocation',
|
||||
'Hungry Pit', 'Passwall', 'Transmute Mud to Rock', 'Transmute Rock to Mud', 'Wall of Stone', 'Fire Snake', 'Geyser', 'Cloudkill', 'Cone of Cold',
|
||||
'Life Bubble', 'Pain Strike, Mass', 'Treasure Stitching', 'Rejuvenate Eidolon, Greater', 'Banish Seeming', 'Rest Eternal'],
|
||||
//level6
|
||||
['Brilliant Inspiration', 'Deadly Finale', 'Euphoric Tranquility', 'Fool\'s Forbiddance', 'Getaway', 'Pied Piping', 'Elemental Body III',
|
||||
'Planar Binding', 'Summon Monster VI', 'Chain Lightning', 'Sirocco', 'Acid Fog', 'Flesh to Stone', 'Move Earth', 'Stone to Flesh', 'Wall of Iron',
|
||||
'Contagious Flame', 'Fluid Form', 'Freezing Sphere', 'Cloak of Dreams', 'Enemy Hammer', 'Unwilling Shield', 'Planar Adaptation, Mass', 'Fester, Mass',
|
||||
'Swarm Skin'],
|
||||
//level7
|
||||
['Elemental Body IV', 'Planar Adaptation, Mass', 'Summon Monster VII', 'Control Weather', 'Fly, Mass', 'Rampart', 'Reverse Gravity',
|
||||
'Statue', 'Delayed Blast Fireball', 'Firebrand', 'Vortex', 'Deflection', 'Expend', 'Phantasmal Revenge'],
|
||||
//level8
|
||||
['Planar Binding, Greater', 'Summon Monster VII', 'Shout, Greater', 'Stormbolts', 'Iron Body', 'Wall of Lava', 'Incendiary Cloud',
|
||||
'Horrid Wilting', 'Polar Ray', 'Seamantle', 'Euphoric Tranquility'],
|
||||
//level9
|
||||
['Gate', 'Suffocation, Mass', 'Winds of Vengeance', 'Clashing Rocks', 'World Wave', 'Fiery Body', 'Meteor Swarm', 'Tsunami', 'Tsunami',
|
||||
'Wall of SuppressionM'],
|
||||
],
|
||||
'divine' : [
|
||||
//divine spells contain all cleric/druid/inquisitor/paladin/ranger spells but only ONE instance at whichever LOWER spell level
|
||||
//level0
|
||||
['Spark', 'Brand', 'Sift'],
|
||||
//level1
|
||||
['Ant Haul', 'Dancing Lantern', 'Alter Winds', 'Aspect of the Falcon', 'Bristle', 'Call Animal', 'Cloak of Shade', 'Detect Aberration',
|
||||
'Expeditious Excavation', 'Feather Step', 'Flare Burst', 'Hydraulic Push', 'Keen Senses', 'Negate Aroma', 'Stone Fist', 'Touch of the Sea', 'Burst Bonds',
|
||||
'Tireless Pursuit', 'Wrath', 'Challenge Evil', 'Ghostbane Dirge', 'Grace', 'Hero\'s Defiance', 'Honeyed Tongue', 'Knight\'s Calling', 'Rally Point',
|
||||
'Veil of Positive Energy', 'Glide', 'Gravity Bow', 'Hunter\'s Howl', 'Lead Blades', 'Residual Tracking'],
|
||||
//level2
|
||||
['Blessing of Courage and Life', 'Ghostbane Dirge', 'Grace', 'Instant Armor', 'Oracle\'s Burden', 'Share Language', 'Weapon of Awe',
|
||||
'Accelerate Poison', 'Aspect of the Bear', 'Burning Gaze', 'Campfire Wall', 'Eagle Eye', 'Elemental Speech', 'Feast of Ashes', 'Glide', 'Lockjaw',
|
||||
'Natural Rhythm', 'Pox Pustules', 'Scent Trail', 'Slipstream', 'Stone Call', 'Bloodhound', 'Castigate', 'Confess', 'Corruption Resistance',
|
||||
'Flames of the Faithful', 'Follow Aura', 'Honeyed Tongue', 'Perceive Cues', 'Sacred Bond', 'Aura of Greater Courage', 'Bestow Grace', 'Fire of Entanglement',
|
||||
'Light Lance', 'Paladin\'s Sacrifice', 'Righteous Vigor', 'Saddle Surge', 'Wake of Light', 'Allfood', 'Arrow Eruption', 'Chameleon Stride',
|
||||
'Create Treasure Map', 'Guiding Star', 'Hide Campsite', 'Hunter\'s Eye', 'Protective Spirit', 'Versatile Weapon'],
|
||||
//level3
|
||||
['Blood Biography', 'Borrow Fortune', 'Elemental Speech', 'Enter Image', 'Guiding Star', 'Nap Stack', 'Sacred Bond', 'Wrathful Mantle',
|
||||
'Aqueous Orb', 'Cloak of Winds', 'Create Treasure Map', 'Cup of Dust', 'Feather Step, Mass', 'Hide Campsite', 'Hydraulic Torrent', 'Lily Pad Stride',
|
||||
'Nature\'s Exile', 'Shifting Sand', 'Banish Seeming', 'Cast Out', 'Coordinated Effort', 'Fester', 'Hidden Speech', 'Hunter\'s Eye', 'Retribution',
|
||||
'Righteous Vigor', 'Seek Thoughts', 'Ward the Faithful', 'Divine Transfer', 'Fire of Judgment', 'Ghostbane Dirge, Mass', 'Holy Whisper',
|
||||
'Marks of Forbiddance', 'Sanctify Armor', 'Aspect of the Stag', 'Bloody Claws', 'Instant Enemy', 'Life Bubble', 'Strong Jaw', 'Tireless Pursuers',
|
||||
'Venomous Bolt'],
|
||||
//level4
|
||||
['Blessing of Fervor', 'Planar Adaptation', 'Rest Eternal', 'Spiritual Ally', 'Aspect of the Stag', 'Ball Lightning', 'Bloody Claws',
|
||||
'Geyser', 'Grove of Respite', 'Life Bubble', 'Moonstruck', 'River of Wind', 'Strong Jaw', 'Thorn Body', 'True Form', 'Brand, Greater', 'Coward\'s Lament',
|
||||
'Defile Armor', 'Denounce', 'Forced Repentance', 'Rebuke', 'Sanctify Armor', 'Shared Wrath', 'Sleepwalk', 'Tireless Pursuers', 'Blaze of Glory',
|
||||
'Fire of Vengeance', 'King\'s Castle', 'Oath of Peace', 'Resounding Blow', 'Sacrificial Oath', 'Stay the Hand', 'Aspect of the Wolf',
|
||||
'Blessing of the Salamander', 'Bow Spirit'],
|
||||
//level5
|
||||
['Cleanse', 'Ghostbane Dirge, Mass', 'Life Bubble', 'Pillar of Life', 'Snake Staff', 'Treasure Stitching', 'Aspect of the Wolf',
|
||||
'Blessing of the Salamander', 'Fire Snake', 'Rest Eternal', 'Threefold Aspect', 'Castigate, Mass', 'Resounding Blow', 'Unwilling Shield'],
|
||||
//level6
|
||||
['Planar Adaptation, Mass', 'Sirocco', 'Swarm Skin', 'Cleanse', 'Fester, Mass'],
|
||||
//level7
|
||||
['Rampart', 'Vortex'],
|
||||
//level8
|
||||
['Divine Vessel', 'Euphoric Tranquility', 'Stormbolts', 'Seamantle', 'Wall of Lava'],
|
||||
//level9
|
||||
['Winds of Vengeance', 'Clashing Rocks', 'Tsunami', 'World Wave'],
|
||||
]
|
||||
},
|
||||
{
|
||||
'name': 'Ultimate Magic',
|
||||
'shortName': 'UM',
|
||||
'baseUrl': '',
|
||||
'arcane': [
|
||||
//arcane spells contain all Wizard/Sorcerer/Bard/Magus/Summoner/Witch spells.
|
||||
//level0
|
||||
[],
|
||||
//level1
|
||||
['Anticipate Peril', 'Chord of Shards', 'Delusional Pride', 'Ear-Piercing Scream', 'Forced Quiet', 'Fumbletongue', 'Horn of Pursuit', 'Ki Arrow', 'Play Instrument', 'Summon Minor Monster', 'Unnatural Lust', 'Unprepared Combatant', 'Vocal Alteration', 'Youthful Appearance', 'Corrosive Touch', 'Frostbite', 'Bungle', 'Decompose Corpse', 'Icicle Dagger', 'Interrogation', 'Polypurpose Panacea', 'Ray of Sickening', 'Restore Corpse', 'Shadow Weapon', 'Snapdragon Fireworks', 'Diagnose Disease', 'Hex Ward', 'Remove Sickness', 'Sanctify Corpse'],
|
||||
//level2
|
||||
['Acute Senses', 'Allegro', 'Boiling Blood', 'Compassionate Ally', 'Delay Pain', 'Disguise Other', 'Distracting Cacophony', 'Distressing Tone', 'Ghostly Disguise', 'Haunting Mists', 'Mad Hallucination', 'Masterwork Transformation', 'Miserable Pity', 'Oppressive Boredom', 'Piercing Shriek', 'Reckless Infatuation', 'Share Memory', 'Silk to Steel', 'Snapdragon Fireworks', 'Steal Voice', 'Unadulterated Loathing', 'Wartrain Mount', 'Blood Transcription', 'Defensive Shock', 'Frigid Touch', 'Badger\'s Ferocity', 'Cushioning Bands', 'Disfiguring Touch ', 'Pernicious Poison', 'Protective Penumbra', 'Sculpt Simulacrum', 'Silk To Steel', 'Skinsend', 'Symbol of Mirroring', 'Unnatural Lust', 'Unshakable Chill', 'Web Shelter', 'Restore Eidolon, Lesser'],
|
||||
//level3
|
||||
['Control Summoned Creature', 'Curse of Disgust', 'Exquisite Accompaniment', 'Rain of Frogs', 'Haunting Choir', 'Mad Monkeys', 'Malicious Spite', 'Overwhelming Grief', 'Smug Narcissism', 'Terrible Remorse', 'Vision of Hell', 'Witness', 'Force Hook Charge', 'Force Punch', 'Monstrous Physique I', 'Undead Anatomy I', 'Animate Dead, Lesser', 'Anthropomorphic Animal', 'Ash Storm', 'Burrow', 'Countless Eyes', 'Distracting Cacophony', 'Eldritch Fever', 'Eruptive Pustules', 'Excruciating Deformation', 'Howling Agony', 'Ki Leech', 'Loathsome Veil', 'Marionette Possession', 'Reckless Infatuation', 'Sands of Time', 'Strangling Hair', 'Toxic Gift', 'Unadulterated Loathing', 'Agonize', 'Restore Eidolon', 'Cackling Skull', 'Spit Venom', 'Vermin Shape I'],
|
||||
//level4
|
||||
['Dance of a Hundred Cuts', 'Daze, Mass', 'Echolocation', 'Envious Urge', 'Primal Scream', 'Serenity', 'Shadow Step', 'Sonic Thrust', 'Utter Contempt', 'Virtuoso Performance', 'Wall of Sound', 'Arcana Theft', 'Monstrous Physique II', 'Vermin Shape I', 'Age Resistance, Lesser', 'Agonize', 'Control Summoned Creature', 'Curse of Magic Negation', 'Darkvision, Greater', 'False Life, Greater', 'Familiar Melding', 'Fleshworm Infestation', 'Malfunction', 'Malicious Spite', 'Overwhelming Grief', 'Ride the Waves', 'Simulacrum, Lesser', 'Symbol of Revelation', 'Symbol of Slowing', 'Terrible Remorse', 'Touch of Slime', 'Vitriolic Mist', 'Volcanic Storm', 'Cape of Wasps', 'Symbol of Healing', 'Vermin Shape II'],
|
||||
//level5
|
||||
['Joyful Rapture', 'Ki Shout', 'Resonating Word', 'Shadowbard', 'Vengeful Outrage', 'Acidic Spray', 'Corrosive Consumption', 'Monstrous Physique III', 'Undead Anatomy II', 'Vermin Shape II', 'Astral Projection, Lesser', 'Curse of Disgust', 'Echolocation', 'Fickle Winds', 'Icy Prison', 'Lightning Arc', 'Plague Carrier', 'Possess Object', 'Rapid Repair', 'Smug Narcissism', 'Sonic Thrust', 'Soothe Construct', 'Symbol of Scrying', 'Unbreakable Construct', 'Wall of Sound', 'Conjure Black Pudding', 'Create Demiplane, Lesser', 'Ice Crystal Teleport', 'Contagion, Greater', 'Curse, Major'],
|
||||
//level6
|
||||
['Dance of a Thousand Cuts', 'Overwhelming Presence', 'Waves of Ecstasy', 'Monstrous Physique IV', 'Undead Anatomy III', 'Age Resistance', 'Battlemind Link', 'Cold Ice Strike', 'Conjure Black Pudding', 'Contagion, Greater', 'Curse, Major', 'Envious Urge', 'Ice Crystal Teleport', 'Leashed Shackles ', 'Serenity', 'Symbol of Sealing', 'Utter Contempt', 'Vengeful Outrage', 'Create Demiplane', 'Eagle Aerie', 'Epidemic', 'Plague Storm'],
|
||||
//level7
|
||||
['Age Resistance, Greater', 'Caustic Eruption', 'Circle of Clarity', 'Control Construct', 'Create Demiplane, Lesser', 'Epidemic', 'Ice Body', 'Joyful Rapture', 'Ki Shout', 'Lunar Veil', 'Plague Storm', 'Resonating Word', 'Scouring Winds', 'Temporary Resurrection', 'Waves of Ecstasy', 'Waves of Ecstasy'],
|
||||
//level8
|
||||
['Call Construct', 'Create Demiplane', 'Orb of the Void', 'Prediction of Failure', 'Undead Anatomy IV'],
|
||||
//level9
|
||||
['Create Demiplane, Greater', 'Cursed Earth', 'Icy Prison, Mass', 'Interplanetary Teleport', 'Overwhelming Presence', 'Ride the Lightning', 'Symbol of Strife', 'Symbol of Vulnerability', 'Transmute Blood to Acid', 'Wooden Phalanx', 'Polar Midnight',],
|
||||
],
|
||||
|
||||
'divine': [
|
||||
//divine spells contain all cleric/druid/inquisitor/paladin/ranger spells but only ONE instance at whichever LOWER spell level
|
||||
//level0
|
||||
[],
|
||||
//level1
|
||||
['Decompose Corpse', 'Diagnose Disease', 'Forbid Action', 'Know the Enemy', 'Murderous Command', 'Ray of Sickening', 'Remove Sickness', 'Restore Corpse', 'Sanctify Corpse', 'Summon Minor Monster', 'Frostbite', 'Summon Minor Ally', 'Ear-Piercing Scream', 'Forced Quiet', 'Hex Ward', 'Horn of Pursuit', 'Interrogation', 'Lend Judgment', 'Persuasive Goad', 'Vocal Alteration', 'Wartrain Mount', 'Wartrain Mount', 'Word of Resolve', 'Anticipate Peril'],
|
||||
//level2
|
||||
['Animate Dead, Lesser', 'Arrow of Law', 'Boiling Blood', 'Compassionate Ally', 'Delay Pain', 'Disfiguring Touch', 'Dread Bolt', 'Imbue with Aura', 'Masterwork Transformation', 'Protective Penumbra', 'Shard of Chaos', 'Spear of Purity', 'Surmount Affliction', 'Web Shelter', 'Frigid Touch', 'Pernicious Poison', 'Tar Ball', 'Unshakable Chill', 'Wartrain Mount', 'Acute Senses', 'Disguise Other', 'Distressing Tone', 'Ghostly Disguise', 'Howling Agony', 'Holy Shield', 'Vestment of the Champion', 'Badger\'s Ferocity'],
|
||||
//level3
|
||||
['Agonize', 'Archon\'s Aura', 'Badger\'s Ferocity', 'Blessing of the Mole', 'Ki Leech', 'Sands of Time', 'Symbol of Healing', 'Vision of Hell', 'Anthropomorphic Animal', 'Ash Storm', 'Burrow', 'Burst of Nettles', 'Fungal Infestation', 'Mad Monkeys', 'Rain of Frogs', 'Spit Venom', 'Vermin Shape I', 'Countless Eyes', 'Eldritch Fever', 'Terrible Remorse', 'Witness', 'Blade of Bright Victory', 'Fickle Winds'],
|
||||
//level4
|
||||
['Aura of Doom', 'Blood Crow Strike', 'Control Summoned Creature', 'Fleshworm Infestation', 'Oracle\'s Vessel', 'Plague Carrier', 'Ride the Waves', 'Soothe Construct', 'Spit Venom', 'Symbol of Revelation', 'Symbol of Slowing', 'Terrible Remorse', 'Age Resistance, Lesser', 'Arboreal Hammer', 'Atavism', 'Cape of Wasps', 'Echolocation', 'Touch of Slime', 'Vermin Shape II', 'Volcanic Storm', 'Battlemind Link', 'Curse of Magic Negation', 'Daze, Mass', 'Interrogation, Greater', 'Leashed Shackles ', 'Reprobation', 'Bestow Grace of the Champion', 'Raise Animal Companion', 'Symbol of Healing', 'Darkvision, Greater'],
|
||||
//level5
|
||||
['Astral Projection, Lesser', 'Contagion, Greater', 'Curse of Magic Negation', 'Curse, Major', 'Fickle Winds', 'Forbid Action, Greater', 'Holy Ice', 'Rapid Repair', 'Reprobation', 'Serenity', 'Symbol of Scrying', 'Unholy Ice', 'Raise Animal Companion', 'Divine Pursuit', 'Lend Greater Judgment'],
|
||||
//level6
|
||||
['Cold Ice Strike', 'Epidemic', 'Joyful Rapture', 'Plague Storm', 'Symbol of Sealing', 'Age Resistance', 'Eagle Aerie', 'Overwhelming Presence'],
|
||||
//level7
|
||||
['Bestow Grace of the Champion', 'Circle of Clarity', 'Create Demiplane, Lesser', 'Lunar Veil', 'Waves of Ecstasy', 'Call Construct', 'Create Demiplane', 'Orb of the Void', 'Age Resistance, Greater', 'Scouring Winds'],
|
||||
//level8
|
||||
['Atavism, Mass', 'Blood Mist'],
|
||||
//level9
|
||||
['Create Demiplane, Greater', 'Cursed Earth', 'Interplanetary Teleport', 'Overwhelming Presence', 'Polar Midnight', 'Symbol of Strife', 'Symbol of Vulnerability', 'Wooden Phalanx', 'Summon Elder Worm', 'Summon Froghemoth'],
|
||||
]
|
||||
},
|
||||
{
|
||||
'name': 'Ultimate Combat',
|
||||
'shortName': 'UC',
|
||||
'baseUrl': '',
|
||||
'arcane': [
|
||||
//level0
|
||||
['Haunted Fey Aspect', ],
|
||||
//level1
|
||||
['Adjuring Step', 'Abundant Ammunition', 'Adoration', 'Compel Hostility', 'Deadeye\'s Lore', 'Jury-Rig', 'Liberating Command', 'Lock Gaze', 'Moment of Greatness', 'Negative Reaction', 'See Alignment', 'Illusion of Calm', 'Longshot', 'Mirror Strike', 'Reinforce Armaments', 'Returning Weapon', 'Shock Shield', 'Unerring Weapon', 'Warding Weapon', 'Air Bubble', 'Damp Powder', 'Fabricate Bullets', 'Peacebond', 'Weaken Powder', 'Life Conduit', ],
|
||||
//level2
|
||||
['Blistering Invective', 'Discovery Torch', 'Pilfering Hand', 'Qualm', 'Returning Weapon', 'Share Language, Communal', 'Tactical Acumen', 'Thunder Fire', 'Adoration', 'Animal Aspect', 'Ant Haul, Communal', 'Bestow Weapon Proficiency', 'Brow Gasher', 'Bullet Shield', 'Certain Grip', 'Destabilize Powder', 'Endure Elements, Communal', 'Fiery Shuriken', 'Frost Fall', 'Kinetic Reverberation', 'Magic Siege Engine', 'Mount, Communal', 'Reloading Hands', 'Protection from Chaos, Communal', 'Protection from Evil, Communal', 'Protection from Good, Communal', 'Protection from Law, Communal', 'Recoil Fire', 'Reinforce Armaments, Communal', 'Ricochet Shot', 'Spontaneous Immolation', 'Stabilize Powder', 'Telekinetic Assembly', 'Twisted Space', 'Warding Weapon', 'Ablative Barrier', 'Mask Dweomer, Communal', ],
|
||||
//level3
|
||||
['Delay Poison, Communal', 'Phantom Driver', 'Returning Weapon, Communal', 'Tongues, Communal', 'Ablative Barrier', 'Animal Aspect', 'Bestow Weapon Proficiency', 'Brow Gasher', 'Effortless Armor', 'Mount, Communal', 'Pilfering Hand', 'Reloading Hands', 'Reinforce Armaments, Communal', 'Tactical Acumen', 'Telekinetic Assembly', 'Twisted Space', 'Animal Aspect, Greater', 'Burst of Speed', 'Locate Weakness', 'Chain of Perdition', 'Darkvision, Communal', 'Flash Fire', 'Healing Thief', 'Hostile Levitation', 'Pellet Blast', 'Protection from Arrows, Communal', 'Pup Shape', 'Resinous Skin', 'Resist Energy, Communal', 'Share Language, Communal', 'Spider Climb, Communal', 'Touch Injection', 'Life Conduit, Improved', 'Obsidian Flow', 'Phantom Chariot', 'Phantom Steed, Communal', ],
|
||||
//level4
|
||||
['Phantom Steed, Communal', 'Shocking Image', 'Pellet Blast', 'Wreath of Blades', 'Animal Aspect, Greater', 'Magic Siege Engine, Greater', 'Named Bullet', 'Nondetection, Communal', 'Obsidian Flow', 'Phantom Chariot', 'Protection from Energy, Communal', 'Telekinetic Charge', 'Tongues, Communal', 'Hostile Juxtaposition', 'Stoneskin, Communal', 'Summoner Conduit', 'Absorb Toxicity', 'Debilitating Portent', ],
|
||||
//level5
|
||||
['Symbol of Striking', 'Absorb Toxicity', 'Energy Siege Shot', 'Hostile Juxtaposition', 'Stoneskin, Communal', 'Summoner Conduit', 'Wreath of Blades', 'Life Conduit, Greater', 'Tar Pool', ],
|
||||
//level6
|
||||
['Walk through Space', 'Energy Siege Shot, Greater', 'Named Bullet, Greater', 'Tar Pool', 'Hostile Juxtaposition, Greater', 'Dust Form', ],
|
||||
//level7
|
||||
['Arcane Cannon', 'Hostile Juxtaposition, Greater', 'Walk through Space', 'Walk through Space', ],
|
||||
//level8
|
||||
['Frightful Aspect', ],
|
||||
//level9
|
||||
['Heroic Invocation', 'Mind Blank, Communal',],
|
||||
],
|
||||
'divine': [
|
||||
//divine spells contain all cleric/druid/inquisitor/paladin/ranger spells but only ONE instance at whichever LOWER spell level
|
||||
//level0
|
||||
[],
|
||||
//level1
|
||||
['Abundant Ammunition', 'Air Bubble', 'Compel Hostility', 'Deadeye\'s Lore', 'Liberating Command', 'Moment of Greatness', 'Reinforce Armaments', 'Sun Metal', 'Damp Powder', 'Weaken Powder', 'Bowstaff', 'Litany of Sloth', 'Litany of Weakness', 'Lock Gaze', 'Longshot', 'Peacebond', 'Returning Weapon', 'Unerring Weapon', 'Tactical Acumen', ],
|
||||
//level2
|
||||
['Ant Haul, Communal', 'Bestow Weapon Proficiency', 'Effortless Armor', 'Endure Elements, Communal', 'Instrument of Agony', 'Magic Siege Engine', 'Pilfering Hand', 'Protection from Chaos, Communal', 'Protection from Evil, Communal', 'Protection from Good, Communal', 'Protection from Law, Communal', 'Reinforce Armaments, Communal', 'Returning Weapon', 'Animal Aspect', 'Certain Grip', 'Forest Friend', 'Frost Fall', 'Wilderness Soldiers', 'Blistering Invective', 'Brow Gasher', 'Discovery Torch', 'Litany of Defense', 'Qualm', 'Returning Weapon, Communal', 'Tactical Acumen', 'Divine Arrow', 'Litany of Eloquence', 'Litany of Entanglement', 'Litany of Righteousness', 'Litany of Warding', 'Locate Weakness', 'Reloading Hands', 'Ricochet Shot', ],
|
||||
//level3
|
||||
['Chain of Perdition', 'Daybreak Arrow', 'Deadly Juggernaut', 'Delay Poison, Communal', 'Discovery Torch', 'Resist Energy, Communal', 'Returning Weapon, Communal', 'Share Language, Communal', 'Animal Aspect, Greater', 'Companion Mind Link', 'Pup Shape', 'Resinous Skin', 'Spider Climb, Communal', 'Burst of Speed', 'Litany of Eloquence', 'Litany of Entanglement', 'Litany of Righteousness', 'Litany of Warding', 'Locate Weakness', 'Litany of Escape', 'Litany of Sight', 'Named Bullet', 'Protection from Energy, Communal', ],
|
||||
//level4
|
||||
['Debilitating Portent', 'Protection from Energy, Communal', 'Summoner Conduit', 'Water Walk, Communal', 'Absorb Toxicity', 'Obsidian Flow', 'Find Quarry', 'Judgment Light', 'Litany of Escape', 'Litany of Sight', 'Magic Siege Engine, Greater', 'Named Bullet', 'Litany of Thunder', 'Litany of Vengeance', 'Darkvision, Communal', 'Named Bullet, Greater', 'Terrain Bond'],
|
||||
//level5
|
||||
['Air Walk, Communal', 'Magic Siege Engine, Greater', 'Spell Immunity, Communal', 'Symbol of Striking', 'Tongues, Communal', 'Litany of Thunder', 'Litany of Vengeance', 'Stoneskin, Communal', ],
|
||||
//level6
|
||||
['Dust Form', 'Stoneskin, Communal', 'Tar Pool', 'Litany of Madness', 'Named Bullet, Greater'],
|
||||
//level7
|
||||
['Jolting Portent', 'Siege of Trees', ],
|
||||
//level8
|
||||
['Frightful Aspect', ],
|
||||
//level9
|
||||
['Spell Immunity, Greater Communal', 'Siege of Trees, Greater'],
|
||||
]
|
||||
}
|
||||
]; //end return
|
||||
};
|
||||
|
||||
Spells.getLevelSpell = function(level, type, source) {
|
||||
if(type === undefined) type = _.random(0,1) ? 'arcane' : 'divine';
|
||||
//valid values CRB, APG, UM, UC
|
||||
var sourceSpells = [];
|
||||
var spell = '';
|
||||
|
||||
if(source === undefined) {
|
||||
_.forEach(Spells.getSpells(), function(s) {
|
||||
sourceSpells = _(sourceSpells).concat(s[type][level]).value();
|
||||
});
|
||||
spell = _.sample(sourceSpells);
|
||||
}
|
||||
else {
|
||||
sourceSpells = _.findWhere(Spells.getSpells(), function(s) {
|
||||
return s.shortName == source.toUpperCase();
|
||||
});
|
||||
spell = _.sample(sourceSpells[type][level]);
|
||||
}
|
||||
return {'name': spell, 'level': level, 'type': type, 'source': ''};
|
||||
};
|
||||
@@ -0,0 +1,80 @@
|
||||
/*global _:false, console: true */
|
||||
'use strict';
|
||||
var Staves = {};
|
||||
Staves.baseUrl = 'http://paizo.com/pathfinderRPG/prd/magicItems/staves.html';
|
||||
Staves.getStaves = function() {
|
||||
return [
|
||||
{'name': 'Staff of Charming', 'cost': 17600, 'url': '#staff-of-charming'},
|
||||
{'name': 'Staff of Fire', 'cost': 18950, 'url': ''},
|
||||
{'name': 'Staff of Swarming Insects', 'cost': 22800, 'url': ''},
|
||||
{'name': 'Staff of Size Alteration', 'cost': 26150, 'url': ''},
|
||||
{'name': 'Staff of Healing', 'cost': 29600, 'url': ''},
|
||||
{'name': 'Staff of Frost', 'cost': 41400, 'url': ''},
|
||||
{'name': 'Staff of Illumination', 'cost': 51500, 'url': ''},
|
||||
{'name': 'Staff of Defense', 'cost': 62000, 'url': ''},
|
||||
{'name': 'Staff of Abjuration', 'cost': 82000, 'url': ''},
|
||||
{'name': 'Staff of Conjuration', 'cost': 82000, 'url': ''},
|
||||
{'name': 'Staff of Divination', 'cost': 82000, 'url': ''},
|
||||
{'name': 'Staff of Enchantment', 'cost': 82000, 'url': ''},
|
||||
{'name': 'Staff of Evocation', 'cost': 82000, 'url': ''},
|
||||
{'name': 'Staff of Illusion', 'cost': 82000, 'url': ''},
|
||||
{'name': 'Staff of Necromancy', 'cost': 82000, 'url': ''},
|
||||
{'name': 'Staff of Transmutation', 'cost': 82000, 'url': ''},
|
||||
{'name': 'Staff of Earth and Stone', 'cost': 85800, 'url': ''},
|
||||
{'name': 'Staff of Woodlands', 'cost': 100400, 'url': ''},
|
||||
{'name': 'Staff of Life', 'cost': 109400, 'url': ''},
|
||||
{'name': 'Staff of Passage', 'cost': 206900, 'url': ''},
|
||||
{'name': 'Staff of Power', 'cost': 235000, 'url': ''},
|
||||
];
|
||||
};
|
||||
|
||||
Staves.getStaff = function(type) {
|
||||
var roll = _.random(1,100);
|
||||
var staff = {};
|
||||
if(type == 'minor') {
|
||||
console.log('Error: There are no minor staves');
|
||||
return;
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 15): staff = Staves.getStaves()[0]; break;
|
||||
case (roll <= 30): staff = Staves.getStaves()[1]; break;
|
||||
case (roll <= 40): staff = Staves.getStaves()[2]; break;
|
||||
case (roll <= 55): staff = Staves.getStaves()[3]; break;
|
||||
case (roll <= 75): staff = Staves.getStaves()[4]; break;
|
||||
case (roll <= 90): staff = Staves.getStaves()[5]; break;
|
||||
case (roll <= 95): staff = Staves.getStaves()[6]; break;
|
||||
case (roll <= 100): staff = Staves.getStaves()[7]; break;
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 3): staff = Staves.getStaves()[0]; break;
|
||||
case (roll <= 9): staff = Staves.getStaves()[1]; break;
|
||||
case (roll <= 11): staff = Staves.getStaves()[2]; break;
|
||||
case (roll <= 13): staff = Staves.getStaves()[3]; break;
|
||||
case (roll <= 19): staff = Staves.getStaves()[4]; break;
|
||||
case (roll <= 24): staff = Staves.getStaves()[5]; break;
|
||||
case (roll <= 31): staff = Staves.getStaves()[6]; break;
|
||||
case (roll <= 38): staff = Staves.getStaves()[7]; break;
|
||||
case (roll <= 45): staff = Staves.getStaves()[8]; break;
|
||||
case (roll <= 50): staff = Staves.getStaves()[9]; break;
|
||||
case (roll <= 55): staff = Staves.getStaves()[10]; break;
|
||||
case (roll <= 60): staff = Staves.getStaves()[11]; break;
|
||||
case (roll <= 65): staff = Staves.getStaves()[12]; break;
|
||||
case (roll <= 70): staff = Staves.getStaves()[13]; break;
|
||||
case (roll <= 75): staff = Staves.getStaves()[14]; break;
|
||||
case (roll <= 80): staff = Staves.getStaves()[15]; break;
|
||||
case (roll <= 85): staff = Staves.getStaves()[16]; break;
|
||||
case (roll <= 90): staff = Staves.getStaves()[17]; break;
|
||||
case (roll <= 95): staff = Staves.getStaves()[18]; break;
|
||||
case (roll <= 98): staff = Staves.getStaves()[19]; break;
|
||||
case (roll <= 100): staff = Staves.getStaves()[20]; break;
|
||||
|
||||
}
|
||||
}
|
||||
if(_.random(1,100) <= 30) {
|
||||
staff.name += ' (with a clue as to its purpose)';
|
||||
}
|
||||
return staff;
|
||||
};
|
||||
@@ -0,0 +1,23 @@
|
||||
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)
|
||||
@@ -0,0 +1,38 @@
|
||||
/*global _:false */
|
||||
/*global Spells:true */
|
||||
'use strict';
|
||||
var Wands = {};
|
||||
|
||||
Wands.cost = [375, 750, 4500, 11250, 21000];
|
||||
|
||||
Wands.getLevelWand = function(level) {
|
||||
if(level < 0 || level > 4) return;
|
||||
var spell = Spells.getLevelSpell(level, 'arcane');
|
||||
return {'name': 'Wand of ' + spell.name,
|
||||
'description': '(spell level ' + level + ', caster level ' + _.max([1, (level*2-1)]) + ', 50 charges)',
|
||||
'cost': Wands.cost[level]
|
||||
};
|
||||
};
|
||||
|
||||
Wands.getWand = function(type) {
|
||||
var roll = _.random(1,100);
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 5): return Wands.getLevelWand(0);
|
||||
case (roll <= 60): return Wands.getLevelWand(1);
|
||||
case (roll <= 100): return Wands.getLevelWand(2);
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 60): return Wands.getLevelWand(2);
|
||||
case (roll <= 100): return Wands.getLevelWand(3);
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 60): return Wands.getLevelWand(3);
|
||||
case (roll <= 100): return Wands.getLevelWand(4);
|
||||
}
|
||||
}
|
||||
};
|
||||
+545
@@ -0,0 +1,545 @@
|
||||
/*global _:false */
|
||||
/*global Grimoire:true, Intelligence:true */
|
||||
|
||||
'use strict';
|
||||
var Weapons = {};
|
||||
Weapons.data = {
|
||||
'baseUrl': 'http://paizo.com/pathfinderRPG/prd/magicItems/weapons.html',
|
||||
// [name, bonus modifier, cost, url]
|
||||
'specific': [
|
||||
{'name': 'Sleep arrow', 'bonus': 0, 'cost': 132, 'url': '#sleep-arrow'},
|
||||
{'name': 'Screaming bolt', 'bonus': 0, 'cost': 267},
|
||||
{'name': 'Silver dagger (masterwork)', 'bonus': 0, 'cost': 322},
|
||||
{'name': 'Cold iron longsword (masterwork)', 'bonus': 0, 'cost': 330},
|
||||
{'name': 'Javelin of lightning', 'bonus': 0, 'cost': 1500},
|
||||
{'name': 'Slaying arrow', 'bonus': 0, 'cost': 2282},
|
||||
{'name': 'Adamantine dagger', 'bonus': 0, 'cost': 3002},
|
||||
{'name': 'Adamantine battleaxe', 'bonus': 0, 'cost': 3010},
|
||||
{'name': 'Slaying arrow (greater)', 'bonus': 0, 'cost': 4057},
|
||||
{'name': 'Shatterspike', 'bonus': 0, 'cost': 4315},
|
||||
{'name': 'Dagger of venom', 'bonus': 0, 'cost': 8302},
|
||||
{'name': 'Trident of warning', 'bonus': 0, 'cost': 10115},
|
||||
{'name': 'Assassin\'s dagger', 'bonus': 0, 'cost': 10302},
|
||||
{'name': 'Shifter\'s sorrow', 'bonus': 0, 'cost': 12780},
|
||||
{'name': 'Trident of fish command', 'bonus': 0, 'cost': 18650},
|
||||
{'name': 'Flame tongue', 'bonus': 0, 'cost': 20715},
|
||||
{'name': 'Luck blade (0 wishes)', 'bonus': 0, 'cost': 22060},
|
||||
{'name': 'Sword of subtlety', 'bonus': 0, 'cost': 22310},
|
||||
{'name': 'Sword of the planes', 'bonus': 0, 'cost': 22315},
|
||||
{'name': 'Nine lives stealer', 'bonus': 0, 'cost': 23057},
|
||||
{'name': 'Oathbow', 'bonus': 0, 'cost': 25600},
|
||||
{'name': 'Sword of life stealing', 'bonus': 0, 'cost': 25715},
|
||||
{'name': 'Mace of terror', 'bonus': 0, 'cost': 38552},
|
||||
{'name': 'Life-drinker', 'bonus': 0, 'cost': 40320},
|
||||
{'name': 'Sylvan scimitar', 'bonus': 0, 'cost': 47315},
|
||||
{'name': 'Rapier of puncturing', 'bonus': 0, 'cost': 50320},
|
||||
{'name': 'Sun blade', 'bonus': 0, 'cost': 50335},
|
||||
{'name': 'Frost brand', 'bonus': 0, 'cost': 54475},
|
||||
{'name': 'Dwarven thrower', 'bonus': 0, 'cost': 60312},
|
||||
{'name': 'Luck blade (1 wish)', 'bonus': 0, 'cost': 62360},
|
||||
{'name': 'Mace of smiting', 'bonus': 0, 'cost': 75312},
|
||||
{'name': 'Luck blade (2 wishes)', 'bonus': 0, 'cost': 102660},
|
||||
{'name': 'Holy avenger', 'bonus': 0, 'cost': 120630},
|
||||
{'name': 'Luck blade (3 wishes)', 'bonus': 0, 'cost': 14296},
|
||||
] //34 specific weapons
|
||||
};
|
||||
|
||||
Weapons.getSpecific = function(type) {
|
||||
var roll = _.random(1,100);
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case(roll <= 15): return Weapons.data.specific[0];
|
||||
case(roll <= 25): return Weapons.data.specific[1];
|
||||
case(roll <= 45): return Weapons.data.specific[2];
|
||||
case(roll <= 65): return Weapons.data.specific[3];
|
||||
case(roll <= 75): return Weapons.data.specific[4];
|
||||
case(roll <= 80): return Weapons.data.specific[5];
|
||||
case(roll <= 90): return Weapons.data.specific[6];
|
||||
case(roll <= 100): return Weapons.data.specific[7];
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case(roll <= 9): return Weapons.data.specific[4];
|
||||
case(roll <= 15): return Weapons.data.specific[5];
|
||||
case(roll <= 24): return Weapons.data.specific[6];
|
||||
case(roll <= 33): return Weapons.data.specific[7];
|
||||
case(roll <= 37): return Weapons.data.specific[8];
|
||||
case(roll <= 40): return Weapons.data.specific[9];
|
||||
case(roll <= 46): return Weapons.data.specific[10];
|
||||
case(roll <= 51): return Weapons.data.specific[11];
|
||||
case(roll <= 57): return Weapons.data.specific[12];
|
||||
case(roll <= 62): return Weapons.data.specific[13];
|
||||
case(roll <= 66): return Weapons.data.specific[14];
|
||||
case(roll <= 74): return Weapons.data.specific[15];
|
||||
case(roll <= 79): return Weapons.data.specific[16];
|
||||
case(roll <= 86): return Weapons.data.specific[17];
|
||||
case(roll <= 91): return Weapons.data.specific[18];
|
||||
case(roll <= 95): return Weapons.data.specific[19];
|
||||
case(roll <= 98): return Weapons.data.specific[20];
|
||||
case(roll <= 100): return Weapons.data.specific[21];
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case(roll <= 4): return Weapons.data.specific[12];
|
||||
case(roll <= 7): return Weapons.data.specific[13];
|
||||
case(roll <= 9): return Weapons.data.specific[14];
|
||||
case(roll <= 13): return Weapons.data.specific[15];
|
||||
case(roll <= 17): return Weapons.data.specific[16];
|
||||
case(roll <= 24): return Weapons.data.specific[17];
|
||||
case(roll <= 31): return Weapons.data.specific[18];
|
||||
case(roll <= 37): return Weapons.data.specific[19];
|
||||
case(roll <= 42): return Weapons.data.specific[20];
|
||||
case(roll <= 46): return Weapons.data.specific[21];
|
||||
case(roll <= 51): return Weapons.data.specific[22];
|
||||
case(roll <= 57): return Weapons.data.specific[23];
|
||||
case(roll <= 62): return Weapons.data.specific[24];
|
||||
case(roll <= 67): return Weapons.data.specific[25];
|
||||
case(roll <= 73): return Weapons.data.specific[26];
|
||||
case(roll <= 79): return Weapons.data.specific[27];
|
||||
case(roll <= 84): return Weapons.data.specific[28];
|
||||
case(roll <= 91): return Weapons.data.specific[29];
|
||||
case(roll <= 95): return Weapons.data.specific[30];
|
||||
case(roll <= 97): return Weapons.data.specific[31];
|
||||
case(roll <= 99): return Weapons.data.specific[32];
|
||||
case(roll <= 100): return Weapons.data.specific[33];
|
||||
}
|
||||
}
|
||||
}; //end getSpecific
|
||||
|
||||
Weapons.data.meleeSpecial = [
|
||||
{'name': 'Bane', 'bonus': 1},
|
||||
{'name': 'Defending', 'bonus': 1},
|
||||
{'name': 'Flaming', 'bonus': 1},
|
||||
{'name': 'Frost', 'bonus': 1},
|
||||
{'name': 'Shock', 'bonus': 1},
|
||||
{'name': 'Ghost touch', 'bonus': 1},
|
||||
{'name': 'Keen', 'bonus': 1},
|
||||
{'name': 'Ki Focus', 'bonus': 1},
|
||||
{'name': 'Merciful', 'bonus': 1},
|
||||
{'name': 'Mighty cleaving', 'bonus': 1},
|
||||
{'name': 'Spell storing', 'bonus': 1},
|
||||
{'name': 'Throwing', 'bonus': 1},
|
||||
{'name': 'Thundering', 'bonus': 1},
|
||||
{'name': 'Vicious', 'bonus': 1},
|
||||
{'name': 'Anarchic', 'bonus': 2},
|
||||
{'name': 'Axiomatic', 'bonus': 2},
|
||||
{'name': 'Disruption', 'bonus': 2},
|
||||
{'name': 'Flaming burst', 'bonus': 2},
|
||||
{'name': 'Icy burst', 'bonus': 2},
|
||||
{'name': 'Holy', 'bonus': 2},
|
||||
{'name': 'Shocking burst', 'bonus': 2},
|
||||
{'name': 'Unholy', 'bonus': 2},
|
||||
{'name': 'Wounding', 'bonus': 2},
|
||||
{'name': 'Speed', 'bonus': 3},
|
||||
{'name': 'Brilliant energy', 'bonus': 4},
|
||||
{'name': 'Dancing', 'bonus': 4},
|
||||
{'name': 'Vorpal', 'bonus': 5},
|
||||
]; //27 melee specials - name, bonus modifier
|
||||
// 100 96–100 91–100 Roll again twice4
|
||||
|
||||
Grimoire.getHumanoidType = function() {
|
||||
var roll = _.random(1,100);
|
||||
switch(true) {
|
||||
case (roll <= 6): return 'aquatic';
|
||||
case (roll <= 19): return 'dwarf';
|
||||
case (roll <= 32): return 'elf';
|
||||
case (roll <= 39): return 'giant';
|
||||
case (roll <= 45): return 'goblinoid';
|
||||
case (roll <= 52): return 'gnoll';
|
||||
case (roll <= 59): return 'gnome';
|
||||
case (roll <= 67): return 'halfling';
|
||||
case (roll <= 79): return 'human';
|
||||
case (roll <= 92): return 'orc';
|
||||
case (roll <= 100): return 'reptilian';
|
||||
}
|
||||
};
|
||||
|
||||
Grimoire.getOutsiderType = function() {
|
||||
var roll = _.random(1,100);
|
||||
switch(true) {
|
||||
//There is NO roll chart for picking outsiders types.
|
||||
//I made up this roll. Common enemy types have ~2x chance to roll
|
||||
case (roll <= 9): return 'air';
|
||||
case (roll <= 18): return 'earth';
|
||||
case (roll <= 27): return 'fire';
|
||||
case (roll <= 36): return 'water';
|
||||
case (roll <= 54): return 'chaotic';
|
||||
case (roll <= 72): return 'evil';
|
||||
case (roll <= 81): return 'good';
|
||||
case (roll <= 90): return 'lawful';
|
||||
case (roll <= 100): return 'native';
|
||||
}
|
||||
};
|
||||
|
||||
Weapons.getBane = function() {
|
||||
var roll = _.random(1,100);
|
||||
switch(true) {
|
||||
//There is NO roll chart for picking outsiders types.
|
||||
//I made up this roll. Common enemy types have ~2x chance to roll
|
||||
case (roll <= 5): return 'Bane of Aberations';
|
||||
case (roll <= 9): return 'Bane of Animals';
|
||||
case (roll <= 16): return 'Bane of Constructs';
|
||||
case (roll <= 22): return 'Bane of Dragons';
|
||||
case (roll <= 27): return 'Bane of Fey';
|
||||
case (roll <= 60): return 'Bane of Humanoids (' + Grimoire.getHumanoidType() + ')';
|
||||
case (roll <= 65): return 'Bane of Magical Beasts';
|
||||
case (roll <= 70): return 'Bane of Monstrous Humanoids';
|
||||
case (roll <= 72): return 'Bane of Oozes';
|
||||
case (roll <= 88): return 'Bane of Outsiders (' + Grimoire.getOutsiderType() + ')';
|
||||
case (roll <= 90): return 'Bane of Plants';
|
||||
case (roll <= 98): return 'Bane of Undead';
|
||||
case (roll <= 100): return 'Bane of Vermin';
|
||||
}
|
||||
};
|
||||
|
||||
Weapons.getMeleeSpecial = function(type) {
|
||||
//TODO: check for conflicting or duplicate specials
|
||||
var roll = _.random(1,100);
|
||||
var s1, s2;
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 10): return {'name': Weapons.getBane(), 'bonus': 1};
|
||||
case (roll <= 17): return Weapons.data.meleeSpecial[1];
|
||||
case (roll <= 27): return Weapons.data.meleeSpecial[2];
|
||||
case (roll <= 37): return Weapons.data.meleeSpecial[3];
|
||||
case (roll <= 47): return Weapons.data.meleeSpecial[4];
|
||||
case (roll <= 56): return Weapons.data.meleeSpecial[5];
|
||||
case (roll <= 67): return Weapons.data.meleeSpecial[6];
|
||||
case (roll <= 71): return Weapons.data.meleeSpecial[7];
|
||||
case (roll <= 75): return Weapons.data.meleeSpecial[8];
|
||||
case (roll <= 82): return Weapons.data.meleeSpecial[9];
|
||||
case (roll <= 87): return Weapons.data.meleeSpecial[10];
|
||||
case (roll <= 91): return Weapons.data.meleeSpecial[11];
|
||||
case (roll <= 95): return Weapons.data.meleeSpecial[12];
|
||||
case (roll <= 99): return Weapons.data.meleeSpecial[13];
|
||||
case (roll <= 100): //roll twice
|
||||
s1 = Weapons.getMeleeSpecial('minor');
|
||||
s2 = Weapons.getMeleeSpecial('minor');
|
||||
return {'name': s1.name + ' ' + s2.name, 'bonus': s1.bonus + s2.bonus};
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 6): return {'name': Weapons.getBane(), 'bonus': 1};
|
||||
case (roll <= 12): return Weapons.data.meleeSpecial[1];
|
||||
case (roll <= 19): return Weapons.data.meleeSpecial[2];
|
||||
case (roll <= 26): return Weapons.data.meleeSpecial[3];
|
||||
case (roll <= 33): return Weapons.data.meleeSpecial[4];
|
||||
case (roll <= 38): return Weapons.data.meleeSpecial[5];
|
||||
case (roll <= 44): return Weapons.data.meleeSpecial[6];
|
||||
case (roll <= 48): return Weapons.data.meleeSpecial[7];
|
||||
case (roll <= 50): return Weapons.data.meleeSpecial[8];
|
||||
case (roll <= 54): return Weapons.data.meleeSpecial[9];
|
||||
case (roll <= 59): return Weapons.data.meleeSpecial[10];
|
||||
case (roll <= 63): return Weapons.data.meleeSpecial[11];
|
||||
case (roll <= 65): return Weapons.data.meleeSpecial[12];
|
||||
case (roll <= 69): return Weapons.data.meleeSpecial[13];
|
||||
case (roll <= 72): return Weapons.data.meleeSpecial[14];
|
||||
case (roll <= 75): return Weapons.data.meleeSpecial[15];
|
||||
case (roll <= 78): return Weapons.data.meleeSpecial[16];
|
||||
case (roll <= 81): return Weapons.data.meleeSpecial[17];
|
||||
case (roll <= 84): return Weapons.data.meleeSpecial[18];
|
||||
case (roll <= 87): return Weapons.data.meleeSpecial[19];
|
||||
case (roll <= 90): return Weapons.data.meleeSpecial[20];
|
||||
case (roll <= 93): return Weapons.data.meleeSpecial[21];
|
||||
case (roll <= 95): return Weapons.data.meleeSpecial[22];
|
||||
case (roll <= 100): //roll twice
|
||||
s1 = Weapons.getMeleeSpecial('medium');
|
||||
s2 = Weapons.getMeleeSpecial('medium');
|
||||
return {'name': s1.name + ' ' + s2.name, 'bonus': s1.bonus + s2.bonus};
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 3): return {'name': Weapons.getBane(), 'bonus': 1};
|
||||
case (roll <= 6): return Weapons.data.meleeSpecial[2];
|
||||
case (roll <= 9): return Weapons.data.meleeSpecial[3];
|
||||
case (roll <= 12): return Weapons.data.meleeSpecial[4];
|
||||
case (roll <= 15): return Weapons.data.meleeSpecial[5];
|
||||
case (roll <= 19): return Weapons.data.meleeSpecial[7];
|
||||
case (roll <= 21): return Weapons.data.meleeSpecial[9];
|
||||
case (roll <= 24): return Weapons.data.meleeSpecial[10];
|
||||
case (roll <= 28): return Weapons.data.meleeSpecial[11];
|
||||
case (roll <= 32): return Weapons.data.meleeSpecial[12];
|
||||
case (roll <= 36): return Weapons.data.meleeSpecial[13];
|
||||
case (roll <= 41): return Weapons.data.meleeSpecial[14];
|
||||
case (roll <= 46): return Weapons.data.meleeSpecial[15];
|
||||
case (roll <= 49): return Weapons.data.meleeSpecial[16];
|
||||
case (roll <= 54): return Weapons.data.meleeSpecial[17];
|
||||
case (roll <= 59): return Weapons.data.meleeSpecial[18];
|
||||
case (roll <= 64): return Weapons.data.meleeSpecial[19];
|
||||
case (roll <= 69): return Weapons.data.meleeSpecial[20];
|
||||
case (roll <= 74): return Weapons.data.meleeSpecial[21];
|
||||
case (roll <= 78): return Weapons.data.meleeSpecial[22];
|
||||
case (roll <= 83): return Weapons.data.meleeSpecial[23];
|
||||
case (roll <= 86): return Weapons.data.meleeSpecial[24];
|
||||
case (roll <= 88): return Weapons.data.meleeSpecial[25];
|
||||
case (roll <= 90): return Weapons.data.meleeSpecial[26];
|
||||
case (roll <= 100): //roll twice
|
||||
s1 = Weapons.getMeleeSpecial('major');
|
||||
s2 = Weapons.getMeleeSpecial('major');
|
||||
return {'name': s1.name + ' ' + s2.name, 'bonus': s1.bonus + s2.bonus};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Weapons.data.rangedSpecial = [
|
||||
{'name': 'Bane', 'bonus': 1},
|
||||
{'name': 'Distance', 'bonus': 1},
|
||||
{'name': 'Flaming', 'bonus': 1},
|
||||
{'name': 'Frost', 'bonus': 1},
|
||||
{'name': 'Merciful', 'bonus': 1},
|
||||
{'name': 'Returning', 'bonus': 1},
|
||||
{'name': 'Shock', 'bonus': 1},
|
||||
{'name': 'Seeking', 'bonus': 1},
|
||||
{'name': 'Thundering', 'bonus': 1},
|
||||
{'name': 'Anarchic', 'bonus': 2},
|
||||
{'name': 'Axiomatic', 'bonus': 2},
|
||||
{'name': 'Flaming burst', 'bonus': 2},
|
||||
{'name': 'Holy', 'bonus': 2},
|
||||
{'name': 'Icy burst', 'bonus': 2},
|
||||
{'name': 'Shocking burst', 'bonus': 2},
|
||||
{'name': 'Unholy', 'bonus': 2},
|
||||
{'name': 'Speed', 'bonus': 3},
|
||||
{'name': 'Brilliant energy', 'bonus': 4},
|
||||
]; //18 ranged specials - name, bonus modifier
|
||||
|
||||
Weapons.getRangedSpecial = function(type) {
|
||||
var roll = _.random(1,100);
|
||||
var s1, s2;
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 12): return {'name': Weapons.getBane(), 'bonus': 1};
|
||||
case (roll <= 25): return Weapons.data.rangedSpecial[1];
|
||||
case (roll <= 40): return Weapons.data.rangedSpecial[2];
|
||||
case (roll <= 55): return Weapons.data.rangedSpecial[3];
|
||||
case (roll <= 60): return Weapons.data.rangedSpecial[4];
|
||||
case (roll <= 68): return Weapons.data.rangedSpecial[5];
|
||||
case (roll <= 83): return Weapons.data.rangedSpecial[6];
|
||||
case (roll <= 93): return Weapons.data.rangedSpecial[7];
|
||||
case (roll <= 99): return Weapons.data.rangedSpecial[8];
|
||||
case (roll <= 100): //roll twice
|
||||
s1 = Weapons.getRangedSpecial('minor');
|
||||
s2 = Weapons.getRangedSpecial('minor');
|
||||
return {'name': s1.name + ' ' + s2.name, 'bonus': s1.bonus + s2.bonus};
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 8): return {'name': Weapons.getBane(), 'bonus': 1};
|
||||
case (roll <= 16): return Weapons.data.rangedSpecial[1];
|
||||
case (roll <= 28): return Weapons.data.rangedSpecial[2];
|
||||
case (roll <= 40): return Weapons.data.rangedSpecial[3];
|
||||
case (roll <= 42): return Weapons.data.rangedSpecial[4];
|
||||
case (roll <= 47): return Weapons.data.rangedSpecial[5];
|
||||
case (roll <= 59): return Weapons.data.rangedSpecial[6];
|
||||
case (roll <= 64): return Weapons.data.rangedSpecial[7];
|
||||
case (roll <= 68): return Weapons.data.rangedSpecial[8];
|
||||
case (roll <= 71): return Weapons.data.rangedSpecial[9];
|
||||
case (roll <= 74): return Weapons.data.rangedSpecial[10];
|
||||
case (roll <= 79): return Weapons.data.rangedSpecial[11];
|
||||
case (roll <= 82): return Weapons.data.rangedSpecial[12];
|
||||
case (roll <= 87): return Weapons.data.rangedSpecial[13];
|
||||
case (roll <= 92): return Weapons.data.rangedSpecial[14];
|
||||
case (roll <= 95): return Weapons.data.rangedSpecial[15];
|
||||
case (roll <= 100): //roll twice
|
||||
s1 = Weapons.getRangedSpecial('medium');
|
||||
s2 = Weapons.getRangedSpecial('medium');
|
||||
return {'name': s1.name + ' ' + s2.name, 'bonus': s1.bonus + s2.bonus};
|
||||
}
|
||||
}
|
||||
if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 4): return {'name': Weapons.getBane(), 'bonus': 1};
|
||||
case (roll <= 8): return Weapons.data.rangedSpecial[1];
|
||||
case (roll <= 12): return Weapons.data.rangedSpecial[2];
|
||||
case (roll <= 16): return Weapons.data.rangedSpecial[3];
|
||||
case (roll <= 21): return Weapons.data.rangedSpecial[5];
|
||||
case (roll <= 25): return Weapons.data.rangedSpecial[6];
|
||||
case (roll <= 27): return Weapons.data.rangedSpecial[7];
|
||||
case (roll <= 29): return Weapons.data.rangedSpecial[8];
|
||||
case (roll <= 34): return Weapons.data.rangedSpecial[9];
|
||||
case (roll <= 39): return Weapons.data.rangedSpecial[10];
|
||||
case (roll <= 49): return Weapons.data.rangedSpecial[11];
|
||||
case (roll <= 54): return Weapons.data.rangedSpecial[12];
|
||||
case (roll <= 64): return Weapons.data.rangedSpecial[13];
|
||||
case (roll <= 74): return Weapons.data.rangedSpecial[14];
|
||||
case (roll <= 79): return Weapons.data.rangedSpecial[15];
|
||||
case (roll <= 84): return Weapons.data.rangedSpecial[16];
|
||||
case (roll <= 90): return Weapons.data.rangedSpecial[17];
|
||||
case (roll <= 100): //roll twice
|
||||
s1 = Weapons.getRangedSpecial('major');
|
||||
s2 = Weapons.getRangedSpecial('major');
|
||||
return {'name': s1.name + ' ' + s2.name, 'bonus': s1.bonus + s2.bonus};
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Weapons.data.bonusCost = [
|
||||
{'name': '', 'bonus': 0, 'cost': 0}, //just for bookkeeping
|
||||
{'name': '+1', 'bonus': 1, 'cost': 2000},
|
||||
{'name': '+2', 'bonus': 2, 'cost': 8000},
|
||||
{'name': '+3', 'bonus': 3, 'cost': 18000},
|
||||
{'name': '+4', 'bonus': 4, 'cost': 32000},
|
||||
{'name': '+5', 'bonus': 5, 'cost': 50000},
|
||||
{'name': '+6', 'bonus': 6, 'cost': 72000},
|
||||
{'name': '+7', 'bonus': 7, 'cost': 98000},
|
||||
{'name': '+8', 'bonus': 8, 'cost': 128000},
|
||||
{'name': '+9', 'bonus': 9, 'cost': 162000},
|
||||
{'name': '+10', 'bonus': 10, 'cost': 200000},
|
||||
//5 possible roll'able weapons. Specific type of weapon is left up to DM
|
||||
];
|
||||
|
||||
Weapons.getWeapon = function(type, wClass, final) {
|
||||
//TODO: resolve issue where you get a 'Glowing Glowing Glowing item'
|
||||
final = typeof final !== 'undefined' ? final : true; //set to false when we recursively call getWeapon
|
||||
if(wClass === undefined) {
|
||||
if(_.random(1,100) <= 75)
|
||||
wClass = 'melee';
|
||||
else
|
||||
wClass = 'ranged';
|
||||
}
|
||||
var roll = _.random(1,100);
|
||||
var weapon = {};
|
||||
var newWeapon;
|
||||
var special;
|
||||
if(type == 'minor') {
|
||||
switch(true) {
|
||||
case (roll <= 70):
|
||||
weapon = {'name': Weapons.data.bonusCost[1].name + ' ' + type + ' ' + wClass + ' weapon',
|
||||
'bonus': Weapons.data.bonusCost[1].bonus,
|
||||
'cost': Weapons.data.bonusCost[1].cost,};
|
||||
break;
|
||||
case (roll <= 85):
|
||||
weapon = {'name': Weapons.data.bonusCost[2].name + ' ' + type + ' ' + wClass + ' weapon',
|
||||
'bonus': Weapons.data.bonusCost[2].bonus,
|
||||
'cost': Weapons.data.bonusCost[2].cost,};
|
||||
break;
|
||||
case (roll <= 90):
|
||||
weapon = Weapons.getSpecific(type);
|
||||
break;
|
||||
case (roll <= 100):
|
||||
//'Special ability and roll again'
|
||||
newWeapon = Weapons.getWeapon(type, wClass, false);
|
||||
special = (wClass == 'melee') ? Weapons.getMeleeSpecial(type) : Weapons.getRangedSpecial(type);
|
||||
if(newWeapon.bonus + special.bonus <= 10) {
|
||||
weapon = {'name': special.name + ' ' + newWeapon.name,
|
||||
'bonus': special.bonus + newWeapon.bonus,
|
||||
//base weapon cost plus the difference between bonuses
|
||||
'cost': newWeapon.cost + Weapons.data.bonusCost[newWeapon.bonus + special.bonus].cost - Weapons.data.bonusCost[newWeapon.bonus].cost,
|
||||
};
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(type == 'medium') {
|
||||
switch(true) {
|
||||
case (roll <= 10):
|
||||
weapon = {'name': Weapons.data.bonusCost[1].name + ' ' + type + ' ' + wClass + ' weapon',
|
||||
'bonus': Weapons.data.bonusCost[1].bonus,
|
||||
'cost': Weapons.data.bonusCost[1].cost,};
|
||||
break;
|
||||
case (roll <= 29):
|
||||
weapon = {'name': Weapons.data.bonusCost[2].name + ' ' + type + ' ' + wClass + ' weapon',
|
||||
'bonus': Weapons.data.bonusCost[2].bonus,
|
||||
'cost': Weapons.data.bonusCost[2].cost,};
|
||||
break;
|
||||
case (roll <= 58):
|
||||
weapon = {'name': Weapons.data.bonusCost[3].name + ' ' + type + ' ' + wClass + ' weapon',
|
||||
'bonus': Weapons.data.bonusCost[3].bonus,
|
||||
'cost': Weapons.data.bonusCost[3].cost,};
|
||||
break;
|
||||
case (roll <= 62):
|
||||
weapon = {'name': Weapons.data.bonusCost[4].name + ' ' + type + ' ' + wClass + ' weapon',
|
||||
'bonus': Weapons.data.bonusCost[4].bonus,
|
||||
'cost': Weapons.data.bonusCost[4].cost,};
|
||||
break;
|
||||
case (roll <= 68):
|
||||
weapon = Weapons.getSpecific(type);
|
||||
break;
|
||||
case (roll <= 100):
|
||||
//'Special ability and roll again'
|
||||
newWeapon = Weapons.getWeapon(type, wClass, false);
|
||||
special = (wClass == 'melee') ? Weapons.getMeleeSpecial(type) : Weapons.getRangedSpecial(type);
|
||||
if(newWeapon.bonus + special.bonus <= 10) {
|
||||
weapon = {'name': special.name + ' ' + newWeapon.name,
|
||||
'bonus': special.bonus + newWeapon.bonus,
|
||||
//base weapon cost plus the difference between bonuses
|
||||
'cost': newWeapon.cost + Weapons.data.bonusCost[newWeapon.bonus + special.bonus].cost - Weapons.data.bonusCost[newWeapon.bonus].cost,
|
||||
};
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(type == 'major') {
|
||||
switch(true) {
|
||||
case (roll <= 20):
|
||||
weapon = {'name': Weapons.data.bonusCost[3].name + ' ' + type + ' ' + wClass + ' weapon',
|
||||
'bonus': Weapons.data.bonusCost[3].bonus,
|
||||
'cost': Weapons.data.bonusCost[3].cost,};
|
||||
break;
|
||||
case (roll <= 38):
|
||||
weapon = {'name': Weapons.data.bonusCost[4].name + ' ' + type + ' ' + wClass + ' weapon',
|
||||
'bonus': Weapons.data.bonusCost[4].bonus,
|
||||
'cost': Weapons.data.bonusCost[4].cost,};
|
||||
break;
|
||||
case (roll <= 49):
|
||||
weapon = {'name': Weapons.data.bonusCost[5].name + ' ' + type + ' ' + wClass + ' weapon',
|
||||
'bonus': Weapons.data.bonusCost[5].bonus,
|
||||
'cost': Weapons.data.bonusCost[5].cost,};
|
||||
break;
|
||||
case (roll <= 63):
|
||||
weapon = Weapons.getSpecific(type);
|
||||
break;
|
||||
case (roll <= 100):
|
||||
//'Special ability and roll again'
|
||||
newWeapon = Weapons.getWeapon(type, wClass, false);
|
||||
special = (wClass == 'melee') ? Weapons.getMeleeSpecial(type) : Weapons.getRangedSpecial(type);
|
||||
if(newWeapon.bonus + special.bonus <= 10) {
|
||||
weapon = {'name': special.name + ' ' + newWeapon.name,
|
||||
'bonus': special.bonus + newWeapon.bonus,
|
||||
//base weapon cost plus the difference between bonuses
|
||||
'cost': newWeapon.cost + Weapons.data.bonusCost[newWeapon.bonus + special.bonus].cost - Weapons.data.bonusCost[newWeapon.bonus].cost,
|
||||
};
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var i = weapon.name.indexOf('+');
|
||||
if(i != -1) {
|
||||
//move the '+X' to the front
|
||||
weapon.name = weapon.name.slice(i, i+3) + weapon.name.slice(0, i) + weapon.name.slice(i+3);
|
||||
}
|
||||
|
||||
//There is the possibility of getting a special modifier on a specific item that does not match
|
||||
//This is hilarious and has not yet been fixed
|
||||
|
||||
if(final === true && _.random(1,100) === 1) {
|
||||
weapon.name = 'Intelligent ' + weapon.name;
|
||||
weapon.intelligence = Intelligence.getItemIntelligence(weapon.cost);
|
||||
}
|
||||
|
||||
if(final === true && _.random(1,100) <= 30) {
|
||||
weapon.name = 'Glowing ' + weapon.name;
|
||||
}
|
||||
return weapon;
|
||||
};
|
||||
|
||||
Weapons.getWeapons = function (numMinor, numMedium, numMajor, wClass) {
|
||||
//where wClass can be 'melee' or 'ranged'
|
||||
var weapons = [];
|
||||
_(numMinor).times(function() {
|
||||
weapons.push(Weapons.getWeapon('minor', wClass));
|
||||
});
|
||||
_(numMedium).times(function() {
|
||||
weapons.push(Weapons.getWeapon('medium', wClass));
|
||||
});
|
||||
_(numMajor).times(function() {
|
||||
weapons.push(Weapons.getWeapon('major', wClass));
|
||||
});
|
||||
return weapons;
|
||||
};
|
||||
@@ -0,0 +1,512 @@
|
||||
/*global _:false */
|
||||
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;
|
||||
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