Does anyone have an ACKS bestiary spreadsheet to help with utility development?

Hello all,

I’m putting together a game map, campaign tracker and encounter generator in Python and although I found an old Bestiary spreadsheet by Alex, I just discovered how badly out of date it is. I’d love to get my hands on a new one if possible. Has anyone put one together?

Ultimately, I’d like to release the Python scripts openly and they’re set up so that DMs (with Python on their iPads) can customize their map, locations and NPCs pretty easily. There is a pic of what I’m doing on the G+ page.

Thanks and all the best,


Hmm. I transcribed monster wilderness lair entries up through Leech, Giant into a custom table format I was using (with number in lair, guard animals, and treasure types), but I never finished. See

CGeist7: Wow, that looks impressive. How much of it is iPad-specific - are you mostly making calls to a Python package for the iOS bits or?

jedavis: Neat! Downloaded.

I’d just started working on a Perl (ancient magicks!) CGI app so that I could click on a terrain/area type and get back a possible wilderness encounter.

I’m tempted to try and decipher Python, but I almost feel my time would be better spent filling out the rest of your monstertables file and hoping a generator magically appears :slight_smile:

Mmm, CGI scripts. Web-frontending these is one of those “I should really do this, but I really don’t know how / want to” sort of tasks. Was sort of looking at learning Flask (python lightweightish web framework), but given that they’re CLI scripts CGI or inetd probably wouldn’t be bad ways to go either.

My recollection of perl was “fun, but I can’t remember the syntax between projects so I end up relearning it every time”. Python’s mostly pretty straightforward to read (though there is one really grubby bit in my henchman generator that involves partially-applying functions… debugging that taught me not to do it again).

Any assistance in monster transcription would be greatly appreciated! I have a mostly-done script that takes the monsters table and another input file specifying the encounter tables for a terrain-type and stocks hexes of that terrain; I really just need to get the input files done and than it should be close to good-to-go. The logic is simple; the data is where the real work is.

Well then! I shall reschedule my lunch-hour-time-wasting.

Is the terrain types somewhat malleable/definable/expandable in your script? I’d envisioned doing my encounter tables by “area” (close to this lake, over here by those mountains, in this valley of horrors) rather than by generic topographical feature.

Mine wasn’t gonna be pretty :slight_smile: A button per terrain type/area to click and that’d POST to the script which then just dumps text output to the browser.


It’s been a while since I worked on it, but if memory serves, the terrain description file contained the number of lairs per hex (from the old ‘searching wilderness hexes’ thread) and then a transcription of the wilderness encounter table for that terrain from the back of the book (pretty close to the table format used in monster/treasuretables, but a little bit lighter-weight; the script sort of merges the monster table and the terrain description into one master table in memory at runtime). I don’t think I hard-coded much of anything in that would preclude higher degrees of geographic specification, which was a capability I wanted to have for a Western-Marches-like game I was planning.

That seems a reasonable approach. Will think on this further.

Foosh. Well, that escalated quickly. I got to the “Men” entry before word came down we were getting out early, so I’m abandoning my lunch hour :slight_smile:

Here’s what I’ve done, hopefully it’s not totally messed up.

females were 1d410 per 20 lizardmen, eggs 2d410 per 20 lizardmen, took the average, not sure how to express

Lizardman village of: [LizardmanEnc*1d10]. Ruled by chieftain(, shaman L1d6)%0.75(, witch-doctor L1d4)%0.50. /
Also has +125% females and +250% eggs.

Lizardman warband of 2d4d8 lizardmen plus 1d8 champs and subchief, treasure [L]

Lair of 1d6 giant draco lizards

Lounge of 1d3 giant draco lizards

Lair of 1d6 giant gecko lizards

Lounge of 1d3 giant gecko lizards

Lair of 1d6 giant horned chameleon lizards

Lounge of 1d3 giant horned chameleon lizards

Lair of 1d6 giant tuatara lizards

Lounge of 1d3 giant tuatara lizards

Lair of 1d4 werebears, treasure [L]

Sloth of 1d4 werebears

Lair of 2d4 wereboars, treasure [J]

Herd of 2d4 wereboars

Lair of 2d6 wererats, treasure [G]

Plague of 2d6 wererats

Lair of 1d4 weretigers, treasure [J]

Troop of 1d4 weretigers

Lair of 2d6 werewolves, treasure [J]

Route of 2d6 werewolves

Lair of 1d4 manticores, treasure [K]

Wing of 1d4 manticores

Herd of 2d8 Mastodons, 2 tusks each worth 2d4*100gp

Lair of 1d4 medusa, half-petrified treasure [H]

Coven of 1d4 medusa

Berserker Lair of: [BerserkerEnc*1d8]. Ruled by 4th level fighter with Berserkergang proficiency

