A character/one-shot generator for KOBOLDS IN SPACE!
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

adversaries.py 63KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354
  1. import random as r
  2. DRAGON_TYPES = ["Cat", "Fairy", "Sedan", "Brass", "Space", "Wolf", "Iron", "Spellcaster", "Green", "Red"]
  3. def rinterp(s1, l1, s2):
  4. def rfunc():
  5. return f"{s1}{r.choice(l1)}{s2}"
  6. return rfunc
  7. prob = [
  8. {
  9. 'id': 0, #integer
  10. 'name': rinterp("Baby ", DRAGON_TYPES, " Dragon"), # formatted string
  11. 'shortname': "dragon", # formatted string
  12. 'isPlural': False, # boolean
  13. 'hasMinion': False, # boolean
  14. 'potentialMinions': None, # None or list of IDs
  15. 'needsName': True, # boolean
  16. 'note': "It's very naive about its power level.", # formatted string
  17. 'stats': [2,3,3,3], # four-integer list
  18. },
  19. {
  20. 'id': 1, #integer
  21. 'name': f"Cat Dragon", # formatted string
  22. 'shortname': "dragon", # formatted string
  23. 'isPlural': False, # boolean
  24. 'hasMinion': False, # boolean
  25. 'potentialMinions': None, # None or list of IDs
  26. 'needsName': True, # boolean
  27. 'note': "It's covered in fur; its Hairball Breath may deal Brains damage instead of Body.", # formatted string
  28. 'stats': [1,4,3,4], # four-integer list
  29. },
  30. {
  31. 'id': 2, #integer
  32. 'name': f"Fairy Dragon", # formatted string
  33. 'shortname': "dragon", # formatted string
  34. 'isPlural': False, # boolean
  35. 'hasMinion': False, # boolean
  36. 'potentialMinions': None, # None or list of IDs
  37. 'needsName': True, # boolean
  38. 'note': "Its Glitter Breath makes targets super visible. It loves sweets.", # formatted string
  39. 'stats': [2,4,3,4], # four-integer list
  40. },
  41. {
  42. 'id': 3, #integer
  43. 'name': f"Sedan Dragon", # formatted string
  44. 'shortname': "dragon", # formatted string
  45. 'isPlural': False, # boolean
  46. 'hasMinion': False, # boolean
  47. 'potentialMinions': None, # None or list of IDs
  48. 'needsName': True, # boolean
  49. 'note': "It has four wings and Carbon Monoxide Breath. It may carry and use Gear.", # formatted string
  50. 'stats': [2,4,3,5], # four-integer list
  51. },
  52. {
  53. 'id': 4, #integer
  54. 'name': f"Brass Dragon", # formatted string
  55. 'shortname': "dragon", # formatted string
  56. 'isPlural': False, # boolean
  57. 'hasMinion': False, # boolean
  58. 'potentialMinions': None, # None or list of IDs
  59. 'needsName': True, # boolean
  60. 'note': "A being of Order, it mimics a steampunk theme.", # formatted string
  61. 'stats': [4,3,4,4], # four-integer list
  62. },
  63. {
  64. 'id': 5, #integer
  65. 'name': f"Space Dragon", # formatted string
  66. 'shortname': "dragon", # formatted string
  67. 'isPlural': False, # boolean
  68. 'hasMinion': False, # boolean
  69. 'potentialMinions': None, # None or list of IDs
  70. 'needsName': True, # boolean
  71. 'note': "It has Solar Wind Breath that pushes targets back.", # formatted string
  72. 'stats': [3,4,4,5], # four-integer list
  73. },
  74. {
  75. 'id': 6, #integer
  76. 'name': f"Wolf Dragons", # formatted string
  77. 'shortname': "dragons", # formatted string
  78. 'isPlural': True, # boolean
  79. 'hasMinion': False, # boolean
  80. 'potentialMinions': None, # None or list of IDs
  81. 'needsName': False, # boolean
  82. 'note': "They are covered in fur and attack in packs (the stats are for the pack).", # formatted string
  83. 'stats': [4,5,3,5], # four-integer list
  84. },
  85. {
  86. 'id': 7, #integer
  87. 'name': f"Iron Dragon", # formatted string
  88. 'shortname': "dragon", # formatted string
  89. 'isPlural': False, # boolean
  90. 'hasMinion': False, # boolean
  91. 'potentialMinions': None, # None or list of IDs
  92. 'needsName': True, # boolean
  93. 'note': "It's covered in actual iron and has Coal Dust Breath. It enjoys conquest and destruction for their own sake.", # formatted string
  94. 'stats': [3,5,5,5], # four-integer list
  95. },
  96. {
  97. 'id': 8, #integer
  98. 'name': rinterp("", DRAGON_TYPES, " Dragon Spellcaster"), # formatted string
  99. 'shortname': "dragon", # formatted string
  100. 'isPlural': False, # boolean
  101. 'hasMinion': False, # boolean
  102. 'potentialMinions': None, # None or list of IDs
  103. 'needsName': True, # boolean
  104. 'note': "It prefers to use spells rather than its physical attacks.", # formatted string
  105. 'stats': [4,5,6,4], # four-integer list
  106. },
  107. {
  108. 'id': 9, #integer
  109. 'name': f"Old Green, the Dragon", # formatted string
  110. 'shortname': "dragon", # formatted string
  111. 'isPlural': False, # boolean
  112. 'hasMinion': True, # boolean
  113. 'potentialMinions': [x for x in list(range(121)) if x != 9 and x != 10], # None or list of IDs
  114. 'needsName': False, # boolean
  115. 'note': "It will send its minion to attack first, and exhales a toxic, opaque gas to cover its escape if needed.", # formatted string
  116. 'stats': [5,3,6,6], # four-integer list
  117. },
  118. {
  119. 'id': 10, #integer
  120. 'name': f"Old Red, the Dragon", # formatted string
  121. 'shortname': "dragon", # formatted string
  122. 'isPlural': False, # boolean
  123. 'hasMinion': False, # boolean
  124. 'potentialMinions': None, # None or list of IDs
  125. 'needsName': False, # boolean
  126. 'note': "It's bigger than you expect, even when you're expecting it. It melts things with its Fire Breath for fun.", # formatted string
  127. 'stats': [3,5,6,6], # four-integer list
  128. },
  129. {
  130. 'id': 11, #integer
  131. 'name': f"Toxic Air", # formatted string
  132. 'shortname': "air", # formatted string
  133. 'isPlural': True, # boolean
  134. 'hasMinion': False, # boolean
  135. 'potentialMinions': None, # None or list of IDs
  136. 'needsName': False, # boolean
  137. 'note': "It might eat through protective layers, and is immune to Brains damage and automatically fails Brains rolls.", # formatted string
  138. 'stats': [0,6,0,6], # four-integer list
  139. },
  140. {
  141. 'id': 12, #integer
  142. 'name': f"Friendly Living Asteroid", # formatted string
  143. 'shortname': "asteroid", # formatted string
  144. 'isPlural': False, # boolean
  145. 'hasMinion': False, # boolean
  146. 'potentialMinions': None, # None or list of IDs
  147. 'needsName': True, # boolean
  148. 'note': "It wants to follow the kobolds home like the biggest possible puppy.", # formatted string
  149. 'stats': [2,3,1,6], # four-integer list
  150. },
  151. {
  152. 'id': 13, #integer
  153. 'name': f"Aggressive Living Asteroid", # formatted string
  154. 'shortname': "asteroid", # formatted string
  155. 'isPlural': False, # boolean
  156. 'hasMinion': False, # boolean
  157. 'potentialMinions': None, # None or list of IDs
  158. 'needsName': True, # boolean
  159. 'note': "It's an ambush hunter that sees ships as a crunchy outside with chewy centers.", # formatted string
  160. 'stats': [2,4,1,6], # four-integer list
  161. },
  162. {
  163. 'id': 14, #integer
  164. 'name': f"Impending Nova", # formatted string
  165. 'shortname': "nova", # formatted string
  166. 'isPlural': False, # boolean
  167. 'hasMinion': False, # boolean
  168. 'potentialMinions': None, # None or list of IDs
  169. 'needsName': False, # boolean
  170. 'note': "Tick, tick, tick... Set a timer and start marking off Body. The nova goes off when its Body hits 0. It's immune to Brains damage and automatically fails Brains rolls.", # formatted string
  171. 'stats': [2,6,0,6], # four-integer list
  172. },
  173. {
  174. 'id': 15, #integer
  175. 'name': f"Volcanic Eruption", # formatted string
  176. 'shortname': f"eruption", # formatted string
  177. 'isPlural': False, # boolean
  178. 'hasMinion': False, # boolean
  179. 'potentialMinions': None, # None or list of IDs
  180. 'needsName': False, # boolean
  181. 'note': "Its molten flow threatens to destroy something important. It is immune to Brains damage and automatically fails Brains rolls.", # formatted string
  182. 'stats': [4,5,0,6], # four-integer list
  183. },
  184. {
  185. 'id': 16, #integer
  186. 'name': f"Tremors", # formatted string
  187. 'shortname': f"tremors", # formatted string
  188. 'isPlural': True, # boolean
  189. 'hasMinion': False, # boolean
  190. 'potentialMinions': None, # None or list of IDs
  191. 'needsName': False, # boolean
  192. 'note': "The earth shakes at the least opportune moments. They are immune to Brains damage and automatically fails Brains rolls.", # formatted string
  193. 'stats': [4,6,0,6], # four-integer list
  194. },
  195. {
  196. 'id': 17, #integer
  197. 'name': f"Fire!", # formatted string
  198. 'shortname': f"fire", # formatted string
  199. 'isPlural': True, # boolean
  200. 'hasMinion': False, # boolean
  201. 'potentialMinions': None, # None or list of IDs
  202. 'needsName': False, # boolean
  203. 'note': "It may consume things not normally considered flammable. It is immune to Brains damage and automatically fails Brains rolls.", # formatted string
  204. 'stats': [5,6,0,6], # four-integer list
  205. },
  206. {
  207. 'id': 18, #integer
  208. 'name': f"Volcano 'God'", # formatted string
  209. 'shortname': f"god", # formatted string
  210. 'isPlural': False, # boolean
  211. 'hasMinion': True, # boolean
  212. 'potentialMinions': [x for x in list(range(121)) if x not in [9,10,18]], # None or list of IDs
  213. 'needsName': True, # boolean
  214. 'note': "It's not actually a god; it just likes destroying things with fire. Its minion may be a worshiper.", # formatted string
  215. 'stats': [4,5,3,6], # four-integer list
  216. },
  217. {
  218. 'id': 19, #integer
  219. 'name': f"Tiny, Hungry Black Hole", # formatted string
  220. 'shortname': f"black hole", # formatted string
  221. 'isPlural': False, # boolean
  222. 'hasMinion': False, # boolean
  223. 'potentialMinions': None, # None or list of IDs
  224. 'needsName': False, # boolean
  225. 'note': "It's semi-intelligent and mobile. It might stalk ship-sized objects.", # formatted string
  226. 'stats': [4,6,3,6], # four-integer list
  227. },
  228. {
  229. 'id': 20, #integer
  230. 'name': f"Cranky Nebula", # formatted string
  231. 'shortname': f"nebula", # formatted string
  232. 'isPlural': False, # boolean
  233. 'hasMinion': False, # boolean
  234. 'potentialMinions': None, # None or list of IDs
  235. 'needsName': True, # boolean
  236. 'note': "It's a baby and wants attention. Its Brains reflects resilience against damage more than actual mental ability.", # formatted string
  237. 'stats': [4,5,6,6], # four-integer list
  238. },
  239. {
  240. 'id': 21, #integer
  241. 'name': f"Sentient Angry Star", # formatted string
  242. 'shortname': f"star", # formatted string
  243. 'isPlural': False, # boolean
  244. 'hasMinion': False, # boolean
  245. 'potentialMinions': None, # None or list of IDs
  246. 'needsName': True, # boolean
  247. 'note': "It demands tribute, and attacks with solar flares... but it can't move out of its orbit.", # formatted string
  248. 'stats': [5,4,5,6], # four-integer list
  249. },
  250. {
  251. 'id': 22, #integer
  252. 'name': f"Elf Red Shirt Away Team", # formatted string
  253. 'shortname': f"elves", # formatted string
  254. 'isPlural': False, # boolean
  255. 'hasMinion': False, # boolean
  256. 'potentialMinions': None, # None or list of IDs
  257. 'needsName': False, # boolean
  258. 'note': "They don't have access to their own ship, but do have their own mission that may or may not conflict with the kobolds'.", # formatted string
  259. 'stats': [3,2,3,3], # four-integer list
  260. },
  261. {
  262. 'id': 23, #integer
  263. 'name': f"Elf Scout Ship", # formatted string
  264. 'shortname': f"ship", # formatted string
  265. 'isPlural': False, # boolean
  266. 'hasMinion': False, # boolean
  267. 'potentialMinions': None, # None or list of IDs
  268. 'needsName': True, # boolean
  269. 'note': "A short-range ship that looks like a streamlined butterfly. Its crew is a pilot and a gunner.", # formatted string
  270. 'stats': [2,3,3,4], # four-integer list
  271. },
  272. {
  273. 'id': 24, #integer
  274. 'name': f"Elf Guard Ship", # formatted string
  275. 'shortname': f"ship", # formatted string
  276. 'isPlural': False, # boolean
  277. 'hasMinion': False, # boolean
  278. 'potentialMinions': None, # None or list of IDs
  279. 'needsName': True, # boolean
  280. 'note': "A short-range ship that looks like a stinging insect. Its crew is a pilot and a gunner.", # formatted string
  281. 'stats': [2,4,3,4], # four-integer list
  282. },
  283. {
  284. 'id': 25, #integer
  285. 'name': f"Elf Cargo Ship", # formatted string
  286. 'shortname': f"ship", # formatted string
  287. 'isPlural': False, # boolean
  288. 'hasMinion': False, # boolean
  289. 'potentialMinions': None, # None or list of IDs
  290. 'needsName': True, # boolean
  291. 'note': "A long-range ship that resembles a beetle. Its cargo might be anything, and its crew always assume hostile intentions.", # formatted string
  292. 'stats': [3,3,3,5], # four-integer list
  293. },
  294. {
  295. 'id': 26, #integer
  296. 'name': f"Elf Long Range Scout", # formatted string
  297. 'shortname': f"ship", # formatted string
  298. 'isPlural': False, # boolean
  299. 'hasMinion': False, # boolean
  300. 'potentialMinions': [22,23,24,25,27,29,30,31,32], # None or list of IDs
  301. 'needsName': True, # boolean
  302. 'note': "A long-range ship that resembles a waterfowl. It prefers to run rather than engage; if it flees, its minion is what's sent to investigate.", # formatted string
  303. 'stats': [4,3,4,4], # four-integer list
  304. },
  305. {
  306. 'id': 27, #integer
  307. 'name': f"Detachment from the Elf Armada", # formatted string
  308. 'shortname': f"detachment", # formatted string
  309. 'isPlural': False, # boolean
  310. 'hasMinion': False, # boolean
  311. 'potentialMinions': None, # None or list of IDs
  312. 'needsName': False, # boolean
  313. 'note': "A small group of ships focused more on science than war, they're usually on a research, escort, or retrieval mission.", # formatted string
  314. 'stats': [4,3,5,4], # four-integer list
  315. },
  316. {
  317. 'id': 28, #integer
  318. 'name': f"Elf Armada Shipyard", # formatted string
  319. 'shortname': f"shipyard", # formatted string
  320. 'isPlural': False, # boolean
  321. 'hasMinion': False, # boolean
  322. 'potentialMinions': [22,23,24,25,26,27,29,30,31,32], # None or list of IDs
  323. 'needsName': True, # boolean
  324. 'note': "It resembles a giant tree.", # formatted string
  325. 'stats': [6,2,3,6], # four-integer list
  326. },
  327. {
  328. 'id': 29, #integer
  329. 'name': f"Elf Stealth Special Ops Team", # formatted string
  330. 'shortname': f"team", # formatted string
  331. 'isPlural': False, # boolean
  332. 'hasMinion': True, # boolean
  333. 'potentialMinions': [x for x in list(range(121)) if x not in [11,12,13,14,15,16,17,18,19,20,28]], # None or list of IDs
  334. 'needsName': False, # boolean
  335. 'note': "The team is almost certainly opposed to the kobolds' mission. Its first action will be done by surprise, and it will use its minion as a feint.", # formatted string
  336. 'stats': [4,6,4,4], # four-integer list
  337. },
  338. {
  339. 'id': 30, #integer
  340. 'name': f"Elf Armada Carrier", # formatted string
  341. 'shortname': f"carrier", # formatted string
  342. 'isPlural': False, # boolean
  343. 'hasMinion': False, # boolean
  344. 'potentialMinions': None, # None or list of IDs
  345. 'needsName': True, # boolean
  346. 'note': "It comes with a swarm of wasp fighters, each with 1 Body. The carrier resembles an enormous chrysalis.", # formatted string
  347. 'stats': [5,5,3,6], # four-integer list
  348. },
  349. {
  350. 'id': 31, #integer
  351. 'name': f"Elf Armada Warship", # formatted string
  352. 'shortname': f"ship", # formatted string
  353. 'isPlural': False, # boolean
  354. 'hasMinion': False, # boolean
  355. 'potentialMinions': None, # None or list of IDs
  356. 'needsName': True, # boolean
  357. 'note': "It looks like a bird of prey. It's heavily armed but not maneuverable, and attempts to use shielding to make up for its inability to dodge.", # formatted string
  358. 'stats': [6,6,2,6], # four-integer list
  359. },
  360. {
  361. 'id': 32, #integer
  362. 'name': f"Elf Armada Flagship", # formatted string
  363. 'shortname': f"flagship", # formatted string
  364. 'isPlural': False, # boolean
  365. 'hasMinion': True, # boolean
  366. 'potentialMinions': [22,23,24,25,26,27,29,30,31], # None or list of IDs
  367. 'needsName': True, # boolean
  368. 'note': "It looks like a flying forest. Its captain assumes that all their orders will be followed - even orders given to non-elves.", # formatted string
  369. 'stats': [5,4,5,6], # four-integer list
  370. },
  371. {
  372. 'id': 33, #integer
  373. 'name': f"Floating, Flaming Skull", # formatted string
  374. 'shortname': f"skull", # formatted string
  375. 'isPlural': False, # boolean
  376. 'hasMinion': False, # boolean
  377. 'potentialMinions': None, # None or list of IDs
  378. 'needsName': True, # boolean
  379. 'note': "It likes a good joke. And a bad joke. And slapstick. And shooting fireballs out of its mouth. It's willing to bargain if the kobolds have something it wants.", # formatted string
  380. 'stats': [1,6,3,1], # four-integer list
  381. },
  382. {
  383. 'id': 34, #integer
  384. 'name': f"Newly-Raised Vampire", # formatted string
  385. 'shortname': f"vampire", # formatted string
  386. 'isPlural': False, # boolean
  387. 'hasMinion': False, # boolean
  388. 'potentialMinions': None, # None or list of IDs
  389. 'needsName': True, # boolean
  390. 'note': "They're power-mad and vastly overestimate their own abilities. The GM may interpret 'vampire powers' however they please.", # formatted string
  391. 'stats': [2,4,2,4], # four-integer list
  392. },
  393. {
  394. 'id': 35, #integer
  395. 'name': f"Undead Sample Pack", # formatted string
  396. 'shortname': f"undead", # formatted string
  397. 'isPlural': False, # boolean
  398. 'hasMinion': False, # boolean
  399. 'potentialMinions': None, # None or list of IDs
  400. 'needsName': False, # boolean
  401. 'note': "A swarm of zombies and skeletons; each Body damage kills one. What they were before they died is the GM's choice.", # formatted string
  402. 'stats': [0,5,2,6], # four-integer list
  403. },
  404. {
  405. 'id': 36, #integer
  406. 'name': f"Ranged Skeletons", # formatted string
  407. 'shortname': f"skeletons", # formatted string
  408. 'isPlural': True, # boolean
  409. 'hasMinion': False, # boolean
  410. 'potentialMinions': None, # None or list of IDs
  411. 'needsName': False, # boolean
  412. 'note': "They may have bows, ray guns, ray bows, or something else. Each Body damage kills one. They're bad at melee combat.", # formatted string
  413. 'stats': [2,5,2,5], # four-integer list
  414. },
  415. {
  416. 'id': 37, #integer
  417. 'name': f"Old Lich who Wants Everyone to Stay Off Their Lawn", # formatted string
  418. 'shortname': f"lich", # formatted string
  419. 'isPlural': False, # boolean
  420. 'hasMinion': False, # boolean
  421. 'potentialMinions': None, # None or list of IDs
  422. 'needsName': True, # boolean
  423. 'note': "They're grumpy, but secretly like having company. They claim to own whatever property they're on - whether or not it's true.", # formatted string
  424. 'stats': [4,2,6,3], # four-integer list
  425. },
  426. {
  427. 'id': 38, #integer
  428. 'name': f"Zombie Brute Squad", # formatted string
  429. 'shortname': f"zombies", # formatted string
  430. 'isPlural': True, # boolean
  431. 'hasMinion': False, # boolean
  432. 'potentialMinions': None, # None or list of IDs
  433. 'needsName': False, # boolean
  434. 'note': "Each Body damage kills one. They can either be ordered to attack or to block; they won't change targets unless they're told to.", # formatted string
  435. 'stats': [3,5,2,6], # four-integer list
  436. },
  437. {
  438. 'id': 39, #integer
  439. 'name': f"Vampire Royalty", # formatted string
  440. 'shortname': f"vampire", # formatted string
  441. 'isPlural': False, # boolean
  442. 'hasMinion': True, # boolean
  443. 'potentialMinions': [33,34,35,36,37,38,40,41,42,43,44], # None or list of IDs
  444. 'needsName': True, # boolean
  445. 'note': "They have lived this long by being patient and cautious. Despite that, their minion may not be 100% loyal.", # formatted string
  446. 'stats': [4,2,5,6], # four-integer list
  447. },
  448. {
  449. 'id': 40, #integer
  450. 'name': f"Possessing Spirit", # formatted string
  451. 'shortname': f"spirit", # formatted string
  452. 'isPlural': False, # boolean
  453. 'hasMinion': False, # boolean
  454. 'potentialMinions': None, # None or list of IDs
  455. 'needsName': True, # boolean
  456. 'note': "It enjoys the parody of life, and hates any reminder that it's dead. It inhabits a host body until its Body is reduced to 0, but it's not dead until its Brains is reduced to 0.", # formatted string
  457. 'stats': [4,4,5,5], # four-integer list
  458. },
  459. {
  460. 'id': 41, #integer
  461. 'name': f"Vengeful Spirit", # formatted string
  462. 'shortname': f"spirit", # formatted string
  463. 'isPlural': False, # boolean
  464. 'hasMinion': False, # boolean
  465. 'potentialMinions': None, # None or list of IDs
  466. 'needsName': True, # boolean
  467. 'note': "It wants revenge on whatever killed it, and it's willing to play the long game to get that revenge.", # formatted string
  468. 'stats': [6,6,6,2], # four-integer list
  469. },
  470. {
  471. 'id': 42, #integer
  472. 'name': f"Eldritch Galaxy-Sized Unknowable Entity", # formatted string
  473. 'shortname': f"entity", # formatted string
  474. 'isPlural': False, # boolean
  475. 'hasMinion': True, # boolean
  476. 'potentialMinions': [x for x in list(range(121)) if x not in [11,12,13,14,15,16,17,18,19,20,28]], # None or list of IDs
  477. 'needsName': True, # boolean
  478. 'note': "It has phenomenal cosmic power, but can only interact through portals. Its minion is tasked with maintaining the portal; if they stop, the entity is trapped on its side.", # formatted string
  479. 'stats': [2,6,6,6], # four-integer list
  480. },
  481. {
  482. 'id': 43, #integer
  483. 'name': f"Necromantic Cult", # formatted string
  484. 'shortname': f"cult", # formatted string
  485. 'isPlural': False, # boolean
  486. 'hasMinion': False, # boolean
  487. 'potentialMinions': None, # None or list of IDs
  488. 'needsName': False, # boolean
  489. 'note': "Each Body damage kills one member, but the full cult may be much larger than what's encountered. Its membership may not be fully undead, but its leaders certainly are.", # formatted string
  490. 'stats': [5,5,5,5], # four-integer list
  491. },
  492. {
  493. 'id': 44, #integer
  494. 'name': f"Mummified Protector", # formatted string
  495. 'shortname': f"mummy", # formatted string
  496. 'isPlural': False, # boolean
  497. 'hasMinion': False, # boolean
  498. 'potentialMinions': None, # None or list of IDs
  499. 'needsName': True, # boolean
  500. 'note': "It wakes up when the place or object it protects is disturbed. All it wants is to go back to sleep - but if what it's protecting is destroyed, it will not rest until it has its revenge, and then goes dormant permanently.", # formatted string
  501. 'stats': [5,5,4,6], # four-integer list
  502. },
  503. {
  504. 'id': 45, #integer
  505. 'name': f"Helperbot 1000", # formatted string
  506. 'shortname': f"robot", # formatted string
  507. 'isPlural': False, # boolean
  508. 'hasMinion': False, # boolean
  509. 'potentialMinions': None, # None or list of IDs
  510. 'needsName': False, # boolean
  511. 'note': "It's half as good as Helperbot 2000. It's more incompetent than malicious, but it will defend itself.", # formatted string
  512. 'stats': [4,2,2,3], # four-integer list
  513. },
  514. {
  515. 'id': 46, #integer
  516. 'name': f"Robot Spiders!", # formatted string
  517. 'shortname': f"spiders", # formatted string
  518. 'isPlural': True, # boolean
  519. 'hasMinion': False, # boolean
  520. 'potentialMinions': None, # None or list of IDs
  521. 'needsName': False, # boolean
  522. 'note': "Each Body damage kills one spider, but there may be more lurking in the walls...", # formatted string
  523. 'stats': [3,3,2,4], # four-integer list
  524. },
  525. {
  526. 'id': 47, #integer
  527. 'name': f"Spy Drones", # formatted string
  528. 'shortname': f"drones", # formatted string
  529. 'isPlural': True, # boolean
  530. 'hasMinion': False, # boolean
  531. 'potentialMinions': None, # None or list of IDs
  532. 'needsName': False, # boolean
  533. 'note': "Each Body damage kills one drone; each drone can also be taken down by dealing its full Brain damage to that drone. The drones are not armed, but can ram kobolds and attack with rotors.", # formatted string
  534. 'stats': [4,4,3,2], # four-integer list
  535. },
  536. {
  537. 'id': 48, #integer
  538. 'name': f"Supercomputer Bent on Multi-World Domination", # formatted string
  539. 'shortname': f"computer", # formatted string
  540. 'isPlural': False, # boolean
  541. 'hasMinion': True, # boolean
  542. 'potentialMinions': [x for x in list(range(121)) if x not in [11,12,13,14,15,16,17,18,19,20,28,48, 53]], # None or list of IDs
  543. 'needsName': True, # boolean
  544. 'note': "It uses its minion to deal with interlopers; it's weak by itself and will try to hide its location.", # formatted string
  545. 'stats': [4,1,6,3], # four-integer list
  546. },
  547. {
  548. 'id': 49, #integer
  549. 'name': f"Weaponized Robotic Interpreter", # formatted string
  550. 'shortname': f"robot", # formatted string
  551. 'isPlural': False, # boolean
  552. 'hasMinion': False, # boolean
  553. 'potentialMinions': None, # None or list of IDs
  554. 'needsName': True, # boolean
  555. 'note': "It's fluent in over six million forms of making suffering be your lot in life. You will feel their pain, but they're sorry about that. It's just a living.", # formatted string
  556. 'stats': [5,5,3,2], # four-integer list
  557. },
  558. {
  559. 'id': 50, #integer
  560. 'name': f"Robot Soldiers", # formatted string
  561. 'shortname': f"robots", # formatted string
  562. 'isPlural': True, # boolean
  563. 'hasMinion': False, # boolean
  564. 'potentialMinions': None, # None or list of IDs
  565. 'needsName': False, # boolean
  566. 'note': "Each Body damage will destroy one soldier; each soldier can also be taken down by dealing its full Brain damage to that soldier. They are usually humanoid, and attack in formation.", # formatted string
  567. 'stats': [3,4,3,6], # four-integer list
  568. },
  569. {
  570. 'id': 51, #integer
  571. 'name': f"Robotic General", # formatted string
  572. 'shortname': f"general", # formatted string
  573. 'isPlural': False, # boolean
  574. 'hasMinion': True, # boolean
  575. 'potentialMinions': [x for x in list(range(121)) if x not in [11,12,13,14,15,16,17,18,19,20,28,48]], # None or list of IDs
  576. 'needsName': True, # boolean
  577. 'note': "It will give orders to anyone and everyone, and will inflift Brains damage if not obeyed.", # formatted string
  578. 'stats': [3,3,6,5], # four-integer list
  579. },
  580. {
  581. 'id': 52, #integer
  582. 'name': f"Rogue AI-controlled Ship", # formatted string
  583. 'shortname': f"ship", # formatted string
  584. 'isPlural': False, # boolean
  585. 'hasMinion': True, # boolean
  586. 'potentialMinions': [x for x in list(range(121)) if x not in [11,12,13,14,15,16,17,18,19,20,28,48]], # None or list of IDs
  587. 'needsName': True, # boolean
  588. 'note': "It's not capable of entering a gravity well.", # formatted string
  589. 'stats': [3,3,6,6], # four-integer list
  590. },
  591. {
  592. 'id': 53, #integer
  593. 'name': f"Supercomputer that Has Achieved Multi-World Domination", # formatted string
  594. 'shortname': f"computer", # formatted string
  595. 'isPlural': False, # boolean
  596. 'hasMinion': True, # boolean
  597. 'potentialMinions': [x for x in list(range(121)) if x not in [11,12,13,14,15,16,17,18,19,20,28,48,53]], # None or list of IDs
  598. 'needsName': True, # boolean
  599. 'note': "Its home system may be a Dyson sphere across which it's evenly distributed.", # formatted string
  600. 'stats': [4,3,6,6], # four-integer list
  601. },
  602. {
  603. 'id': 54, #integer
  604. 'name': f"Gray Goo", # formatted string
  605. 'shortname': f"goo", # formatted string
  606. 'isPlural': False, # boolean
  607. 'hasMinion': False, # boolean
  608. 'potentialMinions': None, # None or list of IDs
  609. 'needsName': False, # boolean
  610. 'note': "World-eating nanites; they may not have actually eaten a world yet, but will if left uncontrolled. They are widely-distributed and must be fully destroyed or they will regenerate.", # formatted string
  611. 'stats': [4,6,6,4], # four-integer list
  612. },
  613. {
  614. 'id': 55, #integer
  615. 'name': f"Giant Mech", # formatted string
  616. 'shortname': f"mech", # formatted string
  617. 'isPlural': False, # boolean
  618. 'hasMinion': False, # boolean
  619. 'potentialMinions': None, # None or list of IDs
  620. 'needsName': True, # boolean
  621. 'note': "If it had a crew, it doesn't anymore. Its end goal is unclear, but it doesn't care what it smashes on its way.", # formatted string
  622. 'stats': [4,6,4,6], # four-integer list
  623. },
  624. {
  625. 'id': 56, #integer
  626. 'name': f"Kobold Workers", # formatted string
  627. 'shortname': f"kobolds", # formatted string
  628. 'isPlural': True, # boolean
  629. 'hasMinion': False, # boolean
  630. 'potentialMinions': None, # None or list of IDs
  631. 'needsName': False, # boolean
  632. 'note': "They dig, build, and move things. Each Body damage will kill one kobold; each kobold can also be taken down by dealing their full Brain damage to that kobold. But they'd rather run than fight.", # formatted string
  633. 'stats': [3,2,3,3], # four-integer list
  634. },
  635. {
  636. 'id': 57, #integer
  637. 'name': f"Kobold Supervisor", # formatted string
  638. 'shortname': f"kobold", # formatted string
  639. 'isPlural': False, # boolean
  640. 'hasMinion': True, # boolean
  641. 'potentialMinions': [56], # None or list of IDs
  642. 'needsName': True, # boolean
  643. 'note': "They lead from a safe distance.", # formatted string
  644. 'stats': [3,2,4,3], # four-integer list
  645. },
  646. {
  647. 'id': 58, #integer
  648. 'name': f"Kobold Inventor", # formatted string
  649. 'shortname': f"kobold", # formatted string
  650. 'isPlural': False, # boolean
  651. 'hasMinion': False, # boolean
  652. 'potentialMinions': None, # None or list of IDs
  653. 'needsName': True, # boolean
  654. 'note': "They invent things by taping two things together. Sometimes, they don't know what their invention is for until they've used it once.", # formatted string
  655. 'stats': [2,3,5,3], # four-integer list
  656. },
  657. {
  658. 'id': 59, #integer
  659. 'name': f"Kobold Babysitter", # formatted string
  660. 'shortname': f"kobold", # formatted string
  661. 'isPlural': False, # boolean
  662. 'hasMinion': False, # boolean
  663. 'potentialMinions': None, # None or list of IDs
  664. 'needsName': True, # boolean
  665. 'note': "Oh god, they've got babies with them. The babies will swarm the party. Dealing 1 Body damage kills a baby, you monster. Once the babies are dead, the Babysitter has no reason to be around anymore. Order comes from the Babysitter, Chaos comes from the Babies.", # formatted string
  666. 'stats': [4,4,3,3], # four-integer list
  667. },
  668. {
  669. 'id': 60, #integer
  670. 'name': f"Kobold Trap Designer", # formatted string
  671. 'shortname': f"kobold", # formatted string
  672. 'isPlural': False, # boolean
  673. 'hasMinion': False, # boolean
  674. 'potentialMinions': None, # None or list of IDs
  675. 'needsName': True, # boolean
  676. 'note': f"They have {r.randint(1,6) + 1} traps set up and waiting, and they're surprisingly good at their job. They're a mix of low-tech and high-tech, and range from sharpened sticks to rigged thermal detonators. Each trap takes an Event to disarm.", # formatted string
  677. 'stats': [3,5,4,3], # four-integer list
  678. },
  679. {
  680. 'id': 61, #integer
  681. 'name': f"Average Kobold", # formatted string
  682. 'shortname': f"kobold", # formatted string
  683. 'isPlural': False, # boolean
  684. 'hasMinion': False, # boolean
  685. 'potentialMinions': None, # None or list of IDs
  686. 'needsName': True, # boolean
  687. 'note': "They tried so hard, but fell so far, and in the end, does it even really matter? They resent the party for actually excelling in their fields, and are intent on proving themselves.", # formatted string
  688. 'stats': [4,4,4,4], # four-integer list
  689. },
  690. {
  691. 'id': 62, #integer
  692. 'name': f"Kobold Sorcerer", # formatted string
  693. 'shortname': f"kobold", # formatted string
  694. 'isPlural': False, # boolean
  695. 'hasMinion': False, # boolean
  696. 'potentialMinions': None, # None or list of IDs
  697. 'needsName': True, # boolean
  698. 'note': "Anything not on fire is just going to have to wait its turn. They may have slightly overestimated their current power level.", # formatted string
  699. 'stats': [3,5,4,5], # four-integer list
  700. },
  701. {
  702. 'id': 63, #integer
  703. 'name': f"Swolbold", # formatted string
  704. 'shortname': f"kobold", # formatted string
  705. 'isPlural': False, # boolean
  706. 'hasMinion': False, # boolean
  707. 'potentialMinions': None, # None or list of IDs
  708. 'needsName': True, # boolean
  709. 'note': "Do you even lift, bro? This kobold does. And they didn't skip leg day. They're not unintelligent, but they did skip classes to go to the gym.", # formatted string
  710. 'stats': [3,6,3,6], # four-integer list
  711. },
  712. {
  713. 'id': 64, #integer
  714. 'name': f"Retired Kobold Adventurer", # formatted string
  715. 'shortname': f"kobold", # formatted string
  716. 'isPlural': False, # boolean
  717. 'hasMinion': False, # boolean
  718. 'potentialMinions': None, # None or list of IDs
  719. 'needsName': True, # boolean
  720. 'note': "They've seen the sights. They've done the things. They've earned the rewards. They just want to retire... and you won't let them. They're not as spry as they used to be, but they can still teach hatchlings a thing or two.", # formatted string
  721. 'stats': [5,5,5,4], # four-integer list
  722. },
  723. {
  724. 'id': 65, #integer
  725. 'name': f"Kobold Adventurers", # formatted string
  726. 'shortname': f"kobolds", # formatted string
  727. 'isPlural': True, # boolean
  728. 'hasMinion': False, # boolean
  729. 'potentialMinions': None, # None or list of IDs
  730. 'needsName': False, # boolean
  731. 'note': f"There are {r.randint(1,3) + 1} adventurers in the group, and each takes the full Body or Mind damage to be killed. They're the best at what they do, and what they do is be another group of kobolds in space.", # formatted string
  732. 'stats': [5,5,5,4], # four-integer list
  733. },
  734. {
  735. 'id': 66, #integer
  736. 'name': f"Kobold Leader", # formatted string
  737. 'shortname': f"kobold", # formatted string
  738. 'isPlural': False, # boolean
  739. 'hasMinion': True, # boolean
  740. 'potentialMinions': [56,57,58,59,60,61,62,63,64,65], # None or list of IDs
  741. 'needsName': True, # boolean
  742. 'note': "This kobold prefers to delegate. It's easier to avoid blame that way. They may attempt to command the PCs. Their instructions may inflict Brains damage.", # formatted string
  743. 'stats': [5,5,6,4], # four-integer list
  744. },
  745. {
  746. 'id': 67, #integer
  747. 'name': f"Semi-Intelligent Metal-Eating Slime", # formatted string
  748. 'shortname': f"slime", # formatted string
  749. 'isPlural': False, # boolean
  750. 'hasMinion': False, # boolean
  751. 'potentialMinions': None, # None or list of IDs
  752. 'needsName': False, # boolean
  753. 'note': "It only eats metal. Organics are safe. Ships and equipment... maybe not so much. Fire damage does a minimum of 2 Br damage even on a mixed success.", # formatted string
  754. 'stats': [0,4,2,5], # four-integer list
  755. },
  756. {
  757. 'id': 68, #integer
  758. 'name': f"Floating Brain", # formatted string
  759. 'shortname': f"brain", # formatted string
  760. 'isPlural': False, # boolean
  761. 'hasMinion': True, # boolean
  762. 'potentialMinions': [x for x in list(range(121)) if x not in [11,12,13,14,15,16,17,18,19,20,28,48,53]], # None or list of IDs
  763. 'needsName': True, # boolean
  764. 'note': "It uses telepathy and telekinesis as weapons, and will send its minion in first.", # formatted string
  765. 'stats': [2,3,6,1], # four-integer list
  766. },
  767. {
  768. 'id': 69, #integer
  769. 'name': f"Thing in a Jar", # formatted string
  770. 'shortname': f"thing", # formatted string
  771. 'isPlural': False, # boolean
  772. 'hasMinion': True, # boolean
  773. 'potentialMinions': [x for x in list(range(121)) if x not in [11,12,13,14,15,16,17,18,19,20,28,48,53]], # None or list of IDs
  774. 'needsName': True, # boolean
  775. 'note': "Its jar is fogged up, so it's not easy to see what's inside. Don't leave it near machinery or electronics; it can connect wirelessly to anything it can sense nearby, but it needs a hardwired connection to assert direct control.", # formatted string
  776. 'stats': [3,2,6,2], # four-integer list
  777. },
  778. {
  779. 'id': 70, #integer
  780. 'name': f"Small Alien Carnivores", # formatted string
  781. 'shortname': f"aliens", # formatted string
  782. 'isPlural': True, # boolean
  783. 'hasMinion': False, # boolean
  784. 'potentialMinions': None, # None or list of IDs
  785. 'needsName': False, # boolean
  786. 'note': "One alien dies for each Body damage inflicted. They're always hungry. They think you're delicious. They don't have tactics; if they smell something tasty, they run at it and try to eat it.", # formatted string
  787. 'stats': [3,5,3,3], # four-integer list
  788. },
  789. {
  790. 'id': 71, #integer
  791. 'name': f"Medium Alien Carnivores", # formatted string
  792. 'shortname': f"aliens", # formatted string
  793. 'isPlural': True, # boolean
  794. 'hasMinion': False, # boolean
  795. 'potentialMinions': None, # None or list of IDs
  796. 'needsName': False, # boolean
  797. 'note': "One alien dies for every <i>two</i> Body damage inflicted. They think you're delicious. They hunt in packs, and make sure at least one of them is flanking a target before they attack. They like tiring out their prey before they strike.", # formatted string
  798. 'stats': [3,4,4,4], # four-integer list
  799. },
  800. {
  801. 'id': 72, #integer
  802. 'name': f"Alien Researchers", # formatted string
  803. 'shortname': f"aliens", # formatted string
  804. 'isPlural': True, # boolean
  805. 'hasMinion': False, # boolean
  806. 'potentialMinions': None, # None or list of IDs
  807. 'needsName': False, # boolean
  808. 'note': "They're kobold-sized, but with bulbous heads and large, onyx eyes. They like to reinforce their superiority by researching other species' 'flaws'. They... don't <i>ask</i> for volunteers.", # formatted string
  809. 'stats': [4,4,5,3], # four-integer list
  810. },
  811. {
  812. 'id': 73, #integer
  813. 'name': f"Big-Game-Hunting Alien", # formatted string
  814. 'shortname': f"alien", # formatted string
  815. 'isPlural': False, # boolean
  816. 'hasMinion': False, # boolean
  817. 'potentialMinions': None, # None or list of IDs
  818. 'needsName': True, # boolean
  819. 'note': "They're on vacation, and like to hunt things that can hunt back. They use 'primitive weapons', like ray guns and homing missiles -- 'nothing fancy'.", # formatted string
  820. 'stats': [4,4,5,4], # four-integer list
  821. },
  822. {
  823. 'id': 74, #integer
  824. 'name': f"Large Alien Carnivore", # formatted string
  825. 'shortname': f"alien", # formatted string
  826. 'isPlural': False, # boolean
  827. 'hasMinion': False, # boolean
  828. 'potentialMinions': None, # None or list of IDs
  829. 'needsName': True, # boolean
  830. 'note': "Its priorities are: 1) Eat. 2) Sleep. Once it fulfills the first, it does the second. It likes to think it's an ambush hunter. This includes bashing through walls to get to its prey.", # formatted string
  831. 'stats': [4,4,4,6], # four-integer list
  832. },
  833. {
  834. 'id': 75, #integer
  835. 'name': f"Energy Being", # formatted string
  836. 'shortname': f"being", # formatted string
  837. 'isPlural': False, # boolean
  838. 'hasMinion': False, # boolean
  839. 'potentialMinions': None, # None or list of IDs
  840. 'needsName': True, # boolean
  841. 'note': "It's made of light, lightning, fire, plasma... you know, a special effect. Its natural state is amorphous but it will change shape to resemble the beings it encounters. It may get angry if its 'guests' try to leave.", # formatted string
  842. 'stats': [4,5,5,5], # four-integer list
  843. },
  844. {
  845. 'id': 76, #integer
  846. 'name': f"Hive Mind", # formatted string
  847. 'shortname': f"colony", # formatted string
  848. 'isPlural': False, # boolean
  849. 'hasMinion': False, # boolean
  850. 'potentialMinions': None, # None or list of IDs
  851. 'needsName': False, # boolean
  852. 'note': rinterp("Every 2 Body damage will kill a member of the hive mind, but this doesn't mean the central intelligence is dead; that takes brain damage. The hive mind is ", ["biological, and seeks organic life forms for food", "cybernetic, and seeks organic life forms for assimilation"], "."), # formatted string
  853. 'stats': [4,3,6,6], # four-integer list
  854. },
  855. {
  856. 'id': 77, #integer
  857. 'name': f"Ancient Engineer", # formatted string
  858. 'shortname': f"ancient", # formatted string
  859. 'isPlural': False, # boolean
  860. 'hasMinion': False, # boolean
  861. 'potentialMinions': None, # None or list of IDs
  862. 'needsName': True, # boolean
  863. 'note': rinterp("They've taken up residence among a 'primitive' civilization, and will take action to defend it. Their goal is ", ["financial", "conquest", "self-aggrandizement", "religious proselytizing"], "."), # formatted string or function
  864. 'stats': [6,4,6,4], # four-integer list
  865. },
  866. {
  867. 'id': 78, #integer
  868. 'name': f"Small Panicking Group", # formatted string
  869. 'shortname': f"people", # formatted string
  870. 'isPlural': True, # boolean
  871. 'hasMinion': False, # boolean
  872. 'potentialMinions': None, # None or list of IDs
  873. 'needsName': False, # boolean
  874. 'note': rinterp("A group of ", list(range(10,51)), " individuals of various species who are scared and not likely to listen to reason."), # formatted string
  875. 'stats': [1,4,2,4], # four-integer list
  876. },
  877. {
  878. 'id': 79, #integer
  879. 'name': f"Refugees with Parasites", # formatted string
  880. 'shortname': f"refugees", # formatted string
  881. 'isPlural': True, # boolean
  882. 'hasMinion': False, # boolean
  883. 'potentialMinions': None, # None or list of IDs
  884. 'needsName': False, # boolean
  885. 'note': "The refugees may be ignorant of the infection, know that some (but not all) have it, or be actively spreading it. An infected refugee instead has the stats 3/4/2/3.", # formatted string
  886. 'stats': [2,4,0,0], # four-integer list
  887. },
  888. {
  889. 'id': 80, #integer
  890. 'name': f"Perfect Storm School Field Trip", # formatted string
  891. 'shortname': f"students", # formatted string
  892. 'isPlural': True, # boolean
  893. 'hasMinion': False, # boolean
  894. 'potentialMinions': None, # None or list of IDs
  895. 'needsName': False, # boolean
  896. 'note': "Kobold students who are full of sugar and want to play with everything. They may or may not have a teacher with them.", # formatted string
  897. 'stats': [4,5,2,2], # four-integer list
  898. },
  899. {
  900. 'id': 81, #integer
  901. 'name': f"Con Artist", # formatted string
  902. 'shortname': f"con artist", # formatted string
  903. 'isPlural': False, # boolean
  904. 'hasMinion': False, # boolean
  905. 'potentialMinions': None, # None or list of IDs
  906. 'needsName': True, # boolean
  907. 'note': "They want to swindle whatever they can out of the kobolds. Reconsider any action on their part that might actually help, or add a hidden cost.", # formatted string
  908. 'stats': [3,4,5,2], # four-integer list
  909. },
  910. {
  911. 'id': 82, #integer
  912. 'name': f"Legitimate Businessmen", # formatted string
  913. 'shortname': f"businessmen", # formatted string
  914. 'isPlural': True, # boolean
  915. 'hasMinion': False, # boolean
  916. 'potentialMinions': None, # None or list of IDs
  917. 'needsName': False, # boolean
  918. 'note': "They're willing to make you an offer and give you a reason not to refuse it. They might offer protection from Legitimate Businessmen.", # formatted string
  919. 'stats': [4,4,3,4], # four-integer list
  920. },
  921. {
  922. 'id': 83, #integer
  923. 'name': f"Agent for a 'Big Bad'", # formatted string
  924. 'shortname': f"agent", # formatted string
  925. 'isPlural': False, # boolean
  926. 'hasMinion': False, # boolean
  927. 'potentialMinions': None, # None or list of IDs
  928. 'needsName': True, # boolean
  929. 'note': "They're always someone else's minion... but you might not find out whose. They'll pretend to be a helper NPC but will only attack when found out and cornered.", # formatted string
  930. 'stats': [4,4,5,3], # four-integer list
  931. },
  932. {
  933. 'id': 84, #integer
  934. 'name': f"Conspiracy Theory Survivalist", # formatted string
  935. 'shortname': f"survivalist", # formatted string
  936. 'isPlural': False, # boolean
  937. 'hasMinion': False, # boolean
  938. 'potentialMinions': None, # None or list of IDs
  939. 'needsName': True, # boolean
  940. 'note': "They're armed to the teeth and holed up in their bunker with every necessity... except one. The less coherent the conspiracy theory, the better.", # formatted string
  941. 'stats': [4,5,3,5], # four-integer list
  942. },
  943. {
  944. 'id': 85, #integer
  945. 'name': f"Large Mob", # formatted string
  946. 'shortname': f"mob", # formatted string
  947. 'isPlural': False, # boolean
  948. 'hasMinion': False, # boolean
  949. 'potentialMinions': None, # None or list of IDs
  950. 'needsName': False, # boolean
  951. 'note': "Not organized protesters, but rather Black Friday shoppers, sports fans rioting, or some other less than reasonable group.", # formatted string
  952. 'stats': [2,6,4,6], # four-integer list
  953. },
  954. {
  955. 'id': 86, #integer
  956. 'name': f"Bored Trillionaire", # formatted string
  957. 'shortname': f"trillionaire", # formatted string
  958. 'isPlural': False, # boolean
  959. 'hasMinion': True, # boolean
  960. 'potentialMinions': [x for x in list(range(121)) if x not in [11,12,13,14,15,16,17,18,19,20,28,48,53,86]], # None or list of IDs
  961. 'needsName': True, # boolean
  962. 'note': "They've turned to villainy as a hobby; most of their plans involve acquiring wealth even if it costs more than they'll get, because the intellectual exercise is the point. They love complicated plots, especially if they can explain them to the kobolds.", # formatted string
  963. 'stats': [5,5,6,3], # four-integer list
  964. },
  965. {
  966. 'id': 87, #integer
  967. 'name': f"Contrarian Politician", # formatted string
  968. 'shortname': f"politician", # formatted string
  969. 'isPlural': False, # boolean
  970. 'hasMinion': False, # boolean
  971. 'potentialMinions': None, # None or list of IDs
  972. 'needsName': True, # boolean
  973. 'note': "They're not anti-kobold; they just happen to be against whatever the kobolds are doing. They'll pull out any obstruction they can... but they might take a bribe.", # formatted string
  974. 'stats': [5,5,6,4], # four-integer list
  975. },
  976. {
  977. 'id': 88, #integer
  978. 'name': f"Completely Normal Person Who Is Not A Murder-Bot", # formatted string
  979. 'shortname': f"person", # formatted string
  980. 'isPlural': False, # boolean
  981. 'hasMinion': False, # boolean
  982. 'potentialMinions': None, # None or list of IDs
  983. 'needsName': True, # boolean
  984. 'note': "It's definitely a murder-bot. It will pretend to be a helper NPC until the kobolds are vulnerable.", # formatted string
  985. 'stats': [4,6,4,6], # four-integer list
  986. },
  987. {
  988. 'id': 89, #integer
  989. 'name': f"Network Pirates", # formatted string
  990. 'shortname': f"pirates", # formatted string
  991. 'isPlural': True, # boolean
  992. 'hasMinion': False, # boolean
  993. 'potentialMinions': None, # None or list of IDs
  994. 'needsName': False, # boolean
  995. 'note': "They do Brains damage by unleashing a torrent of information, and seek proprietary kobold knowledge so they can make it publicly available. They're not fans of paying people for their work.", # formatted string
  996. 'stats': [3,3,4,1], # four-integer list
  997. },
  998. {
  999. 'id': 90, #integer
  1000. 'name': f"Pirate Mutineers", # formatted string
  1001. 'shortname': f"pirates", # formatted string
  1002. 'isPlural': True, # boolean
  1003. 'hasMinion': False, # boolean
  1004. 'potentialMinions': None, # None or list of IDs
  1005. 'needsName': False, # boolean
  1006. 'note': "The revolution was short; these are the losers. They're still pirates, but they don't have a ship... yet.", # formatted string
  1007. 'stats': [2,3,3,4], # four-integer list
  1008. },
  1009. {
  1010. 'id': 91, #integer
  1011. 'name': f"Pirate Swashbuckler", # formatted string
  1012. 'shortname': f"pirate", # formatted string
  1013. 'isPlural': False, # boolean
  1014. 'hasMinion': False, # boolean
  1015. 'potentialMinions': None, # None or list of IDs
  1016. 'needsName': True, # boolean
  1017. 'note': "They're in it for the aesthetic, and like to show off to the point where their effectiveness is limited. If they were better at being an actual pirate, they'd be a captain by now.", # formatted string
  1018. 'stats': [3,4,3,3], # four-integer list
  1019. },
  1020. {
  1021. 'id': 92, #integer
  1022. 'name': f"Pirate Brute", # formatted string
  1023. 'shortname': f"pirate", # formatted string
  1024. 'isPlural': False, # boolean
  1025. 'hasMinion': False, # boolean
  1026. 'potentialMinions': None, # None or list of IDs
  1027. 'needsName': True, # boolean
  1028. 'note': "They're good at moving things and at smashing things. Moving indoors is awkward.", # formatted string
  1029. 'stats': [2,5,2,5], # four-integer list
  1030. },
  1031. {
  1032. 'id': 93, #integer
  1033. 'name': f"Pirate Captain", # formatted string
  1034. 'shortname': f"captain", # formatted string
  1035. 'isPlural': False, # boolean
  1036. 'hasMinion': True, # boolean
  1037. 'potentialMinions': [89,90,91,92,94,95,96,97,99], # None or list of IDs
  1038. 'needsName': True, # boolean
  1039. 'note': "They might be bloodthirsty, arrogant, elegant, suave, or whatever other stereotype the GM prefers. They may or may not be immune to iocane powder.", # formatted string
  1040. 'stats': [3,3,5,4], # four-integer list
  1041. },
  1042. {
  1043. 'id': 94, #integer
  1044. 'name': f"Pirate Treasure Hunters", # formatted string
  1045. 'shortname': f"pirates", # formatted string
  1046. 'isPlural': True, # boolean
  1047. 'hasMinion': False, # boolean
  1048. 'potentialMinions': None, # None or list of IDs
  1049. 'needsName': False, # boolean
  1050. 'note': "They have a ship, and they have a map - or are looking for a map - or heard about a map? They may be looking for the same thing as the kobolds.", # formatted string
  1051. 'stats': [3,4,4,5], # four-integer list
  1052. },
  1053. {
  1054. 'id': 95, #integer
  1055. 'name': f"Pirate Blockade Runner", # formatted string
  1056. 'shortname': f"ship", # formatted string
  1057. 'isPlural': False, # boolean
  1058. 'hasMinion': False, # boolean
  1059. 'potentialMinions': None, # None or list of IDs
  1060. 'needsName': True, # boolean
  1061. 'note': "The stats include ship and crew. For when it absolutely, positively needs to avoid tariffs overnight.", # formatted string
  1062. 'stats': [4,3,5,5], # four-integer list
  1063. },
  1064. {
  1065. 'id': 96, #integer
  1066. 'name': f"Pirate Gunboat", # formatted string
  1067. 'shortname': f"ship", # formatted string
  1068. 'isPlural': False, # boolean
  1069. 'hasMinion': False, # boolean
  1070. 'potentialMinions': None, # None or list of IDs
  1071. 'needsName': True, # boolean
  1072. 'note': "The stats include ship and crew. It has guns. Lots of guns. But it can't take what it can dish out.", # formatted string
  1073. 'stats': [4,6,3,5], # four-integer list
  1074. },
  1075. {
  1076. 'id': 97, #integer
  1077. 'name': f"Pirate Flagship", # formatted string
  1078. 'shortname': f"ship", # formatted string
  1079. 'isPlural': False, # boolean
  1080. 'hasMinion': False, # boolean
  1081. 'potentialMinions': None, # None or list of IDs
  1082. 'needsName': True, # boolean
  1083. 'note': "The stats include ship and crew. It bristles with guns, and has heavy armor, but it's slow and difficult to maneuver.", # formatted string
  1084. 'stats': [4,6,3,6], # four-integer list
  1085. },
  1086. {
  1087. 'id': 98, #integer
  1088. 'name': f"Legendary Pirate", # formatted string
  1089. 'shortname': f"pirate", # formatted string
  1090. 'isPlural': False, # boolean
  1091. 'hasMinion': True, # boolean
  1092. 'potentialMinions': [89,90,91,92,93,94,95,96,97,99], # None or list of IDs
  1093. 'needsName': True, # boolean
  1094. 'note': "They're as into loot as any pirate is, but they also have a grand plan that they may or may not reveal.", # formatted string
  1095. 'stats': [4,5,6,5], # four-integer list
  1096. },
  1097. {
  1098. 'id': 99, #integer
  1099. 'name': f"Pirate Ghost Ship", # formatted string
  1100. 'shortname': f"ship", # formatted string
  1101. 'isPlural': False, # boolean
  1102. 'hasMinion': False, # boolean
  1103. 'potentialMinions': None, # None or list of IDs
  1104. 'needsName': True, # boolean
  1105. 'note': "The stats include the ship and crew. It can harm the living, but it can't collect loot... but the crew still try to go through the motions.", # formatted string
  1106. 'stats': [6,6,5,3], # four-integer list
  1107. },
  1108. {
  1109. 'id': 100, #integer
  1110. 'name': f"Monster Under The Bed", # formatted string
  1111. 'shortname': f"monster", # formatted string
  1112. 'isPlural': False, # boolean
  1113. 'hasMinion': False, # boolean
  1114. 'potentialMinions': None, # None or list of IDs
  1115. 'needsName': True, # boolean
  1116. 'note': "Well, any dark location is fair game. It waits for a nearby kobold to be alone, and does Brain damage by causing illusions. If its first attempts don't work, it'll ramp up - unattended children, core breaches, explosive decompression...", # formatted string
  1117. 'stats': [1,4,5,1], # four-integer list
  1118. },
  1119. {
  1120. 'id': 101, #integer
  1121. 'name': f"Irate Customer", # formatted string
  1122. 'shortname': f"customer", # formatted string
  1123. 'isPlural': False, # boolean
  1124. 'hasMinion': False, # boolean
  1125. 'potentialMinions': None, # None or list of IDs
  1126. 'needsName': True, # boolean
  1127. 'note': "They want to speak to the manager, and ignore claims that the kobolds aren't actually running a business. They'll definitely get violent.", # formatted string
  1128. 'stats': [1,5,1,5], # four-integer list
  1129. },
  1130. {
  1131. 'id': 102, #integer
  1132. 'name': f"Representative of the Local Homeowners' Association", # formatted string
  1133. 'shortname': f"representative", # formatted string
  1134. 'isPlural': False, # boolean
  1135. 'hasMinion': False, # boolean
  1136. 'potentialMinions': None, # None or list of IDs
  1137. 'needsName': True, # boolean
  1138. 'note': "Their stats include lawyers that appear one at a time to provide paperwork for their claims. They'll find the kobolds in violation of various codes, some of which they may have just invented, and try to fine them into obscurity.", # formatted string
  1139. 'stats': [2,4,4,3], # four-integer list
  1140. },
  1141. {
  1142. 'id': 103, #integer
  1143. 'name': f"Doppelganger", # formatted string
  1144. 'shortname': f"doppelganger", # formatted string
  1145. 'isPlural': False, # boolean
  1146. 'hasMinion': False, # boolean
  1147. 'potentialMinions': None, # None or list of IDs
  1148. 'needsName': True, # boolean
  1149. 'note': "They'll try to split the kobolds up and then infiltrate the group, pretending to be whichever kobold isn't present. They love a good practical joke... or a bad one.", # formatted string
  1150. 'stats': [3,4,5,2], # four-integer list
  1151. },
  1152. {
  1153. 'id': 104, #integer
  1154. 'name': f"Creepy Doll", # formatted string
  1155. 'shortname': f"doll", # formatted string
  1156. 'isPlural': False, # boolean
  1157. 'hasMinion': False, # boolean
  1158. 'potentialMinions': None, # None or list of IDs
  1159. 'needsName': True, # boolean
  1160. 'note': "It moves, but only when no one is looking. It tries to get nearby kobolds to hurt themselves or others.", # formatted string
  1161. 'stats': [4,4,5,2], # four-integer list
  1162. },
  1163. {
  1164. 'id': 105, #integer
  1165. 'name': f"Mimic", # formatted string
  1166. 'shortname': f"mimic", # formatted string
  1167. 'isPlural': False, # boolean
  1168. 'hasMinion': False, # boolean
  1169. 'potentialMinions': None, # None or list of IDs
  1170. 'needsName': False, # boolean
  1171. 'note': "It can imitate any simple object made of wood, stone, or metal, but it really likes treasure chests for some reason. It's an ambush hunter, waiting until it's touched to strike.", # formatted string
  1172. 'stats': [5,5,2,4], # four-integer list
  1173. },
  1174. {
  1175. 'id': 106, #integer
  1176. 'name': rinterp("Living ", ["Air", "Earth", "Fire", "Water"], ""), # formatted string
  1177. 'shortname': f"elemental", # formatted string
  1178. 'isPlural': False, # boolean
  1179. 'hasMinion': False, # boolean
  1180. 'potentialMinions': None, # None or list of IDs
  1181. 'needsName': True, # boolean
  1182. 'note': "It will coalesce into a vaguely humanoid shape, and it's deeply troubled by and will try to destroy anything that's not just like it.", # formatted string
  1183. 'stats': [3,6,4,4], # four-integer list
  1184. },
  1185. {
  1186. 'id': 107, #integer
  1187. 'name': f"Lycanthrope", # formatted string
  1188. 'shortname': f"lycanthrope", # formatted string
  1189. 'isPlural': False, # boolean
  1190. 'hasMinion': False, # boolean
  1191. 'potentialMinions': None, # None or list of IDs
  1192. 'needsName': True, # boolean
  1193. 'note': "Its 'normal' form can be anything common in the area the kobolds are visiting; if the area is uninhabited, make it a kobold. Probably turns into a wolf... but might turn into something else.", # formatted string
  1194. 'stats': [4,5,4,5], # four-integer list
  1195. },
  1196. {
  1197. 'id': 108, #integer
  1198. 'name': f"Revolutionaries", # formatted string
  1199. 'shortname': f"revolutionaries", # formatted string
  1200. 'isPlural': True, # boolean
  1201. 'hasMinion': False, # boolean
  1202. 'potentialMinions': None, # None or list of IDs
  1203. 'needsName': False, # boolean
  1204. 'note': "They belong to any nearby country, but want to overthrow it. They see the kobolds either as opposition or as useful, ignorant tools.", # formatted string
  1205. 'stats': [4,5,5,5], # four-integer list
  1206. },
  1207. {
  1208. 'id': 109, #integer
  1209. 'name': f"Bored Reality Bender", # formatted string
  1210. 'shortname': f"Q", # formatted string
  1211. 'isPlural': False, # boolean
  1212. 'hasMinion': False, # boolean
  1213. 'potentialMinions': None, # None or list of IDs
  1214. 'needsName': True, # boolean
  1215. 'note': "They just want to have a fun time, and they'll help or hinder the kobolds depending on what makes their game last longer. They can bend their own stats if they need to.", # formatted string
  1216. 'stats': [6,6,6,2], # four-integer list
  1217. },
  1218. {
  1219. 'id': 110, #integer
  1220. 'name': f"Released Space Kraken", # formatted string
  1221. 'shortname': f"kraken", # formatted string
  1222. 'isPlural': False, # boolean
  1223. 'hasMinion': False, # boolean
  1224. 'potentialMinions': None, # None or list of IDs
  1225. 'needsName': True, # boolean
  1226. 'note': "They just got out and they're ready to party, which in this case means destroying any ships and cities they encounter.", # formatted string
  1227. 'stats': [4,6,4,6], # four-integer list
  1228. },
  1229. {
  1230. 'id': 111, #integer
  1231. 'name': f"Eldritch Mostly-Disembodied Gibbering Voices", # formatted string
  1232. 'shortname': f"voices", # formatted string
  1233. 'isPlural': True, # boolean
  1234. 'hasMinion': False, # boolean
  1235. 'potentialMinions': None, # None or list of IDs
  1236. 'needsName': False, # boolean
  1237. 'note': "They're barely visible, and can walk through walls. They'll always choose to attack rather than defend themselves.", # formatted string
  1238. 'stats': [0,6,5,0], # four-integer list
  1239. },
  1240. {
  1241. 'id': 112, #integer
  1242. 'name': f"Eldritch Fanatic Cultists", # formatted string
  1243. 'shortname': f"cultists", # formatted string
  1244. 'isPlural': True, # boolean
  1245. 'hasMinion': False, # boolean
  1246. 'potentialMinions': None, # None or list of IDs
  1247. 'needsName': True, # boolean
  1248. 'note': "They're eager to appease the beings they serve, but they might be very wrong about how they choose to do it.", # formatted string
  1249. 'stats': [1,3,4,4], # four-integer list
  1250. },
  1251. {
  1252. 'id': 113, #integer
  1253. 'name': f"Eldritch 'Enlightened' Cultists", # formatted string
  1254. 'shortname': f"cultists", # formatted string
  1255. 'isPlural': True, # boolean
  1256. 'hasMinion': False, # boolean
  1257. 'potentialMinions': None, # None or list of IDs
  1258. 'needsName': False, # boolean
  1259. 'note': "They're very eager to appease the beings they serve, and have received some guidance on how to do it... which has altered their appearance somehow.", # formatted string
  1260. 'stats': [1,4,4,4], # four-integer list
  1261. },
  1262. {
  1263. 'id': 114, #integer
  1264. 'name': f"Eldritch 'Ascended' Cultists", # formatted string
  1265. 'shortname': f"cultists", # formatted string
  1266. 'isPlural': True, # boolean
  1267. 'hasMinion': False, # boolean
  1268. 'potentialMinions': None, # None or list of IDs
  1269. 'needsName': False, # boolean
  1270. 'note': "Whatever they were, they... aren't anymore, with extra limbs and odd proportions. They're working on a device (of a sort up to the GM) to awaken or summon an old god.", # formatted string
  1271. 'stats': [2,3,4,5], # four-integer list
  1272. },
  1273. {
  1274. 'id': 115, #integer
  1275. 'name': f"Eldritch Living Beacon", # formatted string
  1276. 'shortname': f"beacon", # formatted string
  1277. 'isPlural': False, # boolean
  1278. 'hasMinion': False, # boolean
  1279. 'potentialMinions': None, # None or list of IDs
  1280. 'needsName': True, # boolean
  1281. 'note': "It can be mechanical, biological, a fusion, or something else altogether. It's been built or grown to summon or awaken something far worse.", # formatted string
  1282. 'stats': [2,3,5,5], # four-integer list
  1283. },
  1284. {
  1285. 'id': 116, #integer
  1286. 'name': f"Eldritch Corrupted Town", # formatted string
  1287. 'shortname': f"town", # formatted string
  1288. 'isPlural': False, # boolean
  1289. 'hasMinion': False, # boolean
  1290. 'potentialMinions': None, # None or list of IDs
  1291. 'needsName': True, # boolean
  1292. 'note': "The residents are all of one mind, whether that's a hive mind, a single entity controlling everything, puppets, or what have you. Their goal is to maintain the status quo, which might involve killing the kobolds... or assimilating them.", # formatted string
  1293. 'stats': [4,3,3,6], # four-integer list
  1294. },
  1295. {
  1296. 'id': 117, #integer
  1297. 'name': f"Eldritch Hunter/Seeker", # formatted string
  1298. 'shortname': f"hunter/seeker", # formatted string
  1299. 'isPlural': False, # boolean
  1300. 'hasMinion': False, # boolean
  1301. 'potentialMinions': None, # None or list of IDs
  1302. 'needsName': True, # boolean
  1303. 'note': "Someone or something is needed for an unknowable purpose, and the hunter/seeker will get it. This might be something the kobolds have, something they want, or one of the kobolds themselves. The hunter/seeker won't let their target be harmed... at least, not before it's delivered.", # formatted string
  1304. 'stats': [5,2,5,5], # four-integer list
  1305. },
  1306. {
  1307. 'id': 118, #integer
  1308. 'name': f"Eldritch Offspring", # formatted string
  1309. 'shortname': f"offspring", # formatted string
  1310. 'isPlural': False, # boolean
  1311. 'hasMinion': True, # boolean
  1312. 'potentialMinions': [x for x in list(range(121)) if x not in [11,12,13,14,15,16,17,18,19,20,28]], # None or list of IDs
  1313. 'needsName': True, # boolean
  1314. 'note': "It's an avatar of an old god, not yet come into its full power, and may not understand the goals of its parent. Its minion is trying to guide the offspring's decisions.", # formatted string
  1315. 'stats': [4,5,4,5], # four-integer list
  1316. },
  1317. {
  1318. 'id': 119, #integer
  1319. 'name': f"Eldritch Chosen Servant", # formatted string
  1320. 'shortname': f"servant", # formatted string
  1321. 'isPlural': False, # boolean
  1322. 'hasMinion': False, # boolean
  1323. 'potentialMinions': None, # None or list of IDs
  1324. 'needsName': True, # boolean
  1325. 'note': "It's here because someone or something earned the ire of an eldritch being. Whether or not that's the kobolds is up to the DM. Whether or not the kobolds get in its way is their choice.", # formatted string
  1326. 'stats': [3,5,5,6], # four-integer list
  1327. },
  1328. {
  1329. 'id': 120, #integer
  1330. 'name': f"Eldritch Slumbering Old God", # formatted string
  1331. 'shortname': f"god", # formatted string
  1332. 'isPlural': False, # boolean
  1333. 'hasMinion': True, # boolean
  1334. 'potentialMinions': [x for x in list(range(121)) if x not in [11,12,13,14,15,16,17,18,19,20,28]], # None or list of IDs
  1335. 'needsName': True, # boolean
  1336. 'note': "Its minion is either dedicated to waking it up or keeping it asleep, at the DM's discretion. If it wakes up, it'll wake up grumpy.", # formatted string
  1337. 'stats': [3,5,6,6], # four-integer list
  1338. },
  1339. {
  1340. 'id': 121,
  1341. 'name': f"Pev the Destroyer",
  1342. 'shortname': "cat",
  1343. 'isPlural': False,
  1344. 'hasMinion': False,
  1345. 'potentialMinions': None,
  1346. 'needsName': False,
  1347. 'note': "He's an enormous black-and-brown tabby cat who loves to hunt and eat lizards.",
  1348. 'stats': [2,6,4,6],
  1349. },
  1350. ]