Tuesday, July 28, 2015
Reroll a Room in DunGen
Rerolling labels will probably come along soon, as well as some node styling options, like color and shape, maybe some icon art.
Starting on relationships in DunGen - data table for a feature in progress
I haven't got into coding the selection yet, but here is the initial version of the data table, which will certainly grow but is enough to start coding against the next time I work on this. It includes some tags that seemed appropriate at the time but may get trimmed for lack of usefulness in the code. Suggestions for additions are welcome.
relationships:[
{ plural_text: "ally with", single_text: "allies with", min_subject_int: 6, min_target_int: 6, tags: ['mutual','ally','neutral']},
{ plural_text: "are in service to", single_text: "is in service to", min_subject_int: 6, min_target_int: 8, tags: ['subordinate','ally']},
{ plural_text: "are planning to ambush", single_text: "is planning to ambush", min_subject_int: 8, min_target_int: 6, tags: ['subordinate','dominant','mutual','enemy']},
{ plural_text: "are planning to raid", single_text: "is planning to raid", min_subject_int: 8, min_target_int: 6, tags: ['subordinate','dominant','mutual','enemy']},
{ plural_text: "avoid", single_text: "avoids", min_subject_int: 2, min_target_int: 0, tags: ['subordinate','enemy']},
{ plural_text: "appease", single_text: "appeases", min_subject_int: 8, min_target_int: 6, tags: ['subordinate','enemy']},
{ plural_text: "band together with", single_text: "bands together with", min_subject_int: 6, min_target_int: 6, tags: ['mutual','ally','neutral']},
{ plural_text: "command", single_text: "commands", min_subject_int: 6, min_target_int: 6, tags: ['dominant','ally']},
{ plural_text: "fear", single_text: "fears", min_subject_int: 3, min_target_int: 0, tags: ['mutual','subordinate', 'enemy']},
{ plural_text: "fight in the warband of", single_text: "fights in the warband of", min_subject_int: 6, min_target_int: 8, tags: ['subordinate','ally']},
{ plural_text: "prey upon", single_text: "preys upon", min_subject_int: 0, min_target_int: 0, tags: ['dominant', 'predatory']},
{ plural_text: "hunt", single_text: "hunts", min_subject_int: 0, min_target_int: 0, tags: ['dominant', 'predatory']},
{ plural_text: "overran", single_text: "overran", min_subject_int: 0, min_target_int: 0, tags: ['dominant', 'predatory','mass']},
{ plural_text: "control", single_text: "controls", min_subject_int: 8, min_target_int: 0, tags: ['dominant', 'ally','enemy']},
{ plural_text: "enslave", single_text: "enslaves", min_subject_int: 8, min_target_int: 5, tags: ['dominant', 'enemy']},
{ plural_text: "keep hostages from", single_text: "keeps hostages from", min_subject_int: 8, min_target_int: 7, tags: ['dominant', 'neutral', 'ally', 'enemy']},
{ plural_text: "trade hostages with", single_text: "trades hostages with", min_subject_int: 8, min_target_int: 8, tags: ['neutral', 'ally', 'enemy']},
{ plural_text: "demand the service of", single_text: "demands the service of", min_subject_int: 8, min_target_int: 6, tags: ['dominant', 'ally','neutral']},
{ plural_text: "displaced", single_text: "displaced", min_subject_int: 0, min_target_int: 0, tags: ['dominant', 'predatory','mass']},
{ plural_text: "fend off", single_text: "fends off", min_subject_int: 8, min_target_int: 6, tags: ['subordinate','mutual','enemy']},
{ plural_text: "fight", single_text: "fight", min_subject_int: 8, min_target_int: 6, tags: ['subordinate','mutual','enemy']},
{ plural_text: "fortify against", single_text: "fortifies against", min_subject_int: 8, min_target_int: 0, tags: ['subordinate','mutual','enemy']},
{ plural_text: "give succor to", single_text: "gives succor to", min_subject_int: 6, min_target_int: 6, tags: ['dominant','mutual','ally']},
{ plural_text: "hate", single_text: "hates", min_subject_int: 6, min_target_int: 0, tags: ['mutual','subordinate', 'enemy']},
{ plural_text: "hide from", single_text: "hides from", min_subject_int: 2, min_target_int: 0, tags: ['subordinate','enemy']},
{ plural_text: "intimidate", single_text: "intimidates", min_subject_int: 3, min_target_int: 0, tags: ['dominant','neutral', 'enemy']},
{ plural_text: "loathe", single_text: "loathes", min_subject_int: 6, min_target_int: 6, tags: ['mutual','dominant', 'enemy']},
{ plural_text: "plot against", single_text: "plots against", min_subject_int: 8, min_target_int: 6, tags: ['subordinate','mutual','enemy']},
{ plural_text: "make signs against", single_text: "makes signs against", min_subject_int: 8, min_target_int: 0, tags: ['subordinate','mutual','enemy']},
{ plural_text: "run from", single_text: "runs from", min_subject_int: 2, min_target_int: 0, tags: ['subordinate','enemy']},
{ plural_text: "retreat from", single_text: "retreats from", min_subject_int: 2, min_target_int: 0, tags: ['subordinate','enemy']},
{ plural_text: "serve", single_text: "serves", min_subject_int: 6, min_target_int: 8, tags: ['subordinate','ally']},
{ plural_text: "sacrifice to", single_text: "sacrifices to", min_subject_int: 6, min_target_int: 0, tags: ['subordinate','ally','appeasing']},
{ plural_text: "trade with", single_text: "trades with", min_subject_int: 6, min_target_int: 6, tags: ['mutual','ally','neutral']},
{ plural_text: "tax", single_text: "taxes", min_subject_int: 8, min_target_int: 7, tags: ['dominant','ally','neutral']},
{ plural_text: "take succor with", single_text: "take succor with", min_subject_int: 6, min_target_int: 6, tags: ['subordinate','mutual','ally']},
{ plural_text: "tred carefully around", single_text: "treds carefully around", min_subject_int: 6, min_target_int: 0, tags: ['mutual', 'subordinate', 'neutral', 'enemy', 'appeasing']},
{ plural_text: "will alert", single_text: "will alert", min_subject_int: 6, min_target_int: 6, tags: ['mutual','subordinate','ally']},
{ plural_text: "venerate", single_text: "venerates", min_subject_int: 7, min_target_int: 9, tags: ['subordinate', 'ally', 'neutral']},
{ plural_text: "worship", single_text: "worships", min_subject_int: 6, min_target_int: 6, tags: ['subordinate', 'ally']},
{ plural_text: "were displaced by", single_text: "was displaced by", min_subject_int: 3, min_target_int: 0, tags: ['subordinate','enemy']}
],
Tuesday, July 21, 2015
DunGen users are coming up with some cool stuff
Cult Caves
Map to Necropolis
Kobolds Dungeon
DunGen: update, crowdsourcing, plans
Did a content update in DunGen last night. Among other things it expanded the list of NPC classes, while stacking additional weighting on the base Fighter, Mage, Cleric & Thief so they will still be the most frequent and Fighter the most frequent among them. The broader list may include classes not present in a campaign, so replace as needed. Small code change to split the attitude from 50 - 50 with and without for monster groups to 1/3 blank, 1/3 group attitude, 1/3 one of the group has the attitude.
Added a few entries to each of several lists: monsters, attitudes, magic items, magic weapon and armor powers, rooms, paths, oddities.
Tonight I added a search and replace Re-skinner so you can generate a dungeon, see that it filled it with, say, snakes and say, "No, I want Cosmic Rutabagas as the common monster for this level" and make that change throughout. Its also handy if you want to replace or remove the M: or Ts: labels, or use the GP abbreviation in place of the word gold, etc.
It's pushed to Github and deployed.
Crowdsourcing - an experiment
I have some factions that generate NPC lists: Adventurers, Cultists, Overlord
Here is the progression list for the Overlord faction:
1 Underling
2 Minion
3 Evil Henchman
4 Villainous Lieutenant
5 Villain
6 Evil Overlord
Well, actually in the app, they are all lowercase...
What would be another good faction to add? Faction name plus step names. Tags from the theme box if you want...
Plans
Roughly short to long term...
Monster relationships
A feature I want to do is to keep a side list internally of all generated monsters, and have the generator dice up some entries for monster relationships to add to the notes field, things like "The goblins avoid the ogres", "The cultists worship the dragons", "The werewolf preys upon the hobgoblins", "The giants are preparing to raid the surrounding countryside" and "The wights serve a specter in a deeper level of the dungeon", basically combining subject, relationship verb phrase, and object with a bit of intelligence about probable power hierarchy so the combinations mostly make sense.
Name Generator
Name generation is another thing on the list, probably a Markov chain generator that strings together syllables drawn from several lists, possibly with tags added to monster entries for which phoneme list they'd use. Is this a good thing, a bad thing, or something that should have an on/off toggle?
The wilderness still needs work but I'm not feeling strongly about what to tackle next there.
Politics Generator
Tony Bath style politics generator - I've done this using dice in a past campaign, and Vis.js graphing should work well to show relationships between groups and people. Major figures and groups get statted out politically, on scales like Flexibility, Loyalty, Resources, Activity, Aggressiveness, and Honesty, and relationship edges between them can be scored for intensity and type of emotion that flesh them out in ways that help a GM decide whether they take actions and what actions they would take. Would need some good generation of names of people, offices, and groups. Probably also assign character classes and levels to some political actors, but that is secondary in this kind of modelling. This might feed into a time-stepping simulation mode where at each interval NPCs are rolled for to see whether they take an action and what action they take and if it is off-camera, what the effect is, shifting relationships, offices and resource/power levels. The GM would have the power to fiddle the results, especially to include PC action effects, but it would generate a sort of campaign setting chronology of background events.
Mapless Content lists for phones
Mobile content list only - build an option to hide the graph when on mobile, so it can be used handily as a contents generator on a phone without the animated graph getting in the way. Possibly just showing the list above the graph would do it so you don't have to scroll down to the graph. The iPhone button to go to easy reading mode kind of covers this. Will have to see it on an Android phone to see if a similar function is already built in there. If so, no real need...
Content generator for map images
A different form of mapping - this one is still a fuzzy vision. I'd like to make it easy to connect drawn maps to generated listings. Probably this means a UI to load a map image, drag room numbers over it, and then generate content for each room number. Save the relative coordinates of the room numbers to the map image for redisplay. With a tiling offset and rotational offset function it could consume geomorphs like those at Dave's Mapper. With a record of where the connector points are, it could consume my pseudo-geomorphs that try to add interest in arrangement by not exactly aligning entrances. It might require hosting a server to store the coordinate lists for images.
Monday, July 20, 2015
More Epic Radio
http://more-epic.playtheradio.com
Came across it in iTunes Internet Radio under Classical.
The iTunes blurb points to their Facebook page:
https://www.facebook.com/MoreEpicRadio
and to a YouTube address that I'd have to parse out from the run-together text, but EpicJenny is in there.
Saturday, July 18, 2015
DunGen in the Afternoon
Finally fixed the NPC levels bug, so you won't see 4th level novice adventurers any more.
It's old school, so there really ought to be a wandering monsters list. Now a dungeon starts with one in the notes field, its length scales with the number of nodes.
....
One last feature for the day - adding templates to monsters. If undead, demon, or devil is in the selected tags, some other monsters will pick up a templating adjective and become "undead gnolls" or "demonic lizards". The "undead" triggers on a roll of 1 or 2, "demonic" and "infernal" on a 1 each, but are mutually exclusive and exclusive with "dragon", so you can have an "undead demonic giant" but not a "demonic infernal orc" or "demonic adult dragon".
DunGen now has themes for places and paths!
Location | Description |
---|---|
1: Den | Hook: symbolic item of clothing |
2: Vast cavern | Ts: 1 x 300 GP gem, 1 x 200 GP gem |
3: Bridge across underground river | A mummified creature |
4: Underground riverbank | A broken helm M: 5 irritated tunnel wolves Ts: 14 x 50 GP gem, 640 gold, 42 platinum Mg: Scroll with one holy spell |
5: Boneyard cave | A wind rises as PCs enter, blowing the furnishings their way |
6: Bridge across underground river | M: 1 vituperative goblin M: 2 wary giant ticks |
7: Intersection | M: 1 bitter hobgoblin Ts: 1 x 2000 GP gem, 1 x 600 GP gem Mg: Staff of Wizardry Mg: Potion of Flight |
8: Intersection | M: 1 tunnel wolf Ts: 1 x 300 GP gem, 9 gold Hook: rare trade goods |
9: Cave in | M: 2 tunnel wolves Ts: Ring worth 329 GP, 109 silver Mg: Staff of Three Spells |
10: Fountain | M: 1 satiated goblin Ts: Vessel worth 720 GP Mg: Dagger +1, |
11: Den | Hook: mosaic floor |
12: Intersection | M: 2 goblins |
13: Underground river ford | A sundered shield M: 3 starving tunnel wolves Ts: 1225 silver Mg: Ring of Fire Resistance |
14: Intersection | M: 3 goblins M: 2 hobgoblins Ts: 2196 silver, 878 silver Mg: Book |
15: Fortified cavern | M: 3 orcs |
16: Landing | M: 8 dissolute goblins |
17: Boneyard cave | A burning brazier |
18: Branching cave | Tp: open pit, triggered by a bound spirit Ts: 100 silver, 60 silver |
19: Aquaduct | Empty |
20: Chasm | Tp: portcullis trap Ts: 1 x 600 GP gem, 1 x 100 GP gem Hook: map showing a secret path |
21: Moat | Tp: slippery oil trap, triggered by weight M: 1 mushroom man Ts: 700 silver, Tiara worth 63 GP Mg: Scroll of spells Hook: map to deeper level |
scree slope in cavern | 7: Intersection to 15: Fortified cavern |
well | 12: Intersection to 15: Fortified cavern |
pit | 14: Intersection to 15: Fortified cavern |
channel | 19: Aquaduct to 12: Intersection |
scree slope in cavern | 20: Chasm to 15: Fortified cavern |
partial cave-in | 5: Boneyard cave to 14: Intersection |
subterranean river | 17: Boneyard cave to 15: Fortified cavern |
winch over cliff ledge | 10: Fountain to 14: Intersection |
streambed | 2: Vast cavern to 17: Boneyard cave |
partial cave-in | 6: Bridge across underground river to 5: Boneyard cave |
ledge | 21: Moat to 20: Chasm |
vent | 8: Intersection to 14: Intersection |
shaft | 13: Underground river ford to 15: Fortified cavern |
underground stream | 18: Branching cave to 10: Fountain |
underground stream | 4: Underground riverbank to 19: Aquaduct |
flooded passage | 1: Den to 20: Chasm |
chasm ledge path | 9: Cave in to 19: Aquaduct |
well | 16: Landing to 8: Intersection |
narrow tunnel | 3: Bridge across underground river to 7: Intersection |
subterranean river | 11: Den to 9: Cave in |
Sunday, July 12, 2015
Dyson's Mapper contest colored map with room numbers
I only got a few rooms actually keyed so far, but did spend about an hour applying room numbers, so if that step will help some other folks start keying, here's that version of the map:
I'll post my key once I either finish and use it or run out of steam. I'm using DunGen to help move me along.
Tuesday, July 7, 2015
Bug Hunting in DunGen
Sunday, July 5, 2015
Not yet burnt out on DunGen programming
Today I put in a first cut at Wilderness style monster distribution, and got in another feature I have wanted to start - NPC detailing (individual class, level, and attitude for an initial set of monster types), and treasure scaling for DMs who find my basic treasure roller too generous or stingy for their campaign. Also a few more monsters in yesterday's Wilderness list, and some tweaks to the dungeon monsters list. Treasure generation was really buggy there for awhile today, but I seem to have sorted that out.
Now that theming and basic NPCs are in place, I need to actually start using it to populate a campaign and see how it feels in practice.
Example of a Wilderness graph with location 2 selected:
I'll probably adjust the wilderness distribution to be a bit less biased in favor of lowbies, as right now the level of each is the lower of two 1D6 rolls, so there are a LOT more 1sts than 6ths.
To Do list:
Wilderness customized tables for location details and traps & keep tweaking places and monsters
Names and physical descriptions for NPCs and some monsters
Names for wilderness places
Customized demon and devil characteristics - individuals and groups
Customized dragons and giants
Add your own list of monster types to include in the theme dialog
Maybe some other sort of custom monster generation
Maybe some tying of wilderness creatures to favored locations
Theme tags for dungeon locations and theme selection for locations like that for monsters
Fill in some of the magic item tables - books in particular don't actually specify what they do.
Possibly tweak treasure gen some more.
Add a control to scale magic item frequency relative to treasure amount.
Add personal magic items for levelled NPCs
Add color/shape selection to location dialog and edge dialog
Some sort of keeping track of creatures placed in generation and putting in initial relationship between groups into the notes field.
Give cities a similar treatment to the wilderness once naming and some rules for linking a place with typical inhabitants is in place, probably with a bit more coherence regarding grouping things into districts, naming places, etc.
Possibly a no graph mode for easy generation of lists on a phone during a session.
Possibly a more conventional map mode
Let me know if any of these appeal as things you would like to see sooner rather than later.
Saturday, July 4, 2015
DunGen now has monster themes!
Friday, July 3, 2015
DunGen Import/Export
The export button dumps the JSON data structure into the text area. You can copy from there to an email and send it to yourself or a friend, and paste from the mail into DunGen there and hit Import to load up the dungeon.
You can edit a bit on the field to experiment with things like colorizing edges and nodes. But be careful not to break the data structure if you want to import.
After importing, give it a name and save it to your browser's local storage to access it again.
DunGen goes Mobile
Upgraded DunGen from vis.js 3.6 to 4.4 today. Thanks, Almende devs. Vis.js on GitHub, it's awesome! They do all the graphical and animation heavy lifting in my app. I just hook it up with a bunch of random generation tables. There is more to do to take full advantage of the new version, but it is now working and the edit tools work on both computer browsers and mobile (tested from my Android tablet). This closes one of the big gaps in DunGen. It means anywhere I have WIFI, I can edit dungeons on the tablet.
I'm so excited. The upgrade was suprisingly easy. They did a good job with console hints and docs to get through the basics of adapting to the new API.
Coming up...
There's a lot to do now on two major fronts. 1) Data portability, and 2) Themed dungeon generation.
Portability
It needs some solution for accessing stored dungeons from more than one device, so one edited on a computer can be used on another or a tablet at the game table. This probably means a server and either accounts or tokens. Accounts means having to deal with basic security, password retrieval, etc. Blah. A token solution, where it saves with an identifier and anybody that knows the identifier can retrieve the record, is a bit more awkward in one way, but may be easier for sharing. The other option is a file export/import scheme where you mail a copy of the dungeon around. Not sure how that would work on an iPhone though, which doesn't give convenient file system access and it would be awkward to edit from different machines and keep track of which one has the latest "truth". Export/import would have an advantage in editability as long as the file format is human readable, since editing could be done in any text editor and then reimported.
Themes
I want to make use of all the tagging I did of monsters to allow for customized generation by themes: the cultists in their Temple or the Necropolis full of undead, with a dialog to list tags to include, and constrain the generator to roll only or mainly things that have one of the selected tags.
Once that is working, I go through all the node and edge templates (maybe magic items too?) and set up tagging for them, so the places can fit the theme as well and the critters.
Later...
Small content expansion happens whenever I think of something else to add to tables, but after the big things are handled, the next up is probably to expand on some of the NPCs and more intelligent monsters so they generate with names, and are more fleshed out with descriptive text and some loose stat guides or OSR compatible stats.
Wednesday, July 1, 2015
Zombie Dungen
Awakened my Dungen pointcrawl dungeon generator from its deadly slumber with an update tonight. So what's new?
I finished the notes field that saves with the graph and the contents table. So now there is a place for a GM using it to add free form notes for use in running a game from the page.
The top part above the graph was rather cluttered, so I cleaned it up. Removed some stuff, moved some more. Settled on holding the table of dungeon contents in one place, below the graph, which gives more room for the graph itself. But to allow for navigating past the graph in mobile, where the graph eats swipes, I added a couple buttons for moving around as a first cut at navigating.
Next up is graph editing on mobile, since the vis.js graph library has a version out to support it. That will be a bit more challenging, since the library has some breaking changes in its API and data structures involved in fixing things like that. A quick glance at their release notes suggests it may be a longer session to bring in the new version and update to use it.