Berserker warband of 1d6d8 berserkers, treasure [J]

Brigand Camp of: [BrigandEnc*2d6]. Ruled by brigand captain 9th level fighter, plus 1 5th level fighter for every 2 warbands(,8th level cleric)%.3(,Mage L8+1d2)%.5.

Brigand Band of: [BrigandGang*1d10]. Led by 4th level fighter and two 2nd level fighters, armed with longswords, lances, plate armor, mounted on medium warhorses with chain barding

not sure how to do OR

BrigandGang of 2d4 brigands(, armed with short sword and short bow, leather armor and shield)%.5(, armed with long swords, chainmail, shields, and light warhorses)%.5.

Pirate Island of: [PirateEnc] (,chaotic-aligned buccaneers attacking anyone)%.7(,neutral privateers attacking ships under flag of their nation’s enemies)%.3.

#stopped here

Couple questions -

How would you express the Lizardman female/egg-per-lizardman entry (which would extend to the Brigands lieutenant-per-2-warbands thing)

How would you do an OR expression, the first example being the Brigands, who have a 50% chance to be armed in any given way?

Is “subroutining” the Brigands like that (because of the extra per-gang detail) legal?

I get the feeling that Pirates should be broken out into each fleet type?

Would you rather I skip the complicated ones, since there may be code decisions involved?

Looks good from here. I handle xor by making another table; something like

7: chaotic-aligned buccaneers attacking anyone
10: neutral privateers attacking ships under flag of their nation’s enemies

And then the PirateLair entry becomes Island of [PirateAlignment], [PirateEnc] or something similar. I think I did this with the guardbeasts for giants. Flavor of pirate encounter would make another good subtable.

Yes, infinite bandit-subroutining / recursion to arbitrary depth is totally supported. Take a look at the treasure tables for better examples.

The only one of those that I don’t handle is the lizardman females/eggs thing. Basically the system I’ve built is a non-deterministic context-free grammar; I don’t have any means of looking either forward or back through an entry as it’s being generated. You might look at some of the other humanoids to see what I’ve done there; I think I may have some that are just “and 150% females and 200% young”. It would be possible to do a second pass over the output to handle these sorts of things, but it wouldn’t be clean, pretty, or portable across domains (treasure vs monsters) on top of the current setup. Mostly I’ve just been riding on the fact that most of these dependencies are in females and young, and therefore not that interesting.

(The other place a mechanism like this would be useful would be in handling generation of sentient magic items; currently I can’t do that cleanly, because IIRC it back-references the weapon’s bonus for the percent chance of sentience and Ego and whatnot).

Oh, I see, the concern about bandits was with the extra detail for running each gang separately. Yeah, I haven’t yet figured out the best way to handle deep humanoid/demihuman nesting with detail; I think there’s going to be some level of usability testing and personal preference involved. It should be relatively easy to build another table with less detail for humanoid lair-subunits once we have the initial high-detail version done, and then let folks choose whichever they prefer.

Wow, guys! This is awesome! I’m super glad I asked the question. Jedavis - the stuff you were working on was great. I hadn’t started on spells or proficiencies yet, but they were on my list, so this will save me a bunch of time.

Koewn: the latest scripts I’ve been working on are all iPad specific, but they are super easy to port into a standard pygame format - which actually runs much smoother. I had a hell of a time configuring the map to update properly when everything was running at 60fps. :slight_smile:

I exported Alex’s old Bestiary spreadsheet to a CSV document from which I derive a dictionary of monster attributes that I pass to the main Map script. I haven’t tackled the multiple terrain features yet, but I was considering either setting a few terrain layers or putting a switch at the top of the map that would let the GM select the terrain before or after an encounter is generated.

I’ll update my files on GitHub and any advice would be fantastic. One caveat though - I’m damn new at Python (2 months) and Web-taught, so this stuff is probably messy as hell. :frowning:

Here’s a sample of my encounter output:


Giant, Hill
Enc. Die.: 2
Enc. Pips: 4
% In Lair: 25%
Alignment: Chaotic
Movement: 120’ (40’)
Armor Class: 5
Hit Dice: 8
Pips: 0
Attacks: 1
Damage: 2d8
Save: F8
Morale: 0
Treasure Type: XVIII + 5,000 gp
XP: 560

Map Encounter:

You have encountered 4 (25%) Giant, Hill (27 yards away).
They are not surprised (5).Their attitude is: (9) Indifferent.
Al: Chaotic, Move: 120’ (40’) Alt: , AC: 5, HD: 8
HP: [34, 38, 44, 35]
Atk: 1, Dam: 2d8
Save: F8, Morale: 0, Treasure: XVIII + 5,000 gp, XP: 560

