A character/one-shot generator for KOBOLDS IN SPACE!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

adversaries.py 55KB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222
  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. 'hasMinion': False, # boolean
  13. 'potentialMinions': None # None or list of IDs
  14. 'needsName': True, # boolean
  15. 'note': "It's very naive about its power level.", # formatted string
  16. 'stats': [2,3,3,3], # four-integer list
  17. },
  18. {
  19. 'id': 1, #integer
  20. 'name': f"Cat Dragon", # formatted string
  21. 'shortname': "dragon", # formatted string
  22. 'hasMinion': False, # boolean
  23. 'potentialMinions': None # None or list of IDs
  24. 'needsName': True, # boolean
  25. 'note': "It's covered in fur; its Hairball Breath may deal Brains damage instead of Body.", # formatted string
  26. 'stats': [1,4,3,4], # four-integer list
  27. },
  28. {
  29. 'id': 2, #integer
  30. 'name': f"Fairy Dragon", # formatted string
  31. 'shortname': "dragon", # formatted string
  32. 'hasMinion': False, # boolean
  33. 'potentialMinions': None # None or list of IDs
  34. 'needsName': True, # boolean
  35. 'note': "Its Glitter Breath makes targets super visible. It loves sweets.", # formatted string
  36. 'stats': [2,4,3,4], # four-integer list
  37. },
  38. {
  39. 'id': 3, #integer
  40. 'name': f"Sedan Dragon", # formatted string
  41. 'shortname': "dragon", # formatted string
  42. 'hasMinion': False, # boolean
  43. 'potentialMinions': None # None or list of IDs
  44. 'needsName': True, # boolean
  45. 'note': "It has four wings and Carbon Monoxide Breath. It may carry and use Gear.", # formatted string
  46. 'stats': [2,4,3,5], # four-integer list
  47. },
  48. {
  49. 'id': 4, #integer
  50. 'name': f"Brass Dragon", # formatted string
  51. 'shortname': "dragon", # formatted string
  52. 'hasMinion': False, # boolean
  53. 'potentialMinions': None # None or list of IDs
  54. 'needsName': True, # boolean
  55. 'note': "A being of Order, it mimics a steampunk theme.", # formatted string
  56. 'stats': [4,3,4,4], # four-integer list
  57. },
  58. {
  59. 'id': 5, #integer
  60. 'name': f"Space Dragon", # formatted string
  61. 'shortname': "dragon", # formatted string
  62. 'hasMinion': False, # boolean
  63. 'potentialMinions': None # None or list of IDs
  64. 'needsName': True, # boolean
  65. 'note': "It has Solar Wind Breath that pushes targets back.", # formatted string
  66. 'stats': [3,4,4,5], # four-integer list
  67. },
  68. {
  69. 'id': 6, #integer
  70. 'name': f"Wolf Dragons", # formatted string
  71. 'shortname': "dragons", # formatted string
  72. 'hasMinion': False, # boolean
  73. 'potentialMinions': None # None or list of IDs
  74. 'needsName': False, # boolean
  75. 'note': "They are covered in fur and attack in packs (the stats are for the pack).", # formatted string
  76. 'stats': [4,5,3,5], # four-integer list
  77. },
  78. {
  79. 'id': 7, #integer
  80. 'name': f"Iron Dragon", # formatted string
  81. 'shortname': "dragon", # formatted string
  82. 'hasMinion': False, # boolean
  83. 'potentialMinions': None # None or list of IDs
  84. 'needsName': True, # boolean
  85. 'note': "It's covered in actual iron and has Coal Dust Breath. It enjoys conquest and destruction for their own sake.", # formatted string
  86. 'stats': [3,5,5,5], # four-integer list
  87. },
  88. {
  89. 'id': 8, #integer
  90. 'name': rinterp("", DRAGON_TYPES, " Dragon Spellcaster"), # formatted string
  91. 'shortname': "dragon", # formatted string
  92. 'hasMinion': False, # boolean
  93. 'potentialMinions': None # None or list of IDs
  94. 'needsName': True, # boolean
  95. 'note': "It prefers to use spells rather than its physical attacks.", # formatted string
  96. 'stats': [4,5,6,4], # four-integer list
  97. },
  98. {
  99. 'id': 9, #integer
  100. 'name': f"Old Green, the Dragon", # formatted string
  101. 'shortname': "dragon", # formatted string
  102. 'hasMinion': True, # boolean
  103. 'potentialMinions': [x for x in list(range(121)) if x != 9 and x != 10] # None or list of IDs
  104. 'needsName': False, # boolean
  105. 'note': "It will send its minion to attack first, and exhales a toxic, opaque gas to cover its escape if needed.", # formatted string
  106. 'stats': [5,3,6,6], # four-integer list
  107. },
  108. {
  109. 'id': 10, #integer
  110. 'name': f"Old Red, the Dragon", # formatted string
  111. 'shortname': "dragon", # formatted string
  112. 'hasMinion': False, # boolean
  113. 'potentialMinions': None # None or list of IDs
  114. 'needsName': False, # boolean
  115. 'note': "It's bigger than you expect, even when you're expecting it. It melts things with its Fire Breath for fun.", # formatted string
  116. 'stats': [3,5,6,6], # four-integer list
  117. },
  118. {
  119. 'id': 11, #integer
  120. 'name': f"Toxic Air", # formatted string
  121. 'shortname': "air", # formatted string
  122. 'hasMinion': False, # boolean
  123. 'potentialMinions': None # None or list of IDs
  124. 'needsName': False, # boolean
  125. 'note': "It might eat through protective layers, and is immune to Brains damage and automatically fails Brains rolls.", # formatted string
  126. 'stats': [0,6,0,6], # four-integer list
  127. },
  128. {
  129. 'id': 12, #integer
  130. 'name': f"Friendly Living Asteroid", # formatted string
  131. 'shortname': "asteroid", # formatted string
  132. 'hasMinion': False, # boolean
  133. 'potentialMinions': None # None or list of IDs
  134. 'needsName': True, # boolean
  135. 'note': "It wants to follow the kobolds home like the biggest possible puppy.", # formatted string
  136. 'stats': [2,3,1,6], # four-integer list
  137. },
  138. {
  139. 'id': 13, #integer
  140. 'name': f"Aggressive Living Asteroid", # formatted string
  141. 'shortname': "asteroid", # formatted string
  142. 'hasMinion': False, # boolean
  143. 'potentialMinions': None # None or list of IDs
  144. 'needsName': True, # boolean
  145. 'note': "It's an ambush hunter that sees ships as a crunchy outside with chewy centers.", # formatted string
  146. 'stats': [2,4,1,6], # four-integer list
  147. },
  148. {
  149. 'id': 14, #integer
  150. 'name': f"Impending Nova", # formatted string
  151. 'shortname': "nova", # formatted string
  152. 'hasMinion': False, # boolean
  153. 'potentialMinions': None # None or list of IDs
  154. 'needsName': False, # boolean
  155. '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
  156. 'stats': [2,6,0,6], # four-integer list
  157. },
  158. {
  159. 'id': 15, #integer
  160. 'name': f"Volcanic Eruption", # formatted string
  161. 'shortname': f"eruption", # formatted string
  162. 'hasMinion': False, # boolean
  163. 'potentialMinions': None # None or list of IDs
  164. 'needsName': False, # boolean
  165. 'note': "Its molten flow threatens to destroy something important. It is immune to Brains damage and automatically fails Brains rolls.", # formatted string
  166. 'stats': [4,5,0,6], # four-integer list
  167. },
  168. {
  169. 'id': 16, #integer
  170. 'name': f"Tremors", # formatted string
  171. 'shortname': f"tremors", # formatted string
  172. 'hasMinion': False, # boolean
  173. 'potentialMinions': None # None or list of IDs
  174. 'needsName': False, # boolean
  175. 'note': "The earth shakes at the least opportune moments. They are immune to Brains damage and automatically fails Brains rolls.", # formatted string
  176. 'stats': [4,6,0,6], # four-integer list
  177. },
  178. {
  179. 'id': 17, #integer
  180. 'name': f"Fire!", # formatted string
  181. 'shortname': f"fire", # formatted string
  182. 'hasMinion': False, # boolean
  183. 'potentialMinions': None # None or list of IDs
  184. 'needsName': False, # boolean
  185. 'note': "It may consume things not normally considered flammable. It is immune to Brains damage and automatically fails Brains rolls.", # formatted string
  186. 'stats': [5,6,0,6], # four-integer list
  187. },
  188. {
  189. 'id': 18, #integer
  190. 'name': f"Volcano 'God'", # formatted string
  191. 'shortname': f"god", # formatted string
  192. 'hasMinion': True, # boolean
  193. 'potentialMinions': [x for x in list(range(121)) if x not in [9,10,18]] # None or list of IDs
  194. 'needsName': True, # boolean
  195. 'note': "It's not actually a god; it just likes destroying things with fire. Its minion may be a worshiper.", # formatted string
  196. 'stats': [4,5,3,6], # four-integer list
  197. },
  198. {
  199. 'id': 19, #integer
  200. 'name': f"Tiny, Hungry Black Hole", # formatted string
  201. 'shortname': f"black hole", # formatted string
  202. 'hasMinion': False, # boolean
  203. 'potentialMinions': None # None or list of IDs
  204. 'needsName': False, # boolean
  205. 'note': "It's semi-intelligent and mobile. It might stalk ship-sized objects.", # formatted string
  206. 'stats': [4,6,3,6], # four-integer list
  207. },
  208. {
  209. 'id': 20, #integer
  210. 'name': f"Cranky Nebula", # formatted string
  211. 'shortname': f"nebula", # formatted string
  212. 'hasMinion': False, # boolean
  213. 'potentialMinions': None # None or list of IDs
  214. 'needsName': True, # boolean
  215. 'note': "It's a baby and wants attention. Its Brains reflects resilience against damage more than actual mental ability.", # formatted string
  216. 'stats': [4,5,6,6], # four-integer list
  217. },
  218. {
  219. 'id': 21, #integer
  220. 'name': f"Sentient Angry Star", # formatted string
  221. 'shortname': f"star", # formatted string
  222. 'hasMinion': False, # boolean
  223. 'potentialMinions': None # None or list of IDs
  224. 'needsName': True, # boolean
  225. 'note': "It demands tribute, and attacks with solar flares... but it can't move out of its orbit.", # formatted string
  226. 'stats': [5,4,5,6], # four-integer list
  227. },
  228. {
  229. 'id': 22, #integer
  230. 'name': f"Elf Red Shirt Away Team", # formatted string
  231. 'shortname': f"", # formatted string
  232. 'hasMinion': False, # boolean
  233. 'potentialMinions': None # None or list of IDs
  234. 'needsName': False, # boolean
  235. '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
  236. 'stats': [3,2,3,3], # four-integer list
  237. },
  238. {
  239. 'id': 23, #integer
  240. 'name': f"Elf Scout Ship", # formatted string
  241. 'shortname': f"ship", # formatted string
  242. 'hasMinion': False, # boolean
  243. 'potentialMinions': None # None or list of IDs
  244. 'needsName': True, # boolean
  245. 'note': "A short-range ship that looks like a streamlined butterfly. Its crew is a pilot and a gunner.", # formatted string
  246. 'stats': [2,3,3,4], # four-integer list
  247. },
  248. {
  249. 'id': 24, #integer
  250. 'name': f"Elf Guard Ship", # formatted string
  251. 'shortname': f"ship", # formatted string
  252. 'hasMinion': False, # boolean
  253. 'potentialMinions': None # None or list of IDs
  254. 'needsName': True, # boolean
  255. 'note': "A short-range ship that looks like a stinging insect. Its crew is a pilot and a gunner.", # formatted string
  256. 'stats': [2,4,3,4], # four-integer list
  257. },
  258. {
  259. 'id': 25, #integer
  260. 'name': f"Elf Cargo Ship", # formatted string
  261. 'shortname': f"ship", # formatted string
  262. 'hasMinion': False, # boolean
  263. 'potentialMinions': None # None or list of IDs
  264. 'needsName': True, # boolean
  265. 'note': "A long-range ship that resembles a beetle. Its cargo might be anything, and its crew always assume hostile intentions.", # formatted string
  266. 'stats': [3,3,3,5], # four-integer list
  267. },
  268. {
  269. 'id': 26, #integer
  270. 'name': f"Elf Long Range Scout", # formatted string
  271. 'shortname': f"ship", # formatted string
  272. 'hasMinion': False, # boolean
  273. 'potentialMinions': [22,23,24,25,27,29,30,31,32] # None or list of IDs
  274. 'needsName': True, # boolean
  275. '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
  276. 'stats': [,,,], # four-integer list
  277. },
  278. {
  279. 'id': 27, #integer
  280. 'name': f"Detachment from the Elf Armada", # formatted string
  281. 'shortname': f"detachment", # formatted string
  282. 'hasMinion': False, # boolean
  283. 'potentialMinions': None # None or list of IDs
  284. 'needsName': False, # boolean
  285. 'note': "A small group of ships focused more on science than war, they're usually on a research, escort, or retrieval mission.", # formatted string
  286. 'stats': [4,3,5,4], # four-integer list
  287. },
  288. {
  289. 'id': 28, #integer
  290. 'name': f"Elf Armada Shipyard", # formatted string
  291. 'shortname': f"shipyard", # formatted string
  292. 'hasMinion': False, # boolean
  293. 'potentialMinions': [22,23,24,25,26,27,29,30,31,32] # None or list of IDs
  294. 'needsName': True, # boolean
  295. 'note': "It resembles a giant tree.", # formatted string
  296. 'stats': [6,2,3,6], # four-integer list
  297. },
  298. {
  299. 'id': 29, #integer
  300. 'name': f"Elf Stealth Special Ops Team", # formatted string
  301. 'shortname': f"team", # formatted string
  302. 'hasMinion': True, # boolean
  303. '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
  304. 'needsName': False, # boolean
  305. '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
  306. 'stats': [4,6,4,4], # four-integer list
  307. },
  308. {
  309. 'id': 30, #integer
  310. 'name': f"Elf Armada Carrier", # formatted string
  311. 'shortname': f"carrier", # formatted string
  312. 'hasMinion': False, # boolean
  313. 'potentialMinions': None # None or list of IDs
  314. 'needsName': True, # boolean
  315. 'note': "It comes with a swarm of wasp fighters, each with 1 Body. The carrier resembles an enormous chrysalis.", # formatted string
  316. 'stats': [5,5,3,6], # four-integer list
  317. },
  318. {
  319. 'id': 31, #integer
  320. 'name': f"Elf Armada Warship", # formatted string
  321. 'shortname': f"ship", # formatted string
  322. 'hasMinion': False, # boolean
  323. 'potentialMinions': None # None or list of IDs
  324. 'needsName': True, # boolean
  325. '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
  326. 'stats': [6,6,2,6], # four-integer list
  327. },
  328. {
  329. 'id': 32, #integer
  330. 'name': f"Elf Armada Flagship", # formatted string
  331. 'shortname': f"flagship", # formatted string
  332. 'hasMinion': True, # boolean
  333. 'potentialMinions': [22,23,24,25,26,27,29,30,31] # None or list of IDs
  334. 'needsName': True, # boolean
  335. '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
  336. 'stats': [5,4,5,6], # four-integer list
  337. },
  338. {
  339. 'id': 33, #integer
  340. 'name': f"Floating, Flaming Skull", # formatted string
  341. 'shortname': f"skull", # formatted string
  342. 'hasMinion': False, # boolean
  343. 'potentialMinions': None # None or list of IDs
  344. 'needsName': True, # boolean
  345. '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
  346. 'stats': [1,6,3,1], # four-integer list
  347. },
  348. {
  349. 'id': 34, #integer
  350. 'name': f"Newly-Raised Vampire", # formatted string
  351. 'shortname': f"vampire", # formatted string
  352. 'hasMinion': False, # boolean
  353. 'potentialMinions': None # None or list of IDs
  354. 'needsName': True, # boolean
  355. 'note': "They're power-mad and vastly overestimate their own abilities. The GM may interpret 'vampire powers' however they please.", # formatted string
  356. 'stats': [2,4,2,4], # four-integer list
  357. },
  358. {
  359. 'id': 35, #integer
  360. 'name': f"Undead Sample Pack", # formatted string
  361. 'shortname': f"undead", # formatted string
  362. 'hasMinion': False, # boolean
  363. 'potentialMinions': None # None or list of IDs
  364. 'needsName': False, # boolean
  365. '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
  366. 'stats': [0,5,2,6], # four-integer list
  367. },
  368. {
  369. 'id': 36, #integer
  370. 'name': f"Ranged Skeletons", # formatted string
  371. 'shortname': f"skeletons", # formatted string
  372. 'hasMinion': False, # boolean
  373. 'potentialMinions': None # None or list of IDs
  374. 'needsName': False, # boolean
  375. '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
  376. 'stats': [2,5,2,5], # four-integer list
  377. },
  378. {
  379. 'id': 37, #integer
  380. 'name': f"Old Lich who Wants Everyone to Stay Off Their Lawn", # formatted string
  381. 'shortname': f"lich", # formatted string
  382. 'hasMinion': False, # boolean
  383. 'potentialMinions': None # None or list of IDs
  384. 'needsName': True, # boolean
  385. '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
  386. 'stats': [4,2,6,3], # four-integer list
  387. },
  388. {
  389. 'id': 38, #integer
  390. 'name': f"Zombie Brute Squad", # formatted string
  391. 'shortname': f"zombies", # formatted string
  392. 'hasMinion': False, # boolean
  393. 'potentialMinions': None # None or list of IDs
  394. 'needsName': False, # boolean
  395. '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
  396. 'stats': [3,5,2,6], # four-integer list
  397. },
  398. {
  399. 'id': 39, #integer
  400. 'name': f"Vampire Royalty", # formatted string
  401. 'shortname': f"vampire", # formatted string
  402. 'hasMinion': True, # boolean
  403. 'potentialMinions': [33,34,35,36,37,38,40,41,42,43,44] # None or list of IDs
  404. 'needsName': True, # boolean
  405. 'note': "They have lived this long by being patient and cautious. Despite that, their minion may not be 100% loyal.", # formatted string
  406. 'stats': [4,2,5,6], # four-integer list
  407. },
  408. {
  409. 'id': 40, #integer
  410. 'name': f"Possessing Spirit", # formatted string
  411. 'shortname': f"spirit", # formatted string
  412. 'hasMinion': False, # boolean
  413. 'potentialMinions': None # None or list of IDs
  414. 'needsName': True, # boolean
  415. '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
  416. 'stats': [4,4,5,5], # four-integer list
  417. },
  418. {
  419. 'id': 41, #integer
  420. 'name': f"Vengeful Spirit", # formatted string
  421. 'shortname': f"spirit", # formatted string
  422. 'hasMinion': False, # boolean
  423. 'potentialMinions': None # None or list of IDs
  424. 'needsName': True, # boolean
  425. 'note': "It wants revenge on whatever killed it, and it's willing to play the long game to get that revenge.", # formatted string
  426. 'stats': [6,6,6,2], # four-integer list
  427. },
  428. {
  429. 'id': 42, #integer
  430. 'name': f"", # formatted string
  431. 'shortname': f"", # formatted string
  432. 'hasMinion': False, # boolean
  433. 'potentialMinions': None # None or list of IDs
  434. 'needsName': True, # boolean
  435. 'note': "", # formatted string
  436. 'stats': [,,,], # four-integer list
  437. },
  438. {
  439. 'id': 43, #integer
  440. 'name': f"Necromantic Cult", # formatted string
  441. 'shortname': f"cult", # formatted string
  442. 'hasMinion': False, # boolean
  443. 'potentialMinions': None # None or list of IDs
  444. 'needsName': False, # boolean
  445. '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
  446. 'stats': [5,5,5,5], # four-integer list
  447. },
  448. {
  449. 'id': 44, #integer
  450. 'name': f"Mummified Protector", # formatted string
  451. 'shortname': f"mummy", # formatted string
  452. 'hasMinion': False, # boolean
  453. 'potentialMinions': None # None or list of IDs
  454. 'needsName': True, # boolean
  455. '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
  456. 'stats': [5,5,4,6], # four-integer list
  457. },
  458. {
  459. 'id': 45, #integer
  460. 'name': f"Helperbot 1000", # formatted string
  461. 'shortname': f"robot", # formatted string
  462. 'hasMinion': False, # boolean
  463. 'potentialMinions': None # None or list of IDs
  464. 'needsName': False, # boolean
  465. 'note': "It's half as good as Helperbot 2000. It's more incompetent than malicious, but it will defend itself.", # formatted string
  466. 'stats': [4,2,2,3], # four-integer list
  467. },
  468. {
  469. 'id': 46, #integer
  470. 'name': f"Robot Spiders!", # formatted string
  471. 'shortname': f"spiders", # formatted string
  472. 'hasMinion': False, # boolean
  473. 'potentialMinions': None # None or list of IDs
  474. 'needsName': False, # boolean
  475. 'note': "Each Body damage kills one spider, but there may be more lurking in the walls...", # formatted string
  476. 'stats': [3,3,2,4], # four-integer list
  477. },
  478. {
  479. 'id': 47, #integer
  480. 'name': f"Spy Drones", # formatted string
  481. 'shortname': f"drones", # formatted string
  482. 'hasMinion': False, # boolean
  483. 'potentialMinions': None # None or list of IDs
  484. 'needsName': False, # boolean
  485. '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
  486. 'stats': [4,4,3,2], # four-integer list
  487. },
  488. {
  489. 'id': 48, #integer
  490. 'name': f"Supercomputer Bent on Multi-World Domination", # formatted string
  491. 'shortname': f"computer", # formatted string
  492. 'hasMinion': True, # boolean
  493. '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
  494. 'needsName': True, # boolean
  495. 'note': "It uses its minion to deal with interlopers; it's weak by itself and will try to hide its location.", # formatted string
  496. 'stats': [4,1,6,3], # four-integer list
  497. },
  498. {
  499. 'id': 49, #integer
  500. 'name': f"Weaponized Robotic Interpreter", # formatted string
  501. 'shortname': f"robot", # formatted string
  502. 'hasMinion': False, # boolean
  503. 'potentialMinions': None # None or list of IDs
  504. 'needsName': True, # boolean
  505. '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
  506. 'stats': [5,5,3,2], # four-integer list
  507. },
  508. {
  509. 'id': 50, #integer
  510. 'name': f"Robot Soldiers", # formatted string
  511. 'shortname': f"robots", # formatted string
  512. 'hasMinion': False, # boolean
  513. 'potentialMinions': None # None or list of IDs
  514. 'needsName': False, # boolean
  515. '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
  516. 'stats': [3,4,3,6], # four-integer list
  517. },
  518. {
  519. 'id': 51, #integer
  520. 'name': f"Robotic General", # formatted string
  521. 'shortname': f"general", # formatted string
  522. 'hasMinion': True, # boolean
  523. '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
  524. 'needsName': True, # boolean
  525. 'note': "It will give orders to anyone and everyone, and will inflift Brains damage if not obeyed.", # formatted string
  526. 'stats': [3,3,6,5], # four-integer list
  527. },
  528. {
  529. 'id': 52, #integer
  530. 'name': f"Rogue AI-controlled Ship", # formatted string
  531. 'shortname': f"ship", # formatted string
  532. 'hasMinion': True, # boolean
  533. '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
  534. 'needsName': True, # boolean
  535. 'note': "It's not capable of entering a gravity well.", # formatted string
  536. 'stats': [3,3,6,6], # four-integer list
  537. },
  538. {
  539. 'id': 53, #integer
  540. 'name': f"Supercomputer that Has Achieved Multi-World Domination", # formatted string
  541. 'shortname': f"computer", # formatted string
  542. 'hasMinion': True, # boolean
  543. '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
  544. 'needsName': True, # boolean
  545. 'note': "Its home system may be a Dyson sphere across which it's evenly distributed.", # formatted string
  546. 'stats': [4,3,6,6], # four-integer list
  547. },
  548. {
  549. 'id': 54, #integer
  550. 'name': f"Gray Goo", # formatted string
  551. 'shortname': f"goo", # formatted string
  552. 'hasMinion': False, # boolean
  553. 'potentialMinions': None # None or list of IDs
  554. 'needsName': False, # boolean
  555. '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
  556. 'stats': [4,6,6,4], # four-integer list
  557. },
  558. {
  559. 'id': 55, #integer
  560. 'name': f"Giant Mech", # formatted string
  561. 'shortname': f"mech", # formatted string
  562. 'hasMinion': False, # boolean
  563. 'potentialMinions': None # None or list of IDs
  564. 'needsName': True, # boolean
  565. '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
  566. 'stats': [4,6,4,6], # four-integer list
  567. },
  568. {
  569. 'id': 56, #integer
  570. 'name': f"Kobold Workers", # formatted string
  571. 'shortname': f"kobolds", # formatted string
  572. 'hasMinion': False, # boolean
  573. 'potentialMinions': None # None or list of IDs
  574. 'needsName': False, # boolean
  575. '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
  576. 'stats': [3,2,3,3], # four-integer list
  577. },
  578. {
  579. 'id': 57, #integer
  580. 'name': f"Kobold Supervisor", # formatted string
  581. 'shortname': f"kobold", # formatted string
  582. 'hasMinion': True, # boolean
  583. 'potentialMinions': [56] # None or list of IDs
  584. 'needsName': True, # boolean
  585. 'note': "They lead from a safe distance.", # formatted string
  586. 'stats': [3,2,4,3], # four-integer list
  587. },
  588. {
  589. 'id': 58, #integer
  590. 'name': f"Kobold Inventor", # formatted string
  591. 'shortname': f"kobold", # formatted string
  592. 'hasMinion': False, # boolean
  593. 'potentialMinions': None # None or list of IDs
  594. 'needsName': True, # boolean
  595. '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
  596. 'stats': [2,3,5,3], # four-integer list
  597. },
  598. {
  599. 'id': 59, #integer
  600. 'name': f"Kobold Babysitter", # formatted string
  601. 'shortname': f"kobold", # formatted string
  602. 'hasMinion': False, # boolean
  603. 'potentialMinions': None # None or list of IDs
  604. 'needsName': True, # boolean
  605. '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
  606. 'stats': [4,4,3,3], # four-integer list
  607. },
  608. {
  609. 'id': 60, #integer
  610. 'name': f"Kobold Trap Designer", # formatted string
  611. 'shortname': f"kobold", # formatted string
  612. 'hasMinion': False, # boolean
  613. 'potentialMinions': None # None or list of IDs
  614. 'needsName': True, # boolean
  615. '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
  616. 'stats': [3,5,4,3], # four-integer list
  617. },
  618. {
  619. 'id': 61, #integer
  620. 'name': f"Average Kobold", # formatted string
  621. 'shortname': f"kobold", # formatted string
  622. 'hasMinion': False, # boolean
  623. 'potentialMinions': None # None or list of IDs
  624. 'needsName': True, # boolean
  625. '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
  626. 'stats': [4,4,4,4], # four-integer list
  627. },
  628. {
  629. 'id': 62, #integer
  630. 'name': f"Kobold Sorcerer", # formatted string
  631. 'shortname': f"kobold", # formatted string
  632. 'hasMinion': False, # boolean
  633. 'potentialMinions': None # None or list of IDs
  634. 'needsName': True, # boolean
  635. '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
  636. 'stats': [3,5,4,5], # four-integer list
  637. },
  638. {
  639. 'id': 63, #integer
  640. 'name': f"Swolbold", # formatted string
  641. 'shortname': f"kobold", # formatted string
  642. 'hasMinion': False, # boolean
  643. 'potentialMinions': None # None or list of IDs
  644. 'needsName': True, # boolean
  645. '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
  646. 'stats': [3,6,3,6], # four-integer list
  647. },
  648. {
  649. 'id': 64, #integer
  650. 'name': f"Retired Kobold Adventurer", # formatted string
  651. 'shortname': f"kobold", # formatted string
  652. 'hasMinion': False, # boolean
  653. 'potentialMinions': None # None or list of IDs
  654. 'needsName': True, # boolean
  655. '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
  656. 'stats': [5,5,5,4], # four-integer list
  657. },
  658. {
  659. 'id': 65, #integer
  660. 'name': f"Kobold Adventurers", # formatted string
  661. 'shortname': f"kobolds", # formatted string
  662. 'hasMinion': False, # boolean
  663. 'potentialMinions': None # None or list of IDs
  664. 'needsName': False, # boolean
  665. '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
  666. 'stats': [5,5,5,4], # four-integer list
  667. },
  668. {
  669. 'id': 66, #integer
  670. 'name': f"Kobold Leader", # formatted string
  671. 'shortname': f"kobold", # formatted string
  672. 'hasMinion': True, # boolean
  673. 'potentialMinions': [56,57,58,59,60,61,62,63,64,65] # None or list of IDs
  674. 'needsName': True, # boolean
  675. '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
  676. 'stats': [5,5,6,4], # four-integer list
  677. },
  678. {
  679. 'id': 67, #integer
  680. 'name': f"Semi-Intelligent Metal-Eating Slime", # formatted string
  681. 'shortname': f"slime", # formatted string
  682. 'hasMinion': False, # boolean
  683. 'potentialMinions': None # None or list of IDs
  684. 'needsName': False, # boolean
  685. '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
  686. 'stats': [0,4,2,5], # four-integer list
  687. },
  688. {
  689. 'id': 68, #integer
  690. 'name': f"Floating Brain", # formatted string
  691. 'shortname': f"brain", # formatted string
  692. 'hasMinion': True, # boolean
  693. '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
  694. 'needsName': True, # boolean
  695. 'note': "It uses telepathy and telekinesis as weapons, and will send its minion in first.", # formatted string
  696. 'stats': [2,3,6,1], # four-integer list
  697. },
  698. {
  699. 'id': 69, #integer
  700. 'name': f"Thing in a Jar", # formatted string
  701. 'shortname': f"thing", # formatted string
  702. 'hasMinion': True, # boolean
  703. '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
  704. 'needsName': True, # boolean
  705. '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
  706. 'stats': [3,2,6,2], # four-integer list
  707. },
  708. {
  709. 'id': 70, #integer
  710. 'name': f"Small Alien Carnivores", # formatted string
  711. 'shortname': f"aliens", # formatted string
  712. 'hasMinion': False, # boolean
  713. 'potentialMinions': None # None or list of IDs
  714. 'needsName': False, # boolean
  715. '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
  716. 'stats': [3,5,3,3], # four-integer list
  717. },
  718. {
  719. 'id': 71, #integer
  720. 'name': f"Medium Alien Carnivores", # formatted string
  721. 'shortname': f"aliens", # formatted string
  722. 'hasMinion': False, # boolean
  723. 'potentialMinions': None # None or list of IDs
  724. 'needsName': False, # boolean
  725. '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
  726. 'stats': [3,4,4,4], # four-integer list
  727. },
  728. {
  729. 'id': 72, #integer
  730. 'name': f"Alien Researchers", # formatted string
  731. 'shortname': f"aliens", # formatted string
  732. 'hasMinion': False, # boolean
  733. 'potentialMinions': None # None or list of IDs
  734. 'needsName': False, # boolean
  735. '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
  736. 'stats': [4,4,5,3], # four-integer list
  737. },
  738. {
  739. 'id': 73, #integer
  740. 'name': f"Big-Game-Hunting Alien", # formatted string
  741. 'shortname': f"alien", # formatted string
  742. 'hasMinion': False, # boolean
  743. 'potentialMinions': None # None or list of IDs
  744. 'needsName': True, # boolean
  745. '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
  746. 'stats': [4,4,5,4], # four-integer list
  747. },
  748. {
  749. 'id': 74, #integer
  750. 'name': f"Large Alien Carnivore", # formatted string
  751. 'shortname': f"alien", # formatted string
  752. 'hasMinion': False, # boolean
  753. 'potentialMinions': None # None or list of IDs
  754. 'needsName': True, # boolean
  755. '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
  756. 'stats': [4,4,4,6], # four-integer list
  757. },
  758. {
  759. 'id': 75, #integer
  760. 'name': f"Energy Being", # formatted string
  761. 'shortname': f"being", # formatted string
  762. 'hasMinion': False, # boolean
  763. 'potentialMinions': None # None or list of IDs
  764. 'needsName': True, # boolean
  765. '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
  766. 'stats': [4,5,5,5], # four-integer list
  767. },
  768. {
  769. 'id': 76, #integer
  770. 'name': f"Hive Mind", # formatted string
  771. 'shortname': f"colony", # formatted string
  772. 'hasMinion': False, # boolean
  773. 'potentialMinions': None # None or list of IDs
  774. 'needsName': False, # boolean
  775. '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
  776. 'stats': [4,3,6,6], # four-integer list
  777. },
  778. {
  779. 'id': 77, #integer
  780. 'name': f"Ancient Engineer", # formatted string
  781. 'shortname': f"ancient", # formatted string
  782. 'hasMinion': False, # boolean
  783. 'potentialMinions': None # None or list of IDs
  784. 'needsName': True, # boolean
  785. '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
  786. 'stats': [,,,], # four-integer list
  787. },
  788. {
  789. 'id': 78, #integer
  790. 'name': f"Small Panicking Group", # formatted string
  791. 'shortname': f"people", # formatted string
  792. 'hasMinion': False, # boolean
  793. 'potentialMinions': None # None or list of IDs
  794. 'needsName': False, # boolean
  795. '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
  796. 'stats': [1,4,2,4], # four-integer list
  797. },
  798. {
  799. 'id': 79, #integer
  800. 'name': f"Refugees with Parasites", # formatted string
  801. 'shortname': f"refugees", # formatted string
  802. 'hasMinion': False, # boolean
  803. 'potentialMinions': None # None or list of IDs
  804. 'needsName': False, # boolean
  805. '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
  806. 'stats': [2,4,0,0], # four-integer list
  807. },
  808. {
  809. 'id': 80, #integer
  810. 'name': f"Perfect Storm School Field Trip", # formatted string
  811. 'shortname': f"students", # formatted string
  812. 'hasMinion': False, # boolean
  813. 'potentialMinions': None # None or list of IDs
  814. 'needsName': False, # boolean
  815. '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
  816. 'stats': [4,5,2,2], # four-integer list
  817. },
  818. {
  819. 'id': 81, #integer
  820. 'name': f"Con Artist", # formatted string
  821. 'shortname': f"con artist", # formatted string
  822. 'hasMinion': False, # boolean
  823. 'potentialMinions': None # None or list of IDs
  824. 'needsName': True, # boolean
  825. '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
  826. 'stats': [3,4,5,2], # four-integer list
  827. },
  828. {
  829. 'id': 82, #integer
  830. 'name': f"Legitimate Businessmen", # formatted string
  831. 'shortname': f"businessmen", # formatted string
  832. 'hasMinion': False, # boolean
  833. 'potentialMinions': None # None or list of IDs
  834. 'needsName': False, # boolean
  835. '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
  836. 'stats': [4,4,3,4], # four-integer list
  837. },
  838. {
  839. 'id': 83, #integer
  840. 'name': f"Agent for a 'Big Bad'", # formatted string
  841. 'shortname': f"agent", # formatted string
  842. 'hasMinion': False, # boolean
  843. 'potentialMinions': None # None or list of IDs
  844. 'needsName': True, # boolean
  845. '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
  846. 'stats': [4,4,5,3], # four-integer list
  847. },
  848. {
  849. 'id': 84, #integer
  850. 'name': f"Conspiracy Theory Survivalist", # formatted string
  851. 'shortname': f"survivalist", # formatted string
  852. 'hasMinion': False, # boolean
  853. 'potentialMinions': None # None or list of IDs
  854. 'needsName': True, # boolean
  855. '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
  856. 'stats': [4,5,3,5], # four-integer list
  857. },
  858. {
  859. 'id': 85, #integer
  860. 'name': f"Large Mob", # formatted string
  861. 'shortname': f"mob", # formatted string
  862. 'hasMinion': False, # boolean
  863. 'potentialMinions': None # None or list of IDs
  864. 'needsName': False, # boolean
  865. 'note': "Not organized protesters, but rather Black Friday shoppers, sports fans rioting, or some other less than reasonable group.", # formatted string
  866. 'stats': [2,6,4,6], # four-integer list
  867. },
  868. {
  869. 'id': 86, #integer
  870. 'name': f"Bored Trillionaire", # formatted string
  871. 'shortname': f"trillionaire", # formatted string
  872. 'hasMinion': True, # boolean
  873. '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
  874. 'needsName': True, # boolean
  875. '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
  876. 'stats': [5,5,6,3], # four-integer list
  877. },
  878. {
  879. 'id': 87, #integer
  880. 'name': f"Contrarian Politician", # formatted string
  881. 'shortname': f"politician", # formatted string
  882. 'hasMinion': False, # boolean
  883. 'potentialMinions': None # None or list of IDs
  884. 'needsName': True, # boolean
  885. '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
  886. 'stats': [5,5,6,4], # four-integer list
  887. },
  888. {
  889. 'id': 88, #integer
  890. 'name': f"Completely Normal Person Who Is Not A Murder-Bot", # formatted string
  891. 'shortname': f"person", # formatted string
  892. 'hasMinion': False, # boolean
  893. 'potentialMinions': None # None or list of IDs
  894. 'needsName': True, # boolean
  895. 'note': "It's definitely a murder-bot. It will pretend to be a helper NPC until the kobolds are vulnerable.", # formatted string
  896. 'stats': [4,6,4,6], # four-integer list
  897. },
  898. {
  899. 'id': 89, #integer
  900. 'name': f"Network Pirates", # formatted string
  901. 'shortname': f"pirates", # formatted string
  902. 'hasMinion': False, # boolean
  903. 'potentialMinions': None # None or list of IDs
  904. 'needsName': False, # boolean
  905. '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
  906. 'stats': [3,3,4,1], # four-integer list
  907. },
  908. {
  909. 'id': 90, #integer
  910. 'name': f"Pirate Mutineers", # formatted string
  911. 'shortname': f"pirates", # formatted string
  912. 'hasMinion': False, # boolean
  913. 'potentialMinions': None # None or list of IDs
  914. 'needsName': False, # boolean
  915. 'note': "The revolution was short; these are the losers. They're still pirates, but they don't have a ship... yet.", # formatted string
  916. 'stats': [2,3,3,4], # four-integer list
  917. },
  918. {
  919. 'id': 91, #integer
  920. 'name': f"Pirate Swashbuckler", # formatted string
  921. 'shortname': f"pirate", # formatted string
  922. 'hasMinion': False, # boolean
  923. 'potentialMinions': None # None or list of IDs
  924. 'needsName': True, # boolean
  925. '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
  926. 'stats': [3,4,3,3], # four-integer list
  927. },
  928. {
  929. 'id': 92, #integer
  930. 'name': f"Pirate Brute", # formatted string
  931. 'shortname': f"pirate", # formatted string
  932. 'hasMinion': False, # boolean
  933. 'potentialMinions': None # None or list of IDs
  934. 'needsName': True, # boolean
  935. 'note': "They're good at moving things and at smashing things. Moving indoors is awkward.", # formatted string
  936. 'stats': [2,5,2,5], # four-integer list
  937. },
  938. {
  939. 'id': 93, #integer
  940. 'name': f"Pirate Captain", # formatted string
  941. 'shortname': f"captain", # formatted string
  942. 'hasMinion': True, # boolean
  943. 'potentialMinions': [89,90,91,92,94,95,96,97,99] # None or list of IDs
  944. 'needsName': True, # boolean
  945. '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
  946. 'stats': [3,3,5,4], # four-integer list
  947. },
  948. {
  949. 'id': 94, #integer
  950. 'name': f"Pirate Treasure Hunters", # formatted string
  951. 'shortname': f"pirates", # formatted string
  952. 'hasMinion': False, # boolean
  953. 'potentialMinions': None # None or list of IDs
  954. 'needsName': False, # boolean
  955. '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
  956. 'stats': [3,4,4,5], # four-integer list
  957. },
  958. {
  959. 'id': 95, #integer
  960. 'name': f"Pirate Blockade Runner", # formatted string
  961. 'shortname': f"ship", # formatted string
  962. 'hasMinion': False, # boolean
  963. 'potentialMinions': None # None or list of IDs
  964. 'needsName': True, # boolean
  965. 'note': "The stats include ship and crew. For when it absolutely, positively needs to avoid tariffs overnight.", # formatted string
  966. 'stats': [4,3,5,5], # four-integer list
  967. },
  968. {
  969. 'id': 96, #integer
  970. 'name': f"Pirate Gunboat", # formatted string
  971. 'shortname': f"ship", # formatted string
  972. 'hasMinion': False, # boolean
  973. 'potentialMinions': None # None or list of IDs
  974. 'needsName': True, # boolean
  975. '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
  976. 'stats': [4,6,3,5], # four-integer list
  977. },
  978. {
  979. 'id': 97, #integer
  980. 'name': f"Pirate Flagship", # formatted string
  981. 'shortname': f"ship", # formatted string
  982. 'hasMinion': False, # boolean
  983. 'potentialMinions': None # None or list of IDs
  984. 'needsName': True, # boolean
  985. '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
  986. 'stats': [4,6,3,6], # four-integer list
  987. },
  988. {
  989. 'id': 98, #integer
  990. 'name': f"Legendary Pirate", # formatted string
  991. 'shortname': f"pirate", # formatted string
  992. 'hasMinion': True, # boolean
  993. 'potentialMinions': [89,90,91,92,93,94,95,96,97,99] # None or list of IDs
  994. 'needsName': True, # boolean
  995. '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
  996. 'stats': [4,5,6,5], # four-integer list
  997. },
  998. {
  999. 'id': 99, #integer
  1000. 'name': f"Pirate Ghost Ship", # formatted string
  1001. 'shortname': f"ship", # formatted string
  1002. 'hasMinion': False, # boolean
  1003. 'potentialMinions': None # None or list of IDs
  1004. 'needsName': True, # boolean
  1005. '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
  1006. 'stats': [6,6,5,3], # four-integer list
  1007. },
  1008. {
  1009. 'id': 100, #integer
  1010. 'name': f"", # formatted string
  1011. 'shortname': f"", # formatted string
  1012. 'hasMinion': False, # boolean
  1013. 'potentialMinions': None # None or list of IDs
  1014. 'needsName': True, # boolean
  1015. 'note': "", # formatted string
  1016. 'stats': [,,,], # four-integer list
  1017. },
  1018. {
  1019. 'id': 101, #integer
  1020. 'name': f"", # formatted string
  1021. 'shortname': f"", # formatted string
  1022. 'hasMinion': False, # boolean
  1023. 'potentialMinions': None # None or list of IDs
  1024. 'needsName': True, # boolean
  1025. 'note': "", # formatted string
  1026. 'stats': [,,,], # four-integer list
  1027. },
  1028. {
  1029. 'id': 102, #integer
  1030. 'name': f"", # formatted string
  1031. 'shortname': f"", # formatted string
  1032. 'hasMinion': False, # boolean
  1033. 'potentialMinions': None # None or list of IDs
  1034. 'needsName': True, # boolean
  1035. 'note': "", # formatted string
  1036. 'stats': [,,,], # four-integer list
  1037. },
  1038. {
  1039. 'id': 103, #integer
  1040. 'name': f"", # formatted string
  1041. 'shortname': f"", # formatted string
  1042. 'hasMinion': False, # boolean
  1043. 'potentialMinions': None # None or list of IDs
  1044. 'needsName': True, # boolean
  1045. 'note': "", # formatted string
  1046. 'stats': [,,,], # four-integer list
  1047. },
  1048. {
  1049. 'id': 104, #integer
  1050. 'name': f"", # formatted string
  1051. 'shortname': f"", # formatted string
  1052. 'hasMinion': False, # boolean
  1053. 'potentialMinions': None # None or list of IDs
  1054. 'needsName': True, # boolean
  1055. 'note': "", # formatted string
  1056. 'stats': [,,,], # four-integer list
  1057. },
  1058. {
  1059. 'id': 105, #integer
  1060. 'name': f"", # formatted string
  1061. 'shortname': f"", # formatted string
  1062. 'hasMinion': False, # boolean
  1063. 'potentialMinions': None # None or list of IDs
  1064. 'needsName': True, # boolean
  1065. 'note': "", # formatted string
  1066. 'stats': [,,,], # four-integer list
  1067. },
  1068. {
  1069. 'id': 106, #integer
  1070. 'name': f"", # formatted string
  1071. 'shortname': f"", # formatted string
  1072. 'hasMinion': False, # boolean
  1073. 'potentialMinions': None # None or list of IDs
  1074. 'needsName': True, # boolean
  1075. 'note': "", # formatted string
  1076. 'stats': [,,,], # four-integer list
  1077. },
  1078. {
  1079. 'id': 107, #integer
  1080. 'name': f"", # formatted string
  1081. 'shortname': f"", # formatted string
  1082. 'hasMinion': False, # boolean
  1083. 'potentialMinions': None # None or list of IDs
  1084. 'needsName': True, # boolean
  1085. 'note': "", # formatted string
  1086. 'stats': [,,,], # four-integer list
  1087. },
  1088. {
  1089. 'id': 108, #integer
  1090. 'name': f"", # formatted string
  1091. 'shortname': f"", # formatted string
  1092. 'hasMinion': False, # boolean
  1093. 'potentialMinions': None # None or list of IDs
  1094. 'needsName': True, # boolean
  1095. 'note': "", # formatted string
  1096. 'stats': [,,,], # four-integer list
  1097. },
  1098. {
  1099. 'id': 109, #integer
  1100. 'name': f"", # formatted string
  1101. 'shortname': f"", # formatted string
  1102. 'hasMinion': False, # boolean
  1103. 'potentialMinions': None # None or list of IDs
  1104. 'needsName': True, # boolean
  1105. 'note': "", # formatted string
  1106. 'stats': [,,,], # four-integer list
  1107. },
  1108. {
  1109. 'id': 110, #integer
  1110. 'name': f"", # formatted string
  1111. 'shortname': f"", # formatted string
  1112. 'hasMinion': False, # boolean
  1113. 'potentialMinions': None # None or list of IDs
  1114. 'needsName': True, # boolean
  1115. 'note': "", # formatted string
  1116. 'stats': [,,,], # four-integer list
  1117. },
  1118. {
  1119. 'id': 111, #integer
  1120. 'name': f"", # formatted string
  1121. 'shortname': f"", # formatted string
  1122. 'hasMinion': False, # boolean
  1123. 'potentialMinions': None # None or list of IDs
  1124. 'needsName': True, # boolean
  1125. 'note': "", # formatted string
  1126. 'stats': [,,,], # four-integer list
  1127. },
  1128. {
  1129. 'id': 112, #integer
  1130. 'name': f"", # formatted string
  1131. 'shortname': f"", # formatted string
  1132. 'hasMinion': False, # boolean
  1133. 'potentialMinions': None # None or list of IDs
  1134. 'needsName': True, # boolean
  1135. 'note': "", # formatted string
  1136. 'stats': [,,,], # four-integer list
  1137. },
  1138. {
  1139. 'id': 113, #integer
  1140. 'name': f"", # formatted string
  1141. 'shortname': f"", # formatted string
  1142. 'hasMinion': False, # boolean
  1143. 'potentialMinions': None # None or list of IDs
  1144. 'needsName': True, # boolean
  1145. 'note': "", # formatted string
  1146. 'stats': [,,,], # four-integer list
  1147. },
  1148. {
  1149. 'id': 114, #integer
  1150. 'name': f"", # formatted string
  1151. 'shortname': f"", # formatted string
  1152. 'hasMinion': False, # boolean
  1153. 'potentialMinions': None # None or list of IDs
  1154. 'needsName': True, # boolean
  1155. 'note': "", # formatted string
  1156. 'stats': [,,,], # four-integer list
  1157. },
  1158. {
  1159. 'id': 115, #integer
  1160. 'name': f"", # formatted string
  1161. 'shortname': f"", # formatted string
  1162. 'hasMinion': False, # boolean
  1163. 'potentialMinions': None # None or list of IDs
  1164. 'needsName': True, # boolean
  1165. 'note': "", # formatted string
  1166. 'stats': [,,,], # four-integer list
  1167. },
  1168. {
  1169. 'id': 116, #integer
  1170. 'name': f"", # formatted string
  1171. 'shortname': f"", # formatted string
  1172. 'hasMinion': False, # boolean
  1173. 'potentialMinions': None # None or list of IDs
  1174. 'needsName': True, # boolean
  1175. 'note': "", # formatted string
  1176. 'stats': [,,,], # four-integer list
  1177. },
  1178. {
  1179. 'id': 117, #integer
  1180. 'name': f"", # formatted string
  1181. 'shortname': f"", # formatted string
  1182. 'hasMinion': False, # boolean
  1183. 'potentialMinions': None # None or list of IDs
  1184. 'needsName': True, # boolean
  1185. 'note': "", # formatted string
  1186. 'stats': [,,,], # four-integer list
  1187. },
  1188. {
  1189. 'id': 118, #integer
  1190. 'name': f"", # formatted string
  1191. 'shortname': f"", # formatted string
  1192. 'hasMinion': False, # boolean
  1193. 'potentialMinions': None # None or list of IDs
  1194. 'needsName': True, # boolean
  1195. 'note': "", # formatted string
  1196. 'stats': [,,,], # four-integer list
  1197. },
  1198. {
  1199. 'id': 119, #integer
  1200. 'name': f"", # formatted string
  1201. 'shortname': f"", # formatted string
  1202. 'hasMinion': False, # boolean
  1203. 'potentialMinions': None # None or list of IDs
  1204. 'needsName': True, # boolean
  1205. 'note': "", # formatted string
  1206. 'stats': [,,,], # four-integer list
  1207. },
  1208. {
  1209. 'id': 120, #integer
  1210. 'name': f"", # formatted string
  1211. 'shortname': f"", # formatted string
  1212. 'hasMinion': False, # boolean
  1213. 'potentialMinions': None # None or list of IDs
  1214. 'needsName': True, # boolean
  1215. 'note': "", # formatted string
  1216. 'stats': [,,,], # four-integer list
  1217. },
  1218. ]