File size: 5,702 Bytes
760ff9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
const _ = require('lodash');

const genList = function(list, max){
	return _.sampleSize(list, _.random(0, max)).join(', ') || 'None';
};

const 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',
	]);
};

const getType = function(){
	return `${_.sample(['Tiny', 'Small', 'Medium', 'Large', 'Gargantuan', 'Stupidly vast'])} ${_.sample(['beast', 'fiend', 'annoyance', 'guy', 'cutie'])}`;
};

const 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'
	]);
};

const getStats = function(){
	return `>|${_.times(6, function(){
		const num = _.random(1, 20);
		const mod = Math.ceil(num/2 - 5);
		return `${num} (${mod >= 0 ? `+${mod}` : mod})`;
	}).join('|')}|`;
};

const genAbilities = function(){
	return _.sample([
		'> ***Pack Tactics.*** These guys work together. Like super well, you don\'t even know.',
		'> ***Fowl Appearance.*** While the creature remains motionless, it is indistinguishable from a normal chicken.',
		'> ***Onion Stench.*** Any creatures within 5 feet of this thing develops an irrational craving for onion rings.',
		'> ***Enormous Nose.*** This creature gains advantage on any check involving putting things in its nose.',
		'> ***Sassiness.*** When questioned, this creature will talk back instead of answering.',
		'> ***Big Jerk.*** Thinks he is just *waaaay* better than you.',
	]);
};

const genAction = function(){
	const 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(2, 3), function(){
				return genAbilities();
			}).join('\n>\n'),
			'> ### Actions',
			_.times(_.random(1, 2), function(){
				return genAction();
			}).join('\n>\n'),
		].join('\n')}\n\n\n`;
	}
};