Ooh, auto-generating encounter distance is a good idea. That’s one of those fiddly bits that we haven’t managed to use in play because we never want to look it up.

I created a massive Google spreadsheet to support 6-mi hex lair generation. Some of the monster entries are customized due to house rules, such as using aging instead of level-drain in my campaign.

jedavis, you’re welcome to take a look if you like. Just drop me a line.

Google’s security options leave something to be desired when trying to grant access to a spreadsheet while still keeping it from being edited, so I’m not quite ready to open it up to the community. Likely, I’ll rewrite the front end in a programming language and then release it here and in the G+ community.

Finished transcription of lairs, uploaded hex-filling script. Should be able to generate both random wilderness encounters and fully-stocked hexes. Turned out the version that ran on the terrain description file was older and not recursive; this version consults a transcription of page 244-248’s tables and does a lookup on a hardcoded “number of lairs per hex by terrain type” table. Easy enough to modify either of those to support custom terrains, though.

Both of your project’s are exciting. The next step in my HexPop lair creation was going to be to make a text front end, and then from there, I was planning to create a visual random hex regional generator that would be fully stocked with lairs and derived wandering monster tables per hex. Looks like you guys are going to beat me to it. Can’t wait!

For the lizardmen I took the average roll for females and eggs, turned that into a percentage.

I’d seen what you’d had already for the XOR operation, just didn’t put two and two together on that one :slight_smile: I’ll proceed that way with those sorts of things then.

Agreed! All of this is super cool. :slight_smile:

My map script is pretty much done in its basic form right now. I’ve spend the past few days updating it to use Malo’s accurate monster tables and to tighten some of the scripting. The little Legion token now actually sticks in its bloody hexes! I’ve posted an update to the google+ group for anyone interested.




Brigand Camp of: [BrigandEnc*2d6]. Ruled by brigand captain 9th level fighter, plus +50% 5th level fighters,8th level cleric)%.3(,Mage L8+1d2)%.5.

Brigand Band of: [BrigandGang*1d10]. Led by 4th level fighter and two 2nd level fighters, armed with longswords, lances, plate armor, mounted on medium warhorses with chain barding

BrigandGang of 2d4 brigands armed with [BrigandArms]

1: short sword and short bow, leather armor and shield
2: long swords, chain, shields and light warhorses

Pirate Island of: [PirateEnc]

Fleet of [PirateShips] of [PirateType]

1: Fleet of 2d4 river boats with 4 sailors per ship, treasure [L]
2: Fleet of 1d3 large galleys with 20 sailors, 50 marines, 180 slave rowers per ship, treasure [O]
3: Fleet of 1d6 small galleys with 10 sailors, 20 marines, 60 slave rowers per ship, treasure [L]
4: Fleet of 1d3 war galleys with 30 sailers, 75 marines, 300 slave rowers per ship, treasure [O], [L]
5: Fleet of 1d4 longships with 75 sailor-marines per ship, treasure [O]
6: Fleet of 1d4 large troop transports with 20 sailors, 50 marines per ship, treasure [O]
7: Fleet of 1d6 small troop transports with 12 sailors, 25 marines per ship, treasure [O]

7: chaotic buccaneers attacking any and every ship
10: neutral privateers, attacking ships under flag of their nation’s enemies

Merchants have treasure per 10 wagons, not sure how to handle

Merchant caravan of: 1d4*10 wagons drawn by 4 heavy draft horses each, +50% merchants riding medium horses, armed with chain, crossbows, and daggers. +200% 1st level fighters led by +20% 3rd level fighters on medium riding horses, armed in chain, swords, crossbows, and daggers. 1 5th level fighter guard captain armed in plate, sword, crossbow, dagger. Riding and draft animal types may vary based on terrain. Treasure [J]*10.

Camp of: [NomandEnc * 2d6]. Ruled by an 8th level fighter with +25% 5th level fighters(,9th level cleric)%.5(,8th level mage)%.25(, and 4d6 trained hunting dogs)%.7. There are +100% adult non-combatants, and +200% children.

Caravan of: 1d4*10 nomads. Led by one 4th level fighter with 2 2nd level fighters, wearing [NomadArmor] and armed with short swords and daggers. Half have composite bows and light riding horses, the remaining half have lances and ride light warhorses. Leaders carry lance and bow, lamellar armor, and ride light warhorses. Treasure [E]

5: leather
8: chain
10: lamellar

Village of: [MermenEnc * 2d20]. Lead by a 4HD merman(, and protected by 3d6 giant fish, usually rockfish)%.7. +100% mermaids and +100% young inhabit the village.

Band of: 1d20 mermen. Lead by a merman of 2HD.

Lair of: [MinotaurEnc * 1d8], treasure [L], [G]

Warband of: 1d6d8 minotaurs.

