Print Page

Tuesday, July 28, 2015

Reroll a Room in DunGen

This evening, before getting into the relationships, I did a minor feature. There is now a button in the node dialog box in DunGen that will reroll the contents of the room.

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

One place I want to go with DunGen is to have a listing of relationships between monster groups, probably initially seeded into the Notes field. The plan is to keep a side list of each monster type generated, its level and numbers. Using that info and the intelligence score and tags in the monster type objects, and possibly some die rolls, determine general attitude of the groups to be "enemy", "ally", or "neutral" and whether one side is dominant or the relationship is "mutual" or roughly in balance, and how complex the relationship can be, based on the INT scores. That yields a pool of appropriate relationship phrases that might fit, and choose one of those at random with one side as the subject, and maybe another going the opposite way.  If the subject side of the sentence is a singleton creature, use the single_text, otherwise the plural_text for the verb phrase. Possibly place some relationships relative to creatures in deeper or shallower levels that are "off-map".

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.

    { 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

+Thaumiel Nerub has drawn some amazing maps from DunGen results. Check them out on his Crypt of Rabies blog.
Cult Caves

Map to Necropolis

Kobolds Dungeon

+Sherief Gaber posted ideas on G+ for what tunnel wolves are that goes way beyond my original "um,  like wargs, but in dungeons" conception.

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...

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

This station has some gaming background music potential.

Came across it in iTunes Internet Radio under Classical.

The iTunes blurb points to their Facebook page:

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

Just a couple small changes this time - it's surprising how long a small change can take to code.

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!

So now you can set it up for a Goblin Cave with Water Features (for example) with minimal effort. I'd tweak these results a bit after generation before running a game, but the raw results are getting pretty good and focused.

1: DenHook: symbolic item of clothing
2: Vast cavernTs: 1 x 300 GP gem, 1 x 200 GP gem
3: Bridge across underground riverA mummified creature
4: Underground riverbankA 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 caveA wind rises as PCs enter, blowing the furnishings their way
6: Bridge across underground riverM: 1 vituperative goblin
M: 2 wary giant ticks
7: IntersectionM: 1 bitter hobgoblin
Ts: 1 x 2000 GP gem, 1 x 600 GP gem
Mg: Staff of Wizardry
Mg: Potion of Flight
8: IntersectionM: 1 tunnel wolf
Ts: 1 x 300 GP gem, 9 gold
Hook: rare trade goods
9: Cave inM: 2 tunnel wolves
Ts: Ring worth 329 GP, 109 silver
Mg: Staff of Three Spells
10: FountainM: 1 satiated goblin
Ts: Vessel worth 720 GP
Mg: Dagger +1, 
11: DenHook: mosaic floor
12: IntersectionM: 2 goblins
13: Underground river fordA sundered shield
M: 3 starving tunnel wolves
Ts: 1225 silver
Mg: Ring of Fire Resistance
14: IntersectionM: 3 goblins
M: 2 hobgoblins
Ts: 2196 silver, 878 silver
Mg: Book
15: Fortified cavernM: 3 orcs
16: LandingM: 8 dissolute goblins
17: Boneyard caveA burning brazier
18: Branching caveTp: open pit, triggered by a bound spirit
Ts: 100 silver, 60 silver
19: AquaductEmpty
20: ChasmTp: portcullis trap
Ts: 1 x 600 GP gem, 1 x 100 GP gem
Hook: map showing a secret path
21: MoatTp: 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 cavern7: Intersection to 15: Fortified cavern
well12: Intersection to 15: Fortified cavern
pit14: Intersection to 15: Fortified cavern
channel19: Aquaduct to 12: Intersection
scree slope in cavern20: Chasm to 15: Fortified cavern
partial cave-in5: Boneyard cave to 14: Intersection
subterranean river17: Boneyard cave to 15: Fortified cavern
winch over cliff ledge10: Fountain to 14: Intersection
streambed2: Vast cavern to 17: Boneyard cave
partial cave-in6: Bridge across underground river to 5: Boneyard cave
ledge21: Moat to 20: Chasm
vent8: Intersection to 14: Intersection
shaft13: Underground river ford to 15: Fortified cavern
underground stream18: Branching cave to 10: Fountain
underground stream4: Underground riverbank to 19: Aquaduct
flooded passage1: Den to 20: Chasm
chasm ledge path9: Cave in to 19: Aquaduct
well16: Landing to 8: Intersection
narrow tunnel3: Bridge across underground river to 7: Intersection
subterranean river11: Den to 9: Cave in

Sunday, July 12, 2015

Dyson's Mapper contest colored map with room numbers

Check out this page of Dyson's:

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

There are two bugs that I know of currently: The Redraw button used to work before the library update but does not work now for me, and I see "novice adventurer" listings with both the base level 1-2s and the next tier up that should just say "adventurer".

Sunday, July 5, 2015

Not yet burnt out on DunGen programming

Though probably getting close to setting it aside again while I do some other things...

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!

Now you can click the Theme button, pick some tags for monster types you are looking for and it will bias monster selection in favor of monsters that match that set of tags.

Friday, July 3, 2015

DunGen Import/Export

Added the most primitive possible Import/Export feature that addresses the basic problem. It consists of a text area and two buttons at the bottom of the window. Scroll down to find them.

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

What's new?
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.

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.

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.

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.