diff --git a/shared/homebrewery/brewEditor/menubar/menubar.less b/shared/homebrewery/brewEditor/menubar/menubar.less
index 653e82c3b..e8575282b 100644
--- a/shared/homebrewery/brewEditor/menubar/menubar.less
+++ b/shared/homebrewery/brewEditor/menubar/menubar.less
@@ -32,4 +32,9 @@
}
}
}
+
+ .snippets{
+ display : flex;
+ height : 100%;
+ }
}
\ No newline at end of file
diff --git a/shared/homebrewery/brewEditor/menubar/snippet.map.js b/shared/homebrewery/brewEditor/menubar/snippet.map.js
new file mode 100644
index 000000000..85571def7
--- /dev/null
+++ b/shared/homebrewery/brewEditor/menubar/snippet.map.js
@@ -0,0 +1,48 @@
+const Snippets = require('homebrewery/snippets');
+
+module.exports = {
+ brew : [
+ {
+ name : 'PHB',
+ icon : 'fa-book',
+ snippets : [
+ {
+ name : 'Spell',
+ icon : 'fa-magic',
+ gen : Snippets.brew.spell
+ },
+ {
+ name : 'Table',
+ icon : 'fa-table',
+ gen : Snippets.brew.table
+ },
+
+ ]
+ },
+ {
+ name : 'Mods',
+ icon : 'fa-gear',
+ snippets : []
+ }
+ ],
+
+ style : [
+ {
+ name : 'Print',
+ icon : 'fa-print',
+ snippets : [
+ {
+ name : 'Ink Friendly',
+ icon : 'fa-tint',
+ gen : Snippets.style.inkFriendly
+ },
+ {
+ name : 'A4 Page Size',
+ icon : 'fa-file',
+ gen : Snippets.style.a4
+ },
+
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.jsx b/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.jsx
new file mode 100644
index 000000000..8268e0eda
--- /dev/null
+++ b/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.jsx
@@ -0,0 +1,42 @@
+
+const React = require('react');
+const _ = require('lodash');
+const cx = require('classnames');
+
+const SnippetGroup = React.createClass({
+ getDefaultProps: function() {
+ return {
+ brew : '',
+ name : '',
+ icon : 'fa-rocket',
+ snippets : [],
+ onClick : function(){},
+ };
+ },
+ handleSnippetClick : function(snippet){
+ this.props.onClick(snippet.gen());
+ },
+ renderSnippets : function(){
+ return _.map(this.props.snippets, (snippet)=>{
+ return
+
+ {snippet.name}
+
+ })
+ },
+
+ render : function(){
+ return
+
+
+ {this.props.name}
+
+
+ {this.renderSnippets()}
+
+
+ },
+
+});
+
+module.exports = SnippetGroup;
diff --git a/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.less b/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.less
new file mode 100644
index 000000000..9dab43510
--- /dev/null
+++ b/shared/homebrewery/brewEditor/menubar/snippetGroup/snippetGroup.less
@@ -0,0 +1,56 @@
+.snippetGroup{
+ //display : inline-block;
+ display : flex;
+ height : 100%;
+ align-items : center;
+
+ //height : @menuHeight;
+ padding : 0px 5px;
+ cursor : pointer;
+ font-size : 0.6em;
+ font-weight : 800;
+ ///line-height : @menuHeight;
+ text-transform : uppercase;
+ border-right : 1px solid black;
+ i{
+ vertical-align : middle;
+ margin-right : 3px;
+ font-size : 1.2em;
+ }
+ &:hover, &.selected{
+ background-color : #999;
+ }
+ .text{
+ //line-height : @menuHeight;
+ .groupName{
+ font-size : 10px;
+ }
+ }
+ &:hover{
+ .dropdown{
+ visibility : visible;
+ }
+ }
+ .dropdown{
+ position : absolute;
+ top : 100%;
+ visibility : hidden;
+ z-index : 1000;
+ margin-left : -5px;
+ padding : 0px;
+ background-color : #ddd;
+ .snippet{
+ .animate(background-color);
+ padding : 10px;
+ cursor : pointer;
+ font-size : 10px;
+ i{
+ margin-right : 8px;
+ font-size : 13px;
+ }
+ &:hover{
+ background-color : #999;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/shared/homebrewery/brewEditor/snippetbar/snippetbar.jsx b/shared/homebrewery/brewEditor/snippetbar/snippetbar.jsx
deleted file mode 100644
index 29c6b43ca..000000000
--- a/shared/homebrewery/brewEditor/snippetbar/snippetbar.jsx
+++ /dev/null
@@ -1,94 +0,0 @@
-const React = require('react');
-const _ = require('lodash');
-const cx = require('classnames');
-
-
-const Snippets = require('./snippets/snippets.js');
-
-const execute = function(val, brew){
- if(_.isFunction(val)) return val(brew);
- return val;
-}
-
-
-
-const Snippetbar = React.createClass({
- getDefaultProps: function() {
- return {
- brew : '',
- onInject : ()=>{},
- onToggle : ()=>{},
- showmeta : false
- };
- },
-
- handleSnippetClick : function(injectedText){
- this.props.onInject(injectedText)
- },
-
- renderSnippetGroups : function(){
- return _.map(Snippets, (snippetGroup)=>{
- return
- })
- },
-
- render : function(){
- return
- {this.renderSnippetGroups()}
-
-
-
-
- }
-});
-
-module.exports = Snippetbar;
-
-
-
-
-
-
-const SnippetGroup = React.createClass({
- getDefaultProps: function() {
- return {
- brew : '',
- groupName : '',
- icon : 'fa-rocket',
- snippets : [],
- onSnippetClick : function(){},
- };
- },
- handleSnippetClick : function(snippet){
- this.props.onSnippetClick(execute(snippet.gen, this.props.brew));
- },
- renderSnippets : function(){
- return _.map(this.props.snippets, (snippet)=>{
- return
-
- {snippet.name}
-
- })
- },
-
- render : function(){
- return
-
-
- {this.props.groupName}
-
-
- {this.renderSnippets()}
-
-
- },
-
-});
\ No newline at end of file
diff --git a/shared/homebrewery/brewEditor/snippetbar/snippetbar.less b/shared/homebrewery/brewEditor/snippetbar/snippetbar.less
deleted file mode 100644
index 45a6efe2f..000000000
--- a/shared/homebrewery/brewEditor/snippetbar/snippetbar.less
+++ /dev/null
@@ -1,72 +0,0 @@
-
-.snippetBar{
- @height : 25px;
- position : relative;
- height : @height;
- background-color : #ddd;
- .toggleMeta{
- position : absolute;
- top : 0px;
- right : 0px;
- height : @height;
- width : @height;
- cursor : pointer;
- line-height : @height;
- text-align : center;
- &:hover, &.selected{
- background-color : #999;
- }
- }
- .snippetGroup{
- display : inline-block;
- height : @height;
- padding : 0px 5px;
- cursor : pointer;
- font-size : 0.6em;
- font-weight : 800;
- line-height : @height;
- text-transform : uppercase;
- border-right : 1px solid black;
- i{
- vertical-align : middle;
- margin-right : 3px;
- font-size : 1.2em;
- }
- &:hover, &.selected{
- background-color : #999;
- }
- .text{
- line-height : @height;
- .groupName{
- font-size : 10px;
- }
- }
- &:hover{
- .dropdown{
- visibility : visible;
- }
- }
- .dropdown{
- position : absolute;
- top : 100%;
- visibility : hidden;
- z-index : 1000;
- margin-left : -5px;
- padding : 0px;
- background-color : #ddd;
- .snippet{
- .animate(background-color);
- padding : 5px;
- cursor : pointer;
- font-size : 10px;
- i{
- margin-right : 8px;
- font-size : 13px;
- }
- &:hover{
- background-color : #999;
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/classfeature.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/classfeature.gen.js
deleted file mode 100644
index 2ca3abc9c..000000000
--- a/shared/homebrewery/brewEditor/snippetbar/snippets/classfeature.gen.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var _ = require('lodash');
-
-module.exports = function(classname){
-
- classname = classname || _.sample(['archivist', 'fancyman', 'linguist', 'fletcher',
- 'notary', 'berserker-typist', 'fishmongerer', 'manicurist', 'haberdasher', 'concierge'])
-
- classname = classname.toLowerCase();
-
- var hitDie = _.sample([4, 6, 8, 10, 12]);
-
- var abilityList = ["Strength", "Dexerity", "Constitution", "Wisdom", "Charisma", "Intelligence"];
- var skillList = ["Acrobatics ", "Animal Handling", "Arcana", "Athletics", "Deception", "History", "Insight", "Intimidation", "Investigation", "Medicine", "Nature", "Perception", "Performance", "Persuasion", "Religion", "Sleight of Hand", "Stealth", "Survival"];
-
-
- return [
- "## Class Features",
- "As a " + classname + ", you gain the following class features",
- "#### Hit Points",
- "___",
- "- **Hit Dice:** 1d" + hitDie + " per " + classname + " level",
- "- **Hit Points at 1st Level:** " + hitDie + " + your Constitution modifier",
- "- **Hit Points at Higher Levels:** 1d" + hitDie + " (or " + (hitDie/2 + 1) + ") + your Constitution modifier per " + classname + " level after 1st",
- "",
- "#### Proficiencies",
- "___",
- "- **Armor:** " + (_.sampleSize(["Light armor", "Medium armor", "Heavy armor", "Shields"], _.random(0,3)).join(', ') || "None"),
- "- **Weapons:** " + (_.sampleSize(["Squeegee", "Rubber Chicken", "Simple weapons", "Martial weapons"], _.random(0,2)).join(', ') || "None"),
- "- **Tools:** " + (_.sampleSize(["Artian's tools", "one musical instrument", "Thieve's tools"], _.random(0,2)).join(', ') || "None"),
- "",
- "___",
- "- **Saving Throws:** " + (_.sampleSize(abilityList, 2).join(', ')),
- "- **Skills:** Choose two from " + (_.sampleSize(skillList, _.random(4, 6)).join(', ')),
- "",
- "#### Equipment",
- "You start with the following equipment, in addition to the equipment granted by your background:",
- "- *(a)* a martial weapon and a shield or *(b)* two martial weapons",
- "- *(a)* five javelins or *(b)* any simple melee weapon",
- "- " + (_.sample(["10 lint fluffs", "1 button", "a cherished lost sock"])),
- "\n\n\n"
- ].join('\n');
-}
diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/classtable.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/classtable.gen.js
deleted file mode 100644
index 649d85b02..000000000
--- a/shared/homebrewery/brewEditor/snippetbar/snippets/classtable.gen.js
+++ /dev/null
@@ -1,114 +0,0 @@
-var _ = require('lodash');
-
-var features = [
- "Astrological Botany",
- "Astrological Chemistry",
- "Biochemical Sorcery",
- "Civil Alchemy",
- "Consecrated Biochemistry",
- "Demonic Anthropology",
- "Divinatory Mineralogy",
- "Genetic Banishing",
- "Hermetic Geography",
- "Immunological Incantations",
- "Nuclear Illusionism",
- "Ritual Astronomy",
- "Seismological Divination",
- "Spiritual Biochemistry",
- "Statistical Occultism",
- "Police Necromancer",
- "Sixgun Poisoner",
- "Pharmaceutical Gunslinger",
- "Infernal Banker",
- "Spell Analyst",
- "Gunslinger Corruptor",
- "Torque Interfacer",
- "Exo Interfacer",
- "Gunpowder Torturer",
- "Orbital Gravedigger",
- "Phased Linguist",
- "Mathematical Pharmacist",
- "Plasma Outlaw",
- "Malefic Chemist",
- "Police Cultist"
-];
-
-var classnames = ['Archivist', 'Fancyman', 'Linguist', 'Fletcher',
- 'Notary', 'Berserker-Typist', 'Fishmongerer', 'Manicurist', 'Haberdasher', 'Concierge'];
-
-var levels = ["1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", "10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th", "20th"]
-
-var profBonus = [2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6];
-
-var getFeature = (level)=>{
- var res = []
- if(_.includes([4,6,8,12,14,16,19], level+1)){
- res = ["Ability Score Improvement"]
- }
- res = _.union(res, _.sampleSize(features, _.sample([0,1,1,1,1,1])));
- if(!res.length) return "─";
- return res.join(', ');
-}
-
-module.exports = {
- full : function(){
- var classname = _.sample(classnames)
-
- var maxes = [4,3,3,3,3,2,2,1,1]
- var drawSlots = function(Slots){
- var slots = Number(Slots);
- return _.times(9, function(i){
- var max = maxes[i];
- if(slots < 1) return "—";
- var res = _.min([max, slots]);
- slots -= res;
- return res;
- }).join(' | ')
- }
-
-
- var cantrips = 3;
- var spells = 1;
- var slots = 2;
- return "
\n##### The " + classname + "\n" +
- "| Level | Proficiency Bonus | Features | Cantrips Known | Spells Known | 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th |\n"+
- "|:---:|:---:|:---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n" +
- _.map(levels, function(levelName, level){
- var res = [
- levelName,
- "+" + profBonus[level],
- getFeature(level),
- cantrips,
- spells,
- drawSlots(slots)
- ].join(' | ');
-
- cantrips += _.random(0,1);
- spells += _.random(0,1);
- slots += _.random(0,2);
-
- return "| " + res + " |";
- }).join('\n') +'\n
\n\n';
- },
-
- half : function(){
- var classname = _.sample(classnames)
-
- var featureScore = 1
- return "
\n##### The " + classname + "\n" +
- "| Level | Proficiency Bonus | Features | " + _.sample(features) + "|\n" +
- "|:---:|:---:|:---|:---:|\n" +
- _.map(levels, function(levelName, level){
- var res = [
- levelName,
- "+" + profBonus[level],
- getFeature(level),
- "+" + featureScore
- ].join(' | ');
-
- featureScore += _.random(0,1);
-
- return "| " + res + " |";
- }).join('\n') +'\n
\n\n';
- }
-};
\ No newline at end of file
diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/coverpage.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/coverpage.gen.js
deleted file mode 100644
index d4b69d637..000000000
--- a/shared/homebrewery/brewEditor/snippetbar/snippets/coverpage.gen.js
+++ /dev/null
@@ -1,117 +0,0 @@
-var _ = require('lodash');
-
-var titles = [
- "The Burning Gallows",
- "The Ring of Nenlast",
- "Below the Blind Tavern",
- "Below the Hungering River",
- "Before Bahamut's Land",
- "The Cruel Grave from Within",
- "The Strength of Trade Road",
- "Through The Raven Queen's Worlds",
- "Within the Settlement",
- "The Crown from Within",
- "The Merchant Within the Battlefield",
- "Ioun's Fading Traveler",
- "The Legion Ingredient",
- "The Explorer Lure",
- "Before the Charming Badlands",
- "The Living Dead Above the Fearful Cage",
- "Vecna's Hidden Sage",
- "Bahamut's Demonspawn",
- "Across Gruumsh's Elemental Chaos",
- "The Blade of Orcus",
- "Beyond Revenge",
- "Brain of Insanity",
- "Breed Battle!, A New Beginning",
- "Evil Lake, A New Beginning",
- "Invasion of the Gigantic Cat, Part II",
- "Kraken War 2020",
- "The Body Whisperers",
- "The Diabolical Tales of the Ape-Women",
- "The Doctor Immortal",
- "The Doctor from Heaven",
- "The Graveyard",
- "Azure Core",
- "Core Battle",
- "Core of Heaven: The Guardian of Amazement",
- "Deadly Amazement III",
- "Dry Chaos IX",
- "Gate Thunder",
- "Guardian: Skies of the Dark Wizard",
- "Lute of Eternity",
- "Mercury's Planet: Brave Evolution",
- "Ruby of Atlantis: The Quake of Peace",
- "Sky of Zelda: The Thunder of Force",
- "Vyse's Skies",
- "White Greatness III",
- "Yellow Divinity",
- "Zidane's Ghost"
-];
-
-var subtitles = [
- "In an ominous universe, a botanist opposes terrorism.",
- "In a demon-haunted city, in an age of lies and hate, a physicist tries to find an ancient treasure and battles a mob of aliens.",
- "In a land of corruption, two cyberneticists and a dungeon delver search for freedom.",
- "In an evil empire of horror, two rangers battle the forces of hell.",
- "In a lost city, in an age of sorcery, a librarian quests for revenge.",
- "In a universe of illusions and danger, three time travellers and an adventurer search for justice.",
- "In a forgotten universe of barbarism, in an era of terror and mysticism, a virtual reality programmer and a spy try to find vengance and battle crime.",
- "In a universe of demons, in an era of insanity and ghosts, three bodyguards and a bodyguard try to find vengance.",
- "In a kingdom of corruption and battle, seven artificial intelligences try to save the last living fertile woman.",
- "In a universe of virutal reality and agony, in an age of ghosts and ghosts, a fortune-teller and a wanderer try to avert the apocalypse.",
- "In a crime-infested kingdom, three martial artists quest for the truth and oppose evil.",
- "In a terrifying universe of lost souls, in an era of lost souls, eight dancers fight evil.",
- "In a galaxy of confusion and insanity, three martial artists and a duke battle a mob of psychics.",
- "In an amazing kingdom, a wizard and a secretary hope to prevent the destruction of mankind.",
- "In a kingdom of deception, a reporter searches for fame.",
- "In a hellish empire, a swordswoman and a duke try to find the ultimate weapon and battle a conspiracy.",
- "In an evil galaxy of illusion, in a time of technology and misery, seven psychiatrists battle crime.",
- "In a dark city of confusion, three swordswomen and a singer battle lawlessness.",
- "In an ominous empire, in an age of hate, two philosophers and a student try to find justice and battle a mob of mages intent on stealing the souls of the innocent.",
- "In a kingdom of panic, six adventurers oppose lawlessness.",
- "In a land of dreams and hopelessness, three hackers and a cyborg search for justice.",
- "On a planet of mysticism, three travelers and a fire fighter quest for the ultimate weapon and oppose evil.",
- "In a wicked universe, five seers fight lawlessness.",
- "In a kingdom of death, in an era of illusion and blood, four colonists search for fame.",
- "In an amazing kingdom, in an age of sorcery and lost souls, eight space pirates quest for freedom.",
- "In a cursed empire, five inventors oppose terrorism.",
- "On a crime-ridden planet of conspiracy, a watchman and an artificial intelligence try to find love and oppose lawlessness.",
- "In a forgotten land, a reporter and a spy try to stop the apocalypse.",
- "In a forbidden land of prophecy, a scientist and an archivist oppose a cabal of barbarians intent on stealing the souls of the innocent.",
- "On an infernal world of illusion, a grave robber and a watchman try to find revenge and combat a syndicate of mages intent on stealing the source of all magic.",
- "In a galaxy of dark magic, four fighters seek freedom.",
- "In an empire of deception, six tomb-robbers quest for the ultimate weapon and combat an army of raiders.",
- "In a kingdom of corruption and lost souls, in an age of panic, eight planetologists oppose evil.",
- "In a galaxy of misery and hopelessness, in a time of agony and pain, five planetologists search for vengance.",
- "In a universe of technology and insanity, in a time of sorcery, a computer techician quests for hope.",
- "On a planet of dark magic and barbarism, in an age of horror and blasphemy, seven librarians search for fame.",
- "In an empire of dark magic, in a time of blood and illusions, four monks try to find the ultimate weapon and combat terrorism.",
- "In a forgotten empire of dark magic, six kings try to prevent the destruction of mankind.",
- "In a galaxy of dark magic and horror, in an age of hopelessness, four marines and an outlaw combat evil.",
- "In a mysterious city of illusion, in an age of computerization, a witch-hunter tries to find the ultimate weapon and opposes an evil corporation.",
- "In a damned kingdom of technology, a virtual reality programmer and a fighter seek fame.",
- "In a hellish kingdom, in an age of blasphemy and blasphemy, an astrologer searches for fame.",
- "In a damned world of devils, an alien and a ranger quest for love and oppose a syndicate of demons.",
- "In a cursed galaxy, in a time of pain, seven librarians hope to avert the apocalypse.",
- "In a crime-infested galaxy, in an era of hopelessness and panic, three champions and a grave robber try to solve the ultimate crime."
-];
-
-
-module.exports = () => {
- return `
-
-
-
-# ${_.sample(titles)}
-
-
-
-##### ${_.sample(subtitles)}
-
-
-\\page`
-}
\ No newline at end of file
diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/fullclass.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/fullclass.gen.js
deleted file mode 100644
index 9a2da2069..000000000
--- a/shared/homebrewery/brewEditor/snippetbar/snippets/fullclass.gen.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var _ = require('lodash');
-
-var ClassFeatureGen = require('./classfeature.gen.js');
-
-var ClassTableGen = require('./classtable.gen.js');
-
-module.exports = function(){
-
- var classname = _.sample(['Archivist', 'Fancyman', 'Linguist', 'Fletcher',
- 'Notary', 'Berserker-Typist', 'Fishmongerer', 'Manicurist', 'Haberdasher', 'Concierge'])
-
-
- var image = _.sample(_.map([
- "http://orig01.deviantart.net/4682/f/2007/099/f/c/bard_stick_figure_by_wrpigeek.png",
- "http://img07.deviantart.net/a3c9/i/2007/099/3/a/archer_stick_figure_by_wrpigeek.png",
- "http://pre04.deviantart.net/d596/th/pre/f/2007/099/5/2/adventurer_stick_figure_by_wrpigeek.png",
- "http://img13.deviantart.net/d501/i/2007/099/d/4/black_mage_stick_figure_by_wrpigeek.png",
- "http://img09.deviantart.net/5cf3/i/2007/099/d/d/dark_knight_stick_figure_by_wrpigeek.png",
- "http://pre01.deviantart.net/7a34/th/pre/f/2007/099/6/3/monk_stick_figure_by_wrpigeek.png",
- "http://img11.deviantart.net/5dcc/i/2007/099/d/1/mystic_knight_stick_figure_by_wrpigeek.png",
- "http://pre08.deviantart.net/ad45/th/pre/f/2007/099/a/0/thief_stick_figure_by_wrpigeek.png",
- ], function(url){
- return "

"
- }))
-
-
- return [
- image,
- "",
- "```",
- "```",
- "
\n\n",
- "## " + classname,
- "Cool intro stuff will go here",
-
- "\\page",
- ClassTableGen(classname),
- ClassFeatureGen(classname),
-
-
-
- ].join('\n') + '\n\n\n';
-};
\ No newline at end of file
diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/magic.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/magic.gen.js
deleted file mode 100644
index 82469cd18..000000000
--- a/shared/homebrewery/brewEditor/snippetbar/snippets/magic.gen.js
+++ /dev/null
@@ -1,91 +0,0 @@
-var _ = require('lodash');
-
-var spellNames = [
- "Astral Rite of Acne",
- "Create Acne",
- "Cursed Ramen Erruption",
- "Dark Chant of the Dentists",
- "Erruption of Immaturity",
- "Flaming Disc of Inconvenience",
- "Heal Bad Hygene",
- "Heavenly Transfiguration of the Cream Devil",
- "Hellish Cage of Mucus",
- "Irritate Peanut Butter Fairy",
- "Luminous Erruption of Tea",
- "Mystic Spell of the Poser",
- "Sorcerous Enchantment of the Chimneysweep",
- "Steak Sauce Ray",
- "Talk to Groupie",
- "Astonishing Chant of Chocolate",
- "Astounding Pasta Puddle",
- "Ball of Annoyance",
- "Cage of Yarn",
- "Control Noodles Elemental",
- "Create Nervousness",
- "Cure Baldness",
- "Cursed Ritual of Bad Hair",
- "Dispell Piles in Dentist",
- "Eliminate Florists",
- "Illusionary Transfiguration of the Babysitter",
- "Necromantic Armor of Salad Dressing",
- "Occult Transfiguration of Foot Fetish",
- "Protection from Mucus Giant",
- "Tinsel Blast",
- "Alchemical Evocation of the Goths",
- "Call Fangirl",
- "Divine Spell of Crossdressing",
- "Dominate Ramen Giant",
- "Eliminate Vindictiveness in Gym Teacher",
- "Extra-Planar Spell of Irritation",
- "Induce Whining in Babysitter",
- "Invoke Complaining",
- "Magical Enchantment of Arrogance",
- "Occult Globe of Salad Dressing",
- "Overwhelming Enchantment of the Chocolate Fairy",
- "Sorcerous Dandruff Globe",
- "Spiritual Invocation of the Costumers",
- "Ultimate Rite of the Confetti Angel",
- "Ultimate Ritual of Mouthwash",
-];
-
-module.exports = {
-
- spellList : function(){
- var levels = ['Cantrips (0 Level)', '2nd Level', '3rd Level', '4th Level', '5th Level', '6th Level', '7th Level', '8th Level', '9th Level'];
-
- var content = _.map(levels, (level)=>{
- var spells = _.map(_.sampleSize(spellNames, _.random(5, 15)), (spell)=>{
- return `- ${spell}`;
- }).join('\n');
- return `##### ${level} \n${spells} \n`;
- }).join('\n');
-
- return `
\n${content}\n
`;
- },
-
- spell : function(){
- var level = ["1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th"];
- var spellSchools = ["abjuration", "conjuration", "divination", "enchantment", "evocation", "illusion", "necromancy", "transmutation"];
-
-
- var components = _.sampleSize(["V", "S", "M"], _.random(1,3)).join(', ');
- if(components.indexOf("M") !== -1){
- components += " (" + _.sampleSize(['a small doll', 'a crushed button worth at least 1cp', 'discarded gum wrapper'], _.random(1,3)).join(', ') + ")"
- }
-
- return [
- "#### " + _.sample(spellNames),
- "*" + _.sample(level) + "-level " + _.sample(spellSchools) + "*",
- "___",
- "- **Casting Time:** 1 action",
- "- **Range:** " + _.sample(["Self", "Touch", "30 feet", "60 feet"]),
- "- **Components:** " + components,
- "- **Duration:** " + _.sample(["Until dispelled", "1 round", "Instantaneous", "Concentration, up to 10 minutes", "1 hour"]),
- "",
- "A flame, equivalent in brightness to a torch, springs from from an object that you touch. ",
- "The effect look like a regular flame, but it creates no heat and doesn't use oxygen. ",
- "A *continual flame* can be covered or hidden but not smothered or quenched.",
- "\n\n\n"
- ].join('\n');
- }
-}
\ No newline at end of file
diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/monsterblock.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/monsterblock.gen.js
deleted file mode 100644
index abbcd6c6e..000000000
--- a/shared/homebrewery/brewEditor/snippetbar/snippets/monsterblock.gen.js
+++ /dev/null
@@ -1,196 +0,0 @@
-var _ = require('lodash');
-
-var genList = function(list, max){
- return _.sampleSize(list, _.random(0,max)).join(', ') || "None";
-}
-
-var getMonsterName = function(){
- return _.sample([
- "All-devouring Baseball Imp",
- "All-devouring Gumdrop Wraith",
- "Chocolate Hydra",
- "Devouring Peacock",
- "Economy-sized Colossus of the Lemonade Stand",
- "Ghost Pigeon",
- "Gibbering Duck",
- "Sparklemuffin Peacock Spider",
- "Gum Elemental",
- "Illiterate Construct of the Candy Store",
- "Ineffable Chihuahua",
- "Irritating Death Hamster",
- "Irritating Gold Mouse",
- "Juggernaut Snail",
- "Juggernaut of the Sock Drawer",
- "Koala of the Cosmos",
- "Mad Koala of the West",
- "Milk Djinni of the Lemonade Stand",
- "Mind Ferret",
- "Mystic Salt Spider",
- "Necrotic Halitosis Angel",
- "Pinstriped Famine Sheep",
- "Ritalin Leech",
- "Shocker Kangaroo",
- "Stellar Tennis Juggernaut",
- "Wailing Quail of the Sun",
- "Angel Pigeon",
- "Anime Sphinx",
- "Bored Avalanche Sheep of the Wasteland",
- "Devouring Nougat Sphinx of the Sock Drawer",
- "Djinni of the Footlocker",
- "Ectoplasmic Jazz Devil",
- "Flatuent Angel",
- "Gelatinous Duck of the Dream-Lands",
- "Gelatinous Mouse",
- "Golem of the Footlocker",
- "Lich Wombat",
- "Mechanical Sloth of the Past",
- "Milkshake Succubus",
- "Puffy Bone Peacock of the East",
- "Rainbow Manatee",
- "Rune Parrot",
- "Sand Cow",
- "Sinister Vanilla Dragon",
- "Snail of the North",
- "Spider of the Sewer",
- "Stellar Sawdust Leech",
- "Storm Anteater of Hell",
- "Stupid Spirit of the Brewery",
- "Time Kangaroo",
- "Tomb Poodle",
- ]);
-}
-
-var getType = function(){
- return _.sample(['Tiny', 'Small', 'Medium', 'Large', 'Gargantuan', 'Stupidly vast']) + " " + _.sample(['beast', 'fiend', 'annoyance', 'guy', 'cutie'])
-}
-
-var getAlignment = function(){
- return _.sample([
- "annoying evil",
- "chaotic gossipy",
- "chaotic sloppy",
- "depressed neutral",
- "lawful bogus",
- "lawful coy",
- "manic-depressive evil",
- "narrow-minded neutral",
- "neutral annoying",
- "neutral ignorant",
- "oedpipal neutral",
- "silly neutral",
- "unoriginal neutral",
- "weird neutral",
- "wordy evil",
- "unaligned"
- ]);
-};
-
-var getStats = function(){
- return '>|' + _.times(6, function(){
- var num = _.random(1,20);
- var mod = Math.ceil(num/2 - 5)
- return num + " (" + (mod >= 0 ? '+'+mod : mod ) + ")"
- }).join('|') + '|';
-}
-
-var genAbilities = function(){
- return _.sample([
- "> ***Pack Tactics.*** These guys work together. Like super well, you don't even know.",
- "> ***False Appearance. *** While the armor reamin motionless, it is indistinguishable from a normal suit of armor.",
- ]);
-}
-
-var genAction = function(){
- var name = _.sample([
- "Abdominal Drop",
- "Airplane Hammer",
- "Atomic Death Throw",
- "Bulldog Rake",
- "Corkscrew Strike",
- "Crossed Splash",
- "Crossface Suplex",
- "DDT Powerbomb",
- "Dual Cobra Wristlock",
- "Dual Throw",
- "Elbow Hold",
- "Gory Body Sweep",
- "Heel Jawbreaker",
- "Jumping Driver",
- "Open Chin Choke",
- "Scorpion Flurry",
- "Somersault Stump Fists",
- "Suffering Wringer",
- "Super Hip Submission",
- "Super Spin",
- "Team Elbow",
- "Team Foot",
- "Tilt-a-whirl Chin Sleeper",
- "Tilt-a-whirl Eye Takedown",
- "Turnbuckle Roll"
- ])
-
- return "> ***" + name + ".*** *Melee Weapon Attack:* +4 to hit, reach 5ft., one target. *Hit* 5 (1d6 + 2) ";
-}
-
-
-module.exports = {
-
- full : function(){
- return [
- "___",
- "___",
- "> ## " + getMonsterName(),
- ">*" + getType() + ", " + getAlignment() + "*",
- "> ___",
- "> - **Armor Class** " + _.random(10,20),
- "> - **Hit Points** " + _.random(1, 150) + "(1d4 + 5)",
- "> - **Speed** " + _.random(0,50) + "ft.",
- ">___",
- ">|STR|DEX|CON|INT|WIS|CHA|",
- ">|:---:|:---:|:---:|:---:|:---:|:---:|",
- getStats(),
- ">___",
- "> - **Condition Immunities** " + genList(["groggy", "swagged", "weak-kneed", "buzzed", "groovy", "melancholy", "drunk"], 3),
- "> - **Senses** passive Perception " + _.random(3, 20),
- "> - **Languages** " + genList(["Common", "Pottymouth", "Gibberish", "Latin", "Jive"], 2),
- "> - **Challenge** " + _.random(0, 15) + " (" + _.random(10,10000)+ " XP)",
- "> ___",
- _.times(_.random(3,6), function(){
- return genAbilities()
- }).join('\n>\n'),
- "> ### Actions",
- _.times(_.random(4,6), function(){
- return genAction()
- }).join('\n>\n'),
- ].join('\n') + '\n\n\n';
- },
-
- half : function(){
- return [
- "___",
- "> ## " + getMonsterName(),
- ">*" + getType() + ", " + getAlignment() + "*",
- "> ___",
- "> - **Armor Class** " + _.random(10,20),
- "> - **Hit Points** " + _.random(1, 150) + "(1d4 + 5)",
- "> - **Speed** " + _.random(0,50) + "ft.",
- ">___",
- ">|STR|DEX|CON|INT|WIS|CHA|",
- ">|:---:|:---:|:---:|:---:|:---:|:---:|",
- getStats(),
- ">___",
- "> - **Condition Immunities** " + genList(["groggy", "swagged", "weak-kneed", "buzzed", "groovy", "melancholy", "drunk"], 3),
- "> - **Senses** passive Perception " + _.random(3, 20),
- "> - **Languages** " + genList(["Common", "Pottymouth", "Gibberish", "Latin", "Jive"], 2),
- "> - **Challenge** " + _.random(0, 15) + " (" + _.random(10,10000)+ " XP)",
- "> ___",
- _.times(_.random(0,2), function(){
- return genAbilities()
- }).join('\n>\n'),
- "> ### Actions",
- _.times(_.random(1,2), function(){
- return genAction()
- }).join('\n>\n'),
- ].join('\n') + '\n\n\n';
- }
-}
diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/snippets.js b/shared/homebrewery/brewEditor/snippetbar/snippets/snippets.js
deleted file mode 100644
index bcb1df96f..000000000
--- a/shared/homebrewery/brewEditor/snippetbar/snippets/snippets.js
+++ /dev/null
@@ -1,267 +0,0 @@
-var MagicGen = require('./magic.gen.js');
-var ClassTableGen = require('./classtable.gen.js');
-var MonsterBlockGen = require('./monsterblock.gen.js');
-var ClassFeatureGen = require('./classfeature.gen.js');
-var FullClassGen = require('./fullclass.gen.js');
-var CoverPageGen = require('./coverpage.gen.js');
-var TableOfContentsGen = require('./tableOfContents.gen.js');
-
-
-module.exports = [
-
- {
- groupName : 'Editor',
- icon : 'fa-pencil',
- snippets : [
- {
- name : "Column Break",
- icon : 'fa-columns',
- gen : "```\n```\n\n"
- },
- {
- name : "New Page",
- icon : 'fa-file-text',
- gen : "\\page\n\n"
- },
- {
- name : "Vertical Spacing",
- icon : 'fa-arrows-v',
- gen : "
\n\n"
- },
- {
- name : "Wide Block",
- icon : 'fa-arrows-h',
- gen : "
\nEverything in here will be extra wide. Tables, text, everything! Beware though, CSS columns can behave a bit weird sometimes.\n
\n"
- },
- {
- name : "Image",
- icon : 'fa-image',
- gen : [
- "

",
- "Credit: Kyounghwan Kim"
- ].join('\n')
- },
- {
- name : "Background Image",
- icon : 'fa-tree',
- gen : [
- "

"
- ].join('\n')
- },
-
- {
- name : "Page Number",
- icon : 'fa-bookmark',
- gen : "
1
\n\n\n"
- },
-
- {
- name : "Auto-incrementing Page Number",
- icon : 'fa-sort-numeric-asc',
- gen : "
\n"
- },
-
- {
- name : "Link to page",
- icon : 'fa-link',
- gen : "[Click here](#p3) to go to page 3\n"
- },
-
- {
- name : "Table of Contents",
- icon : 'fa-book',
- gen : TableOfContentsGen
- },
-
-
- ]
- },
-
-
- /************************* PHB ********************/
-
- {
- groupName : 'PHB',
- icon : 'fa-book',
- snippets : [
- {
- name : 'Spell',
- icon : 'fa-magic',
- gen : MagicGen.spell,
- },
- {
- name : 'Spell List',
- icon : 'fa-list',
- gen : MagicGen.spellList,
- },
- {
- name : 'Class Feature',
- icon : 'fa-trophy',
- gen : ClassFeatureGen,
- },
- {
- name : 'Note',
- icon : 'fa-sticky-note',
- gen : function(){
- return [
- "> ##### Time to Drop Knowledge",
- "> Use notes to point out some interesting information. ",
- "> ",
- "> **Tables and lists** both work within a note."
- ].join('\n');
- },
- },
- {
- name : 'Descriptive Text Box',
- icon : 'fa-sticky-note-o',
- gen : function(){
- return [
- "
",
- "##### Time to Drop Knowledge",
- "Use notes to point out some interesting information. ",
- "",
- "**Tables and lists** both work within a note.",
- "
"
- ].join('\n');
- },
- },
- {
- name : 'Monster Stat Block',
- icon : 'fa-bug',
- gen : MonsterBlockGen.half,
- },
- {
- name : 'Wide Monster Stat Block',
- icon : 'fa-paw',
- gen : MonsterBlockGen.full,
- },
- {
- name : 'Cover Page',
- icon : 'fa-file-word-o',
- gen : CoverPageGen,
- },
- ]
- },
-
-
-
- /********************* TABLES *********************/
-
- {
- groupName : 'Tables',
- icon : 'fa-table',
- snippets : [
- {
- name : "Class Table",
- icon : 'fa-table',
- gen : ClassTableGen.full,
- },
- {
- name : "Half Class Table",
- icon : 'fa-list-alt',
- gen : ClassTableGen.half,
- },
- {
- name : 'Table',
- icon : 'fa-th-list',
- gen : function(){
- return [
- "##### Cookie Tastiness",
- "| Tastiness | Cookie Type |",
- "|:----:|:-------------|",
- "| -5 | Raisin |",
- "| 8th | Chocolate Chip |",
- "| 11th | 2 or lower |",
- "| 14th | 3 or lower |",
- "| 17th | 4 or lower |\n\n",
- ].join('\n');
- },
- },
- {
- name : 'Wide Table',
- icon : 'fa-list',
- gen : function(){
- return [
- "
",
- "##### Cookie Tastiness",
- "| Tastiness | Cookie Type |",
- "|:----:|:-------------|",
- "| -5 | Raisin |",
- "| 8th | Chocolate Chip |",
- "| 11th | 2 or lower |",
- "| 14th | 3 or lower |",
- "| 17th | 4 or lower |",
- "
\n\n"
- ].join('\n');
- },
- },
- {
- name : 'Split Table',
- icon : 'fa-th-large',
- gen : function(){
- return [
- "
",
- "| d10 | Damage Type |",
- "|:---:|:------------|",
- "| 1 | Acid |",
- "| 2 | Cold |",
- "| 3 | Fire |",
- "| 4 | Force |",
- "| 5 | Lightning |",
- "",
- "```",
- "```",
- "",
- "| d10 | Damage Type |",
- "|:---:|:------------|",
- "| 6 | Necrotic |",
- "| 7 | Poison |",
- "| 8 | Psychic |",
- "| 9 | Radiant |",
- "| 10 | Thunder |",
- "
\n\n",
- ].join('\n');
- },
- }
- ]
- },
-
-
-
-
- /**************** PRINT *************/
-
- {
- groupName : 'Print',
- icon : 'fa-print',
- snippets : [
- {
- name : "A4 PageSize",
- icon : 'fa-file-o',
- gen : [''
- ].join('\n')
- },
- {
- name : "Ink Friendly",
- icon : 'fa-tint',
- gen : ['',
- ''
- ].join('\n')
- },
- ]
- },
-
-]
diff --git a/shared/homebrewery/brewEditor/snippetbar/snippets/tableOfContents.gen.js b/shared/homebrewery/brewEditor/snippetbar/snippets/tableOfContents.gen.js
deleted file mode 100644
index 448b2f4e1..000000000
--- a/shared/homebrewery/brewEditor/snippetbar/snippets/tableOfContents.gen.js
+++ /dev/null
@@ -1,72 +0,0 @@
-const _ = require('lodash');
-
-const getTOC = (pages) => {
- const add1 = (title, page)=>{
- res.push({
- title : title,
- page : page + 1,
- children : []
- });
- }
- const add2 = (title, page)=>{
- if(!_.last(res)) add1('', page);
- _.last(res).children.push({
- title : title,
- page : page + 1,
- children : []
- });
- }
- const add3 = (title, page)=>{
- if(!_.last(res)) add1('', page);
- if(!_.last(_.last(res).children)) add2('', page);
- _.last(_.last(res).children).children.push({
- title : title,
- page : page + 1,
- children : []
- });
- }
-
- let res = [];
- _.each(pages, (page, pageNum)=>{
- const lines = page.split('\n');
- _.each(lines, (line) => {
- if(_.startsWith(line, '# ')){
- const title = line.replace('# ', '');
- add1(title, pageNum)
- }
- if(_.startsWith(line, '## ')){
- const title = line.replace('## ', '');
- add2(title, pageNum);
- }
- if(_.startsWith(line, '### ')){
- const title = line.replace('### ', '');
- add3(title, pageNum);
- }
- })
- });
- return res;
-}
-
-module.exports = function(brew){
- const pages = brew.split('\\page');
- const TOC = getTOC(pages);
- const markdown = _.reduce(TOC, (r, g1, idx1)=>{
- r.push(`- **[${idx1 + 1} ${g1.title}](#p${g1.page})**`)
- if(g1.children.length){
- _.each(g1.children, (g2, idx2) => {
- r.push(` - [${idx1 + 1}.${idx2 + 1} ${g2.title}](#p${g2.page})`);
- if(g2.children.length){
- _.each(g2.children, (g3, idx3) => {
- r.push(` - [${idx1 + 1}.${idx2 + 1}.${idx3 + 1} ${g3.title}](#p${g3.page})`);
- });
- }
- });
- }
- return r;
- }, []).join('\n');
-
- return `
-##### Table Of Contents
-${markdown}
-
\n`;
-}
\ No newline at end of file
diff --git a/shared/homebrewery/snippets/brew/index.js b/shared/homebrewery/snippets/brew/index.js
index 85955ef93..dab63e4c6 100644
--- a/shared/homebrewery/snippets/brew/index.js
+++ b/shared/homebrewery/snippets/brew/index.js
@@ -1,13 +1,15 @@
const _ = require('lodash');
-const process = (imports)=>{
-
-};
-
-module.exports = {
- phb : _.keyBy([
- require('./spell.snippet.js')
- ], (spt)=>_.snakeCase(spt.name)),
+module.exports = _.merge(
+ require('./spell.snippet.js'),
+ require('./table.snippet.js')
-}
\ No newline at end of file
+ //wide
+ //colors
+ //brushed
+ //font
+ //alignment
+
+
+);
\ No newline at end of file
diff --git a/shared/homebrewery/snippets/brew/random.data.js b/shared/homebrewery/snippets/brew/random.data.js
index d4a405b0e..c194bd2eb 100644
--- a/shared/homebrewery/snippets/brew/random.data.js
+++ b/shared/homebrewery/snippets/brew/random.data.js
@@ -1,4 +1,9 @@
-module.exports = {
+const _ = require('lodash');
+
+const Data = {
+ rand : (name, max = 1, min = 1)=>{
+ return _.sampleSize(Data[name], _.random(min, max));
+ },
titles : [
`The Burning Gallows`,
@@ -309,4 +314,6 @@ module.exports = {
-}
\ No newline at end of file
+};
+
+module.exports = Data;
\ No newline at end of file
diff --git a/shared/homebrewery/snippets/brew/spell.snippet.js b/shared/homebrewery/snippets/brew/spell.snippet.js
index 2b96d7667..658dfc176 100644
--- a/shared/homebrewery/snippets/brew/spell.snippet.js
+++ b/shared/homebrewery/snippets/brew/spell.snippet.js
@@ -1,7 +1,4 @@
const _ = require('lodash');
-
-const spellNames = require('./spellname.list.js');
-
const Data = require('./random.data.js');
@@ -11,13 +8,11 @@ const schools = ['abjuration', 'conjuration', 'divination', 'enchantment', 'evoc
module.exports = {
- name : 'Spell',
- icon : 'fa-spell',
- gen : ()=>{
+ spell : ()=>{
let components = _.sampleSize(['V', 'S', 'M'], _.random(1,3)).join(', ');
if(components.indexOf('M') !== -1){
- components += ' (' + _.sampleSize(Data.gear, _.random(1,3)).join(', ') + ')'
+ components += ` (${Data.rand('gear',3).join(', ')})`
}
const duration = _.sample([
@@ -28,11 +23,11 @@ module.exports = {
'1 hour'
]);
- const description = _.sampleSize(Data.effects, _.random(1,2)).concat(_.sample(Data.effects2)).join(' ');
+ const description = Data.rand('effects', 2).concat(Data.rand('effects2')).join(' ');
return `{{spell
-#### ${_.sample(spellNames)}
+#### ${_.sample(Data.spellNames)}
*${_.sample(levels)}-level ${_.sample(schools)}*
- **Casting Time:** ${_.sample(['1 action', 'Reaction', '10 minutes', '1 hour'])}
- **Range:** ${_.sample(['Self', 'Touch', '30 feet', '60 feet'])}
diff --git a/shared/homebrewery/snippets/brew/spellname.list.js b/shared/homebrewery/snippets/brew/spellname.list.js
deleted file mode 100644
index f75ae6791..000000000
--- a/shared/homebrewery/snippets/brew/spellname.list.js
+++ /dev/null
@@ -1,47 +0,0 @@
-module.exports = [
- 'Astral Rite of Acne',
- 'Create Acne',
- 'Cursed Ramen Erruption',
- 'Dark Chant of the Dentists',
- 'Erruption of Immaturity',
- 'Flaming Disc of Inconvenience',
- 'Heal Bad Hygene',
- 'Heavenly Transfiguration of the Cream Devil',
- 'Hellish Cage of Mucus',
- 'Irritate Peanut Butter Fairy',
- 'Luminous Erruption of Tea',
- 'Mystic Spell of the Poser',
- 'Sorcerous Enchantment of the Chimneysweep',
- 'Steak Sauce Ray',
- 'Talk to Groupie',
- 'Astonishing Chant of Chocolate',
- 'Astounding Pasta Puddle',
- 'Ball of Annoyance',
- 'Cage of Yarn',
- 'Control Noodles Elemental',
- 'Create Nervousness',
- 'Cure Baldness',
- 'Cursed Ritual of Bad Hair',
- 'Dispell Piles in Dentist',
- 'Eliminate Florists',
- 'Illusionary Transfiguration of the Babysitter',
- 'Necromantic Armor of Salad Dressing',
- 'Occult Transfiguration of Foot Fetish',
- 'Protection from Mucus Giant',
- 'Tinsel Blast',
- 'Alchemical Evocation of the Goths',
- 'Call Fangirl',
- 'Divine Spell of Crossdressing',
- 'Dominate Ramen Giant',
- 'Eliminate Vindictiveness in Gym Teacher',
- 'Extra-Planar Spell of Irritation',
- 'Induce Whining in Babysitter',
- 'Invoke Complaining',
- 'Magical Enchantment of Arrogance',
- 'Occult Globe of Salad Dressing',
- 'Overwhelming Enchantment of the Chocolate Fairy',
- 'Sorcerous Dandruff Globe',
- 'Spiritual Invocation of the Costumers',
- 'Ultimate Rite of the Confetti Angel',
- 'Ultimate Ritual of Mouthwash',
-];
\ No newline at end of file
diff --git a/shared/homebrewery/snippets/brew/table.snippet.js b/shared/homebrewery/snippets/brew/table.snippet.js
index a500e5d2b..673d075a4 100644
--- a/shared/homebrewery/snippets/brew/table.snippet.js
+++ b/shared/homebrewery/snippets/brew/table.snippet.js
@@ -1,14 +1,62 @@
const _ = require('lodash');
+const Data = require('./random.data.js');
+
+
+
+/*
+- Roll
+- Level
+- Cost
- spell lists
-- roll charts
+- cost
+- Class
+*/
+
+
+const columns = {
+ roll : (rows)=>{
+ return _.concat([`d${rows}`, ':---:'], _.times(rows, (i)=>i+1));
+ },
+ level : (rows)=>{
+ return _.concat([`${_.sample(Data.classes)} Level`, ':---:'], _.times(rows, (i)=>`${i*2+3}th`));
+ },
+
+ spell : (rows)=>{
+ return _.concat(['Spells', ':---'], _.times(rows, (i)=>{
+ return `_${Data.rand('spellNames', 2).join(', ')}_`
+ }));
+ },
+ cost : (rows)=>{
+ return _.concat([`Cost`, '---:'], _.times(rows, (i)=>{
+ return _.sample(['1 gp', '10 gp', '5 cp', '10,000 gp', '200 sp', '1 pp', '2 gp']);
+ }));
+ },
+ gear : (rows)=>{
+ return _.concat([_.sample(['Equipment', 'Reward', 'Treasure']), ':---'], _.times(rows, (i)=>{
+ return Data.rand('gear');
+ }));
+ }
+}
module.exports = {
- name : 'Table',
- icon : 'fa-table',
- gen: ()=>{
+ table : () => {
+ const rows = _.sample([4,6,8,10]);
- },
+ const cols = [
+ columns.roll(rows),
+ columns.level(rows),
+ columns.gear(rows)
+ ];
+
+ return _.times(rows + 2, (i)=>{
+ if(i==1){
+ return '|' + _.map(cols, (col)=>col[i]).join('|') + '|';
+ }else{
+ return '| ' + _.map(cols, (col)=>col[i]).join(' | ') + ' |';
+ }
+ }).join('\n');
+ }
}
\ No newline at end of file
diff --git a/shared/homebrewery/snippets/style/a4.snippet.js b/shared/homebrewery/snippets/style/a4.snippet.js
new file mode 100644
index 000000000..bc62d33bd
--- /dev/null
+++ b/shared/homebrewery/snippets/style/a4.snippet.js
@@ -0,0 +1,8 @@
+module.exports = {
+ a4 : ()=>{
+ return `.phb{
+ width : 210mm;
+ height : 296.8mm;
+}`;
+ }
+}
\ No newline at end of file
diff --git a/shared/homebrewery/snippets/style/index.js b/shared/homebrewery/snippets/style/index.js
index e69de29bb..995e36d93 100644
--- a/shared/homebrewery/snippets/style/index.js
+++ b/shared/homebrewery/snippets/style/index.js
@@ -0,0 +1,6 @@
+const _ = require('lodash');
+
+module.exports = _.merge(
+ require('./ink.snippet.js'),
+ require('./a4.snippet.js')
+);
diff --git a/shared/homebrewery/snippets/style/ink.snippet.js b/shared/homebrewery/snippets/style/ink.snippet.js
new file mode 100644
index 000000000..ffd6d1e87
--- /dev/null
+++ b/shared/homebrewery/snippets/style/ink.snippet.js
@@ -0,0 +1,9 @@
+
+
+module.exports = {
+ inkFriendly : ()=>{
+ return `.phb{ background : white;}
+.phb img{ display : none;}
+.phb hr+blockquote{background : white;}`;
+ }
+}
\ No newline at end of file