Village of: [MorlockEnc]. Led by chieftain with AC4, 3HD, 15HP(, and protected by 3d6 trained white apes)%.75. Also has +100% femails and +100% young.

Morlock warband of 1d8 gangs (each d6 morlocks plus champ) led by subchief, treasure [E]

Herd of 2d6 mules

Tomb of 1d12 mummies, treasure [N]*2

Horde of 1d12 mummies

Village of: [NeanderthalEnc*1d6], led by chieftan with 6HD, +2 damage.(,protected by 3d6 trained white apes)%.75. Also +100% women and +200% children. Treasure [E]

Band of 1d10d10 neanderthals. Led by champion, AC2, 3HD, 15HP.

Grove of: [DryadEnc*1d6] dryads, treasure [D]

Solitary dryad.

Watery lair of: [NaiadEnc*2d20] naiads, treasure [D]

Solitary naiad.

Pod of 1d2 giant octopi

Village of: [OgreEnc*1d10]. Led by chieftain with AC7, 8+2HD, 45 HP, 2d6+1 giant club or +4 damage with mansized weapons. 2d6 females (fight as bugbears) and +40% young (fight as goblins). (2d8 prisoners kept for slaves/food)%.30, (shaman of L1d4)%.50, (witch doctor L1d2)%.25.

Ogre warband of 1d3 gangs (each d6 ogres plus champ) led by subchief, treasure [L]

Ogre village of: [OrcEnc*1d10]. led by chieftain with Ac6, 4HD, 20HP, +2 damage. +100% females (fight as goblin) and +200% young. +10$ prisoner/slaves., (1d4+1 ogres)%.5, (1d4 trolls)%.25, (shaman L1d6)%.75, (witch doctor L1d4)%.5.

Orc warband of 2d6 gangs (each 2d4 orcs plus champ) led by subchief, treasure [G]

Den of 1d4 owlbears, treasure [I]

Sloth of 1d4 owlbears.

Nest of 1d12 pegasi.

Flight of 1d12 pegasi.

Den of 1d4 phase tigers, treasure [K]

Clowder of 1d4 phase tigers

Flight of 2d4 pterodactyls.

Flight of 1d4 pteranodons.

Herd of 1d4 purple worms, treasure [P], [P]

Remorhaz, multuple Treasure entries per HD value, per remorhaz. May split as Roc?

Colony of 3d6 remorhaz, treasure special.

Herd of 1d5 remorhaz, treasure special.

Den of 1d6 giant rhagodessa, treasure [I]

Cluster of 1d6 giant rhagodessa

Herd of 1d12 rhinoceros.

Herd of 1d8 woolly rhinoceros.

Aerie of 1d12 small rocs, (1d6 eggs)%.5, (1d4 young)%.5, treasure [I], [M]

Flight of 1d12 small rocs.

Aerie of 1d8 small rocs, (1d6 eggs)%.5, (1d4 young)%.5, treasure [K], [P]

Flight of 1d8 small rocs.

Aerie of 1d2 giant rocs, (1d6 eggs)%.5, (1d4 young)%.5, treasure [M], [P]

Solitary giant roc.

Brood of 5d4 rot grubs.

Den of 1d4 rust monsters.

Pack of 1d4 rust monsters.

Nest of 2d4 flame salamanders, treasure [Q].

Swarm of 2d4 flame salamanders.

Nest of 1d3 frost salamanders, treasure [Q].

Band of 1d3 frost salamanders.

Nest of 1d6 giant scorpions.

Scourge of 1d6 giant scorpions.

Swarm of 2d6 sea serpents, treasure [M], [I], inside bellies.

Haunt of 1d12 shadows, treasure [B].

Horde of 1d12 shadows.

Shiver of 3d6 bull sharks.

Shiver of 2d6 mako sharks.

Shiver of 1d4 great white sharks.

Boneyard of 3d10 skeletons.

Horde of 3d10 skeletons.

Den of 1d4 skittering maws, treasure [M]

Shiver of 1d4 skittering maws.

Quiver of 1d6 spitting cobras.

Nest of 1d6 pit vipers.

Den of 1d8 sea snakes.

Den of 1d3 giant pythons.

Den of 1d4 giant rattlers.

And missed the part where you finished them up :slight_smile:

Nevermind :slight_smile:

Thanks! These are looking good!

I feel bad about not alerting more verbosely :frowning: Sorry about that. But yeah, it’s feature-complete for the core functionality at this point; there’s definitely some rearchitecting I’d like to do, for things like “I want to generate down to the HP of individual goblins in individual gangs of warbands in villages, and then selectively display the information I care about.” Flat-text, while easy to work with and match with regex, is really a limitation whend dealing with nested structures like humanoid org charts that contain more information than anyone wants to see at any given time.