diff --git a/themes/V3/5eDMG/snippets/classfeature.gen.js b/themes/V3/5eDMG/snippets/classfeature.gen.js
deleted file mode 100644
index 7e2e7e858..000000000
--- a/themes/V3/5eDMG/snippets/classfeature.gen.js
+++ /dev/null
@@ -1,42 +0,0 @@
-const _ = require('lodash');
-const dedent = require('dedent-tabs').default;
-
-module.exports = function(classname){
-
- classname = _.sample(['archivist', 'fancyman', 'linguist', 'fletcher',
- 'notary', 'berserker-typist', 'fishmongerer', 'manicurist', 'haberdasher', 'concierge']);
-
- classname = classname.toLowerCase();
-
- const hitDie = _.sample([4, 6, 8, 10, 12]);
-
- const abilityList = ['Strength', 'Dexerity', 'Constitution', 'Wisdom', 'Charisma', 'Intelligence'];
- const skillList = ['Acrobatics', 'Animal Handling', 'Arcana', 'Athletics', 'Deception', 'History', 'Insight', 'Intimidation', 'Investigation', 'Medicine', 'Nature', 'Perception', 'Performance', 'Persuasion', 'Religion', 'Sleight of Hand', 'Stealth', 'Survival'];
-
-
- return dedent`
- ## 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'])}
-
- `;
-};
diff --git a/themes/V3/5eDMG/snippets/classtable.gen.js b/themes/V3/5eDMG/snippets/classtable.gen.js
deleted file mode 100644
index c1f6254f9..000000000
--- a/themes/V3/5eDMG/snippets/classtable.gen.js
+++ /dev/null
@@ -1,132 +0,0 @@
-const _ = require('lodash');
-
-const features = [
- 'Astrological Botany',
- 'Biochemical Sorcery',
- 'Civil Divination',
- 'Consecrated Augury',
- 'Demonic Anthropology',
- 'Divinatory Mineralogy',
- 'Exo Interfacer',
- 'Genetic Banishing',
- 'Gunpowder Torturer',
- 'Gunslinger Corruptor',
- 'Hermetic Geography',
- 'Immunological Cultist',
- 'Malefic Chemist',
- 'Mathematical Pharmacy',
- 'Nuclear Biochemistry',
- 'Orbital Gravedigger',
- 'Pharmaceutical Outlaw',
- 'Phased Linguist',
- 'Plasma Gunslinger',
- 'Police Necromancer',
- 'Ritual Astronomy',
- 'Sixgun Poisoner',
- 'Seismological Alchemy',
- 'Spiritual Illusionism',
- 'Statistical Occultism',
- 'Spell Analyst',
- 'Torque Interfacer'
-];
-
-const classnames = ['Ackerman', 'Berserker-Typist', 'Concierge', 'Fishmonger',
- 'Haberdasher', 'Manicurist', 'Netrunner', 'Weirkeeper'];
-
-const levels = ['1st', '2nd', '3rd', '4th', '5th',
- '6th', '7th', '8th', '9th', '10th',
- '11th', '12th', '13th', '14th', '15th',
- '16th', '17th', '18th', '19th', '20th'];
-
-const profBonus = [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6];
-
-const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1];
-
-const drawSlots = function(Slots, rows, padding){
- let slots = Number(Slots);
- return _.times(rows, function(i){
- const max = maxes[i];
- if(slots < 1) return _.pad('—', padding);
- const res = _.min([max, slots]);
- slots -= res;
- return _.pad(res.toString(), padding);
- }).join(' | ');
-};
-
-module.exports = {
- full : function(classes){
- const classname = _.sample(classnames);
-
-
- let cantrips = 3;
- let spells = 1;
- let slots = 2;
- return `{{${classes}\n##### The ${classname}\n` +
- `| Level | Proficiency | Features | Cantrips | Spells | --- Spell Slots Per Spell Level ---|||||||||\n`+
- `| ^| Bonus ^| ^| Known ^| Known ^|1st |2nd |3rd |4th |5th |6th |7th |8th |9th |\n`+
- `|:-----:|:-----------:|:-------------|:--------:|:------:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|\n${
- _.map(levels, function(levelName, level){
- const res = [
- _.pad(levelName, 5),
- _.pad(`+${profBonus[level]}`, 2),
- _.padEnd(_.sample(features), 21),
- _.pad(cantrips.toString(), 8),
- _.pad(spells.toString(), 6),
- drawSlots(slots, 9, 2),
- ].join(' | ');
-
- cantrips += _.random(0, 1);
- spells += _.random(0, 1);
- slots += _.random(0, 2);
-
- return `| ${res} |`;
- }).join('\n')}\n}}\n\n`;
- },
-
- half : function(classes){
- const classname = _.sample(classnames);
-
- let featureScore = 1;
- return `{{${classes}\n##### The ${classname}\n` +
- `| Level | Proficiency Bonus | Features | ${_.pad(_.sample(features), 21)} |\n` +
- `|:-----:|:-----------------:|:---------|:---------------------:|\n${
- _.map(levels, function(levelName, level){
- const res = [
- _.pad(levelName, 5),
- _.pad(`+${profBonus[level]}`, 2),
- _.padEnd(_.sample(features), 23),
- _.pad(`+${featureScore}`, 21),
- ].join(' | ');
-
- featureScore += _.random(0, 1);
-
- return `| ${res} |`;
- }).join('\n')}\n}}\n\n`;
- },
-
- third : function(classes){
- const classname = _.sample(classnames);
-
- let cantrips = 3;
- let spells = 1;
- let slots = 2;
- return `{{${classes}\n##### ${classname} Spellcasting\n` +
- `| Class | Cantrips | Spells |--- Spells Slots per Spell Level ---||||\n` +
- `| Level ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th |\n` +
- `|:------:|:--------:|:-------:|:-------:|:-------:|:-------:|:-------:|\n${
- _.map(levels, function(levelName, level){
- const res = [
- _.pad(levelName, 6),
- _.pad(cantrips.toString(), 8),
- _.pad(spells.toString(), 7),
- drawSlots(slots, 4, 7),
- ].join(' | ');
-
- cantrips += _.random(0, 1);
- spells += _.random(0, 1);
- slots += _.random(0, 1);
-
- return `| ${res} |`;
- }).join('\n')}\n}}\n\n`;
- }
-};
diff --git a/themes/V3/5eDMG/snippets/coverpage.gen.js b/themes/V3/5eDMG/snippets/coverpage.gen.js
deleted file mode 100644
index 0fb8ba7a4..000000000
--- a/themes/V3/5eDMG/snippets/coverpage.gen.js
+++ /dev/null
@@ -1,124 +0,0 @@
-const _ = require('lodash');
-
-const 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'
-];
-
-const 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 `
-
-{{margin-top:225px}}
-
-# ${_.sample(titles)}
-
-{{margin-top:25px}}
-
-{{wide
-##### ${_.sample(subtitles)}
-}}
-
-\\page`;
-};
\ No newline at end of file
diff --git a/themes/V3/5eDMG/snippets/fullclass.gen.js b/themes/V3/5eDMG/snippets/fullclass.gen.js
deleted file mode 100644
index 5ede9e501..000000000
--- a/themes/V3/5eDMG/snippets/fullclass.gen.js
+++ /dev/null
@@ -1,43 +0,0 @@
-const _ = require('lodash');
-
-const ClassFeatureGen = require('./classfeature.gen.js');
-
-const ClassTableGen = require('./classtable.gen.js');
-
-module.exports = function(){
-
- const classname = _.sample(['Archivist', 'Fancyman', 'Linguist', 'Fletcher',
- 'Notary', 'Berserker-Typist', 'Fishmongerer', 'Manicurist', 'Haberdasher', 'Concierge']);
-
-
- const 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,
- '',
- '```',
- '```',
- '