Print Page

Tuesday, December 1, 2015

Annoying Magic Items

Tonight, while digging for other things, I came across a sheet of paper with a list of mostly flawed magic items I wrote out in one of those silly DM moments. Apologies if this is an inadvertent reblog.

Con-man Sword I10 E12, no other powers but talking, pretends it can Detect Slopes, Traps, Gold, Gems.

Potion of Levitation without vertical hold, you rise and rise until it runs out.

Magic Sword which drains XPs you would normally gain upon killing the monster.

Telepathy Crown which warns the opposition.

Horn of Plenty yielding Spam.

Sword of Chaos- Powers change with each being slain, shapeshifts. Needs a powers table or just roll on the magic swords table each time.

Lightning Whip - hit self on fumbles.

Addictive Potions - probably of Healing

Lightning Wand with a short. 1/6 chance of self zapping.

Coin-op magic sword - pay to play. +1 bonus for a GP for 1D6 rounds of combat, or make it eat a platinum or gem and give it a higher bonus.

Defective Portable Hole, eats stuff on 1/6, or 1/3 if really fritzing out.

Strength Potion - Adrenalin-like with power rush and weakening crash after duration runs out

Flying carpet with a penchant for acrobatics.

Animated shoes

Dragon gecko - changes when it hiccups.

Items which convert H.P. to spell levels.

Casting amulets give a bonus to casting rolls. - huh, a normal one slipped in...

Hangman's Rope - The rope is thick and coarse, its rough fibers make it painful to grip. It has a noose at one end, caked in brown, flaking blood.  It has a pompous magic activation phrase ", It is thy day to die." If no name is mentioned in activation,  it randomizes among all beings within 30'. Its reach is 30'. It uncoils quickly and moves fast, striking in a single round, hitting on 8+ on D20. Dex save on D30 to dodge. It jerks the victim from the ground and hangs him for 2D6 damage in the first round and 1D6 each subsequent round, AC 2 and 20 HP that will heal at the next new moon. All attacks or other action rolls by the hanging victim are at -2. If found enshrined, there will be an archaic inscription near it that tells a story of a hanging that includes the magic phrase: "Spake the Charnel Lord: ABROM! It is thy day to die. And the Hangman's Rope did lift the man to kick and jerk his life away. Eyes burst from their sockets, black tongue bit half through, he was dropped to earth and given to its cold embrace."

and... a couple of house rules ideas:

Impediment by weapons - can carry/wear 3 hands worth okay, -1 Dex and To Hit for each further. Alternative to detailed encumbrance, would need more when packing a lot of loot/provisions.
Daggers count 1/2 hand
Handaxes 1/2 hand
Shortbow 1 hand
Longbow 2 hands
Light crossbow 1 hand
Heavy crossbow 2 hands
Most shields 1 hand.
Large, heavy shields 2 hands.
Other weapons 1 or 2 hands as needed to wield them

A casting variant for semi-Vancian magic, where most spells are memorized to be reasonably reliable and safe, but others can be cast in a crunch. This was with an INT or WIS roll to cast. Pretty close to what was in my previously blogged 80s OD&D campaign house rules.

Casting unmemorized spells
-2/level of spell on casting roll
Caster takes 1 hit point of damage taken per level of spell attempted
Wipes memory of equivalent in spell levels.

Casting beyond listed number of spells for that level (Crashing for power):
Casting Roll modified as above for unmemorized spell.
Caster takes 1 hit point/ level for the attempt if casting roll failed.
Caster takes 1d6 damage per spell level if successful.

Preparation -
Gain up to 1D6 bonus on chance, rolled secretly by ref at 1 point per full turn of preparation with expenditure of 1 GP worth of magical supplies/turn/level of spell



Thursday, November 19, 2015

Thugs and Ruffians

I'm at the tail end of a cold that kept me home a couple days. Looking forward to going back to work tomorrow. Whiled away some of the time painting and G+ chatting with some other minis painters in a chat organized by Kurtus Brown, muting my mic when the coughing got bad.

 Here are the guys I took from about halfway to pretty much finished in chat sessions. Also did some putty filling on the GW Oculus and sculpting stonework on a tower wrapped around a cocoa mix can. I'll show those pieces later. They're propped against the palette here to face them up into the light to cut down on shadows. They'll get a spray coat this weekend and then I need to pick out a skirmish set of rules to try with them and some older ones.



Sunday, November 15, 2015

Campaign surroundings for the dungeon, UI and data structures, urk...

The idea that some of the NPCs with places of origin in their names should share home towns weaves outward in interesting ways. With templating, it will be pretty easy to have a fair amount of description generated for each place, at least a size, and a label like village, town, city, settlement, etc. Distance and direction could be feasible, though with direction comes the need to discover how close coastlines are in each direction. Governance quality, notable figures,  economy... it starts to feel like campaign gen. Going whole hog, this would be the time to start developing the social/political network graphs, and try out the VisJS hierarchical graphing mode for some of them. And if  doing any of that, even just place names, it needs to have a way to save and reuse the lists so that the places used for naming NPCs met in the first level of a megadungeon are also used for the deeper levels, though it might be good to have some NPCs in deeper levels come from farther afield. If another dungeon is in the same campaign, it should have an overlapping set.

So far multilevel dungeons have been an implied feature, you can generate a set at different levels of opposition, and put in save names with the names matching but L1, L2, L3 or "the castle", "the pits", "the tombs" appended or some such to see in the select menu that they are related, and edit in level linkages into nodes or room descriptions. With at least NPC hometowns being shared, the saved data structure to fit the needs mentioned above starts to look like we build more than one data structure, dungeonLevel, dungeon, and world, or we build a nested data structure, a world contains dungeons and places, and possibly places are nested like dungeons, if some are taking their names from towns and some from higher levels of political organization, like kingdoms or regions. There either needs to be a way to load in starter lists to save and reuse or an editor list view that lets a DM replace random people and place names with names from the campaign. The reskinning tool can help at the current level of complexity, but there is a point at which the data flips the presentation from map of level plus room list plus free form notes field to something a bit more organized, where you can oversee and edit the various lists. The design tension is between making the additional features convenient, and not detracting from the convenience of the basic generation controls currently always at the top, map, lists, & notes.

Another area I've been muddling over using templating for is dungeon history. Pick an age since it was started, who dug or initially populated it, and if it is old enough, a brief narrative cycle of replacement, invasion, magical accident, corruption, etc that fits it with the current occupants. This could be a good source of room names in DunGen and of creatures, traps, hooks, and oddities for both DunGen and DunMap. Digressing, maybe there should also be a list of mundanities to go with the oddities, so that food stores, furniture, spare weapons, etc get more of a mention in room listings. DunMap, especially could use some of these scene setting items to replace implied atmospherics of the node labels. Anyway, potted history is more for the whole dungeon than dungeon level, but some could be done by level, perhaps with an evolving model kind of like Tony Dowler's How to Host a Dungeon. If actually building a megadungeon, it could even all be generated at one go, starting with a name and saving levels as you go, ending up with a hierarchical menu where each entry at the first level is a dungeon name and dungeon levels are nested.

So, yeah, that's at least another year's worth of stuff to do, aside from features like cultural name lists, theming on the remaining stocking lists, drawing and rescanning maps, adding graphical icons to the node style options, wikifying the stocking lists, intelligent magic items...

Postscript: Realized after posting that the natural presentation of the megadungeon is a graph of the levels and their connections in DunGen, and a classic side view with the level nodes placed on it in DunMap.

Saturday, November 14, 2015

NPC names with the new template system

I will be uploading today's version of DunGen & DunMap in a few minutes. A few days ago I uploaded the version that plugged in a dungeon name at the top of the Notes field using it. Today, I'm adding an upgrade to NPC naming that uses it. There will still be a couple more passes at least on naming to

  1. Improve the way the actual proper names of people and places are being generated from a simple one from list A and one from list B initial system, and possibly differentiate them.
  2. Store a set of place names early in the process so some can be reused by more than one NPC.
  3. Add more to the nicknames list. Found some nice historical viking and medieval ones on the web today and put a lot of the less raunchy ones in.
  4. Maybe add a way for users to plug in character and place source names so they fit their campaign a priori rather than after editing. This would probably go a separate entry for user preferences in LocalStorage, so you only have to do it  once per device (since I am not ready to deal with the concept of accounts and persistent server side storage for this project).
I'm really enjoying the nested templating and have more uses for it in mind than I have time to implement.

Wednesday, November 11, 2015

A Very Meta Random Dungeon Generation Post

Nothing to show for it yet, but I just achieved a milestone. Got my recursive string insertion templating function working. So I can pass it a string now that has sets of templating handlebars in it, calling functions inside, whose results could be other randomly generated string that have other handlebars, and it keeps calling and replacing until the whole thing is a resolved string. This means I can now do tables that have lookups inside of entries, and get the kind of effect the random generation wikis like Abulafia get for interesting merged results. It's much simpler that serious templating engines, but designed to be just what I need, and I can grow it as necessary.

So now I am writing some of those tables & functions to test it out in actual use, not just tests. I'm starting with a set of tables and functions to generate Swords & Sorcery trope dungeon/scenario names. The nice thing is the functions and lists that go inside the insertion marks will be usable as parts for naming other things.

I hope to have some results to show tomorrow night.

Tuesday, November 10, 2015

Add Your Maps to DunMap

DunMap loads maps from the URL text field, but it also has a list in the code that populates the select menu next to the field for convenience, and a randomly selected one from the list is loaded with the web page, both by filling in that field. Currently it holds maps I drew and a couple from the British Library expired copyright images collection. If you have some maps you made posted online that you would like included in the selector, leave a comment on this post, ideally with a short title for each under about 40 characters and the URL. Or you can provide a page URL that shows maps with titles and I can copy titles and image URLs there. I will NOT download your map and store it, it is yours to host. I will add an entry to this list in the JavaScript of DunMap to link it from your site:

var imageArray= [
  ["Select a map",""],
  ["EA: Megadungeon Level 1","https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwv5YNWmYJOge5lqI5MUMKgEd-G6nTweH6rkD7-FcdpoL4ukT3qMUGn9f716bJMR497cPZKUcJRXwibZlVU_GMfeecA1bAkPcSTr30xCpCvkcYA87BVDfd4K4xtqh4JTEzAT0Z2W_gmn4/s1600/Level1.png"],
  ["EA: Great Hall","https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpUl5WRPk6aK4dyL-ZrmBpo7cCq_-HQmngMDlVYvll46jucGrCmAMEoS7MUTXVzK_vQtQxKGXKkieaMg14ddBjNeW9pcr1K2nJIhrXnDUFkYdz5H675Wqzxg2VgEbv8kEyeTUFw1FEjWs/s1600/great+hall-partially+edited.png"],
  ["EA: Shadowkarst", "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFJQ0epAZYPOOHEwDIG5QpDRsspWJOzPgFwJopc_j69c-PxTIENMLlzlS2XJDTgDm9-ZUkxI9cMrJH4d8m9mYJ0EoL_k7gKoy7pzwVHhOr8NY49xkkzgmRMqbFlUlrDaH4Db73r__XMxM/s1600/Shadownkarst.png"],
  ["EA: The Devil's Staircase", "https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc5d_8FIqDI5Jp426m18eME1fgQiHBIauP4M4ZVlyM82WV51whzJ8G4nQUtzFDzh_xO9iBn0XWbZ-4kJInjDTN8ZiNimDgJUg1MAz-7yxSwLXiQayxE0NpWvNcM89PX9M02ZWVleDJ8eY/s1600/devils_staircase.png"],

... etc


Please only submit maps that you have stably hosted and not likely to get stuck for exceeding bandwidth caps. I don't yet have code in place to retry if maps fail to load in.

Also tell my how you want your name and blog or source site listed in Image Credits section. I plan to prefix all titles in the menu with initials that key down to an entry in the Image Credits.

Please don't send me a link to a Pinterest or other collection of maps you found on the internet. This is opt-in by the map creators only. You can opt out again at any time and I'll remove links in the next release.

Monday, November 9, 2015

DunMap & Dave's Mapper

I had fun after work playing with Dave's Mapper to generate and export maps and then importing them into DunMap.  It's a good combo. I recommend doing smallish dungeons, anything from 0 x 1 up to 2 x 2 with edges and corners, from one artist or a couple that have similar background hatching styles.

Another Dungeon Map

This one was mostly about playing with a jagged line. I like this graph paper, except the blue lines are so dark they are hard to filter out without messing up the black. Anyway, its more fodder for DunMap.



Saturday, November 7, 2015

DunMap now has my map collection

Today I fixed the map canvas to 1200 x 1200 px so the numbers stay in place at reloads. With a fixed size, centered image, and square shape, I should be able to allow for rescaling to other sizes and still keep the numbers in the right rooms.

 But perhaps more importantly, I added my whole collection of maps to a menu so there is an easy access collection of maps to populate. If other map makers want some or all of their maps to be added, I'll expand the menu.

Fixed Wandering monsters and relationships note in DunMap. Went with a simpler generation of a bigger set of WMs at the beginning and adding relationships to the bottom of the note as rooms are added. This might split up the relations above and below hand entered notes, but that should not be too much of a problem, since most nodes will be added at the beginning.

Added font size and color adjustments to the Style dialog.

Added a button to lock out addition of nodes by stray clicks.


DunMap

Thursday, November 5, 2015

DunGen and DunMap

Hm, I seem to have broken the layout of DunGen inadvertently so the graph is overlaying everything else. Probably a CSS change for DunMap that leaked. Gotta fix that.

On the bright side, I have save and restore working in DunMap, was going back to see if the little mod I had to do in DunGen's save list handling broke anything when I found the graphical weirdness.


A bit later...
Fixed the overlay bug. Save and restore doesn't place the markers right if the window, and thus the canvas, change size. Will need to work out the right solution. Probably record the rect, and apply a transform when placing the markers again. Or need to make that canvas window size independent.

Back to the checklist (what's left now)
  1. Add a select menu of map names with stored URLs so you don't have to go hunting all the time. Considering offering to list maps by other people in a hierarchical by person's name menu, including maps by people that opt in. Use a random choice from the menu as the map at load time for variety.
  2. Change oddities and hooks to use theme tagging, so that retaining Theme is not useless with room names gone. Also good for DunGen.
  3. Maybe come up with a toggle to include room names in descriptions? They can be evocative, but will be wrong a lot when tied to a map, so may not be worth including.
  4. Thinking about save and restore- The canvas sizes are currently based on the window, but they need to be independent and recorded in a save so that at reload the points end up over the same map features. Will go to square canvases (or image based shape) with centered maps, put in a canvas resize, and record the canvas size in the DG.data and use it in the load of a saved map. Stop worrying about the key being visible.
  5. Toggle button
  6. Column widths
  7. Grow wandering monsters and relation lists as nodes are added. Check monsterlist in theme for a related bug due to not initializing with a batch of rooms.



Wednesday, November 4, 2015

DunMap WIP trial release

Got a lot in tonight. There is enough there to be buggy fun to play with.  You can lay in nodes on top of the map without raising exceptions. The map even scales to fit.

Re-evaluating the checklist.
  1. The edit vs use toggle mentioned above. (Naw, it can wait a bit)
  2. Hide the save and load controls - they don't work correctly yet, and I don't want it saving partial records I'd have to deal with.
  3. Remove the button for dungeon size, since generating out of place nodes that you have to drag is more work for the user than just clicking in the right places.
  4. Move and rename the load button next to the input box for the URL. 
  5. Add a map to load at start so it doesn't initialize to a blank screen.
  6. Add a bit of explanatory How To text.
  7. Set defaults on node shape, size and color that are better for maps.
  8. Table column widths, since the labels are narrower when just numbers. (it can wait a bit)
  9. A link to DunMap from DunGen.  (it can wait a bit)
  10. SetBaseMonsters and monsterSourceList need redefinition when no rooms are being initialized at start.  (Moved the calls around a bit, working now).
Good enough, I'm uploading now. http://meta-studios.com/dg/dunmap.html

 Save map image with numbers applied by screenshot and copy out the text in the table if you want to keep anything, like in the early days of DunGen.

DunMap - What's Necessary?

I got node placement by clicking on the map working this morning. Next up is a control to toggle between a placing & dragging mode and a locked mode so stray clicks don't festoon the map with extra nodes.

So what is needed before I do a first release?
  1. The edit vs use toggle mentioned above.
  2. Hide the save and load controls - they don't work correctly yet, and I don't want it saving partial records I'd have to deal with.
  3. Remove the button for dungeon size, since generating out of place nodes that you have to drag is more work for the user than just clicking in the right places.
  4. Move and rename the load button next to the input box for the URL. 
  5. Add a map to load at start so it doesn't initialize to a blank screen.
  6. Add a bit of explanatory How To text.
  7. Set defaults on node shape, size and color that are better for maps.
  8. Table column widths, since the labels are narrower when just numbers.
  9. A link to DunMap from DunGen.
  10. SetBaseMonsters and monsterSourceList need redefinition when no rooms are being initialized at start.
  11. I'm probably forgetting something....



Shortly after initial release:
  1. Record the node position in the data object for each node, prep for making save work again. And update at every move.
  2. Record the current map URL in the data object for the graph. More prep for save and restore.
  3. Change save and restore to use namespaced LocalStorage objects, probably prefix the dungeon name with DM-, so they can be recognized relative to any other LocalStorage objects available on the page and only actual dungeon listings go into the select box. Show the save/load controls again.
  4. Add a select menu of map names with stored URLs so you don't have to go hunting all the time.
  5. Change oddities and hooks to use theme tagging, so that retaining Theme is not useless with room names gone. Also good for DunGen.
  6. Maybe come up with a toggle to include room names in descriptions? They can be evocative, but will be wrong a lot when tied to a map, so may not be worth including.
  7. Thinking about save and restore- The canvas sizes are currently based on the window, but they need to be independent and recorded in a save so that at reload the points end up over the same map features.

Tuesday, November 3, 2015

DunMap Proof of Concept

Does not save, still very rough, but... Fuck Yeah!  Now, off to work and back to this tonight.



Working on DunMap

Nothing to show yet on the map loading version of DunGen, but I have a name for it. Figured out so far how to draw into the canvas of the network, but that ends up on top and gets blown away instantly, so I figure I have to underlay a second canvas with the image, using Z-index, and find out how to make the background of the network graph transparent. Found the controls to turn off zoom and drag of the network, so the nodes should stay where they are put over the image.

So things are being a bit more difficult than I imagined, but I'm moving forward again. If this doesn't work out this way, I've been looking at the API and examples for leaflet.js, that does Google maps style tiled and zooming maps with markers. But those get to be big collections of preprocessed tiles at different zoom levels, so I'd need to use it in the load one image without zoom fashion, since I want to be able to load images from all over, and lay markers over them.

Postscript: I set the background color of the body tag to see if the graph canvas is transparent already. It is! Also, in trying the image load yesterday I noticed that Dyson's image URLs end in some GET arguments:   ? width = x height =y  I tried dropping the height and changing the width and it still got the image with it's scaling set by the width. I guess either Wordpress or a plugin to it has a feature to rescale images based on those arguments. That could be quite useful.

Wednesday, October 28, 2015

DunGen variant concept - Stock a Map

So, let's say you want to use DunGen to generate a dungeon key for a map you already have. There is a digital version of the map on a website like this blog or Dyson's or Matt's. What do you have to do currently? You first probably need to get out a graphics program and put numbers onto the map and save it. Then go into DunGen and set the size of the map to something close to the highest number on the map. Then add or subtract nodes until it matches. It doesn't really matter what the connecting edges are, since you are only interested in the node list. Then copy out the node table to a word processor file, maybe also copy out the notes field for the wandering monsters, relationships and any other notes you added. Edit nodes either before or after copying. Then paste the edited image into the file, and you have your dungeon scenario. It's a bit, um, tedious.

Here is what the experience could be:
You find a map you like, right click the image and copy the URL to it. You bring that back to DunGen and click a button for "Stock a Map" or something like that. The UI rearranges a bit, the current network clears, and you have a field to paste the URL in. Paste in, maybe hit a button, and the map image loads into the app. For my own maps, and maybe other map makers that opt in, there could be a select menu to just pick the map to use. Click a button for Place Nodes. Click onto each map feature that you want to be a numbered feature. As you click, it starts creating nodes, probably just showing room numbers in a small label initially, so as not to obscure the artwork. The node list fills in below the map image. When you are done, you can click that button again, which now says "Stop placing nodes", and then you can drag nodes around like usual. The nodes stay where you put them unless you move them. Reroll or edit nodes as necessary. When you save the dungeon, it remembers where you put the nodes and the URL of the map, along with the usual contents. When you load it, it sets back up the way you left it. There is no edge list, since the map image shows you everything you need to know in that regard. Seems to me this is about the easiest possible way to assemble a scenario  for a nice map in a hurry. The main downside would be that it does not store the map, so it if disappears from that URL, you would have to repoint it at another copy to see the map image again.

Maybe after awhile, there is an export to PDF that makes a PDF document of the map, key, and notes, in version 2 or 3 of the feature.

I've been mulling around an extraction from the app that would do this, and figuring it would be a moderately heavy project to learn what I needed about HTML5 Canvas to do everything needed to pull it off. Today I had a bit of an epiphany when I realized that the Vis.js library can do this for me, if I turn off the physics, use nodes as the labels, and make a graph without edges. I just have to write the rather small routine to put in the background image, change what gets created and stored (X,Y coordinates, map URL and scaling, etc, and change a bunch of settings. Not sure yet if it would be better to do it as a separate application webpage, or as a mode in the current one that you toggle into. Anyway, it should go together as a first version pretty quickly. It could even be integrated with an HTML5 drawing app to let you draw a map and then populate it. So far, I have started rearranging the current codebase, so that it will be easier to slot in new code that isn't about the current network graphs.

P.S. started coding. It will be a second page on the same site, the simplest thing that works.

Monday, October 26, 2015

DunGen - Fleshing out NPCs a bit.

Non player characters now have names, from a basic name generator. It will get better by iteration. They also have very rough stats now. You'll see some marked as "smart" or "strong" or "clumsy" or "uninspiring", etc indicating high and low attributes. They are limited to two high or low stats, since they represent what is exceptionally noticeable, and the line looks cluttered when there are more. Stats that aren't mentioned are midrange. You might want to figure that a dullwitted mage is actually about normal intelligence, at the bottom end of mages, and make similar accomodations to class minima. The really lucky NPC also gets a magic item, beyond whatever is in the room loot. Higher level NPCs tend to have items more often and better weapon and armor bonuses on their items. The item might even be useful for the character's class, but that's purely random currently.

Here's the unedited key from the previous post's map as an example:

LocationDescription (click in a cell to edit)
1: QuartersHook: symbolic piece of jewelry
2: MillM: 1 scheming porting hound
Hook: inscription on wall
3: QuartersM: 16 lizards, one is sick
Ts: 4156 silver, Jewelled Belt worth 1454 GP
Mg: Potion of Disguise
Mg: Potion of Silence
4: BarracksA water drain channel in the floor
5: TowerM: 2 hell hounds, one is eccentric
Ts: 48921 copper
Mg: Wand of Spell Penetration (-2 to target save vs spell)
Mg: Potion of Treasure finding
6: SewerEmpty
7: Guard roomM: 16 veteran adventurers:
Zormund: wise assassin 1
Staazor: thief 2, has Leather armor +1,
Frovinc: paladin 2
Jasud: dullwitted assassin 2
Ninmund: cleric 2
Winsind: weak, insane warlock 2
Goromir: delicate, bantering druid 1
Henwhistle: delicate, smart cleric 2
Gorwhistle: uninspiring, weak mage 2
Bavend: foolish, eccentric assassin 1
Banmund: weak cleric 1, has Strong healing potion
Omerdor: illusionist 1
Aescdon: thief 1
Anick: mage 2
Gaiessa: ranger 1, has Wand of Firestarting
Noskand: tough, charismatic fighter 1
8: LockupMushrooms
M: 8 veteran adventurers:
Atriril: tough, clumsy, forthright fighter 3, has Broadsword +3,
Quiond: cleric 4
Denthor: exceptionally well armed sorceror 3
Bengast: weak shaman 5, has Codex
Norvend: starving ranger 4
Enasud: fighter 5, has Clown suit of Creepiness
Nindred: weak, stoned thief 4
Quezul: foolish mage 4
Hook: captive
9: WellTp: burning oil trap
M: 6 ensorcelled giant snakes
M: 1 heroic adventurer:
Dorskand: assassin 5
Ts: 41 x 10 GP gem, Vessel worth 498 GP
Mg: Staff of Power
10: BarracksTs: 1870 gold, 1 x 600 GP gem, 935 gold
Mg: Scroll of spells
11: KennelM: 3 heroic adventurers:
Lesud: fighter 8, has Dagger +4, +2 damage to favored enemy
Enavinc: cleric 6
Gantros: condescending shaman 6, has Scroll of spells
Ts: 1 x 300 GP gem, 212 gold, 212 gold
12: QuartersM: 2 giant spiders
13: StablesM: 2 tired giant lizards
Hook: howling wind
14: Barricaded entranceThe door closes behind with a slam.
15: QuartersHook: distinctive arrow, quarrel, or sling bullet

It shows the bug where novice adventurers are sometimes labeled as veterans. Need to chase that down. But hey! Names, roughed in attributes, and magic items on guys!

Sunday, October 25, 2015

DunGen styling is working



Check out the Style button. Since last post, there are now several style attributes that can be changed, to be used in generating a new dungeon or applied to the current one, and the edit dialogs for nodes and edges let you custom style individual ones, so you can do things like visually call out the entrance and the boss room, or color sets of rooms by faction. The code for all the dialogs is much cleaned up if you want to look behind the curtain.

Handy link:  DunGen

There are a lot more attributes that can be styled in the VisJS engine, so many that to expose them all would be both tedious and a really cluttered UI, so plans are to add just the ones that seem most useful.  The one I am most excited about trying is to add images to nodes. I'll  need to collect or draw a batch and add image setting to the UI.  For now though, it is pretty good proof of concept on styling and I'll shift back to adding content.




Wednesday, October 14, 2015

Small DunGen update - beginning of a styling dialog

This time, it only handles two properties, edge width and background color, with limited options for each. More importantly, it lays down the pattern for restyling at generation of a dungeon level.  I'll flesh that out a bit more, and then add styling of individual nodes and edges, so you'll be able to do things like place direction arrows on stairs and slides, make water edges blue, and mark a special room in red. Anyway, its nice to shake some rust off...

Sunday, October 11, 2015

Sushi mat rope bridge terrain project

Saw these sushi mats in the grocery store yesterday for something like $1.50 and $2.50, and my terrain making pattern recognition went PING!  Rope bridge? Japanese fence? The issue was going to be in cutting them down their length reasonably evenly.
The "raw material"
 So this morning I dug out my razor saw and got to work on a first try. I started by trying to lay one out flat and cut a bunch of the bamboo sticks at once but it wiggled too much to get very far that way, too much of the energy was wasted moving stuff that I wanted held still.

You can see some of the scoring from my initial attempt at cutting flat here, and how I held it to cut a stick at at time.

Progress...

Bridge cut out. On to working it into a terrain piece...


The trick turned out to be to hold up an edge, cut a stick at a time and bend the two sides down in opposite directions as I went, since it is very flexible. I had a bit of trouble with the last few fibers of a stick splitting away sometimes instead of sawing through. It would probably all be tidier if I had the work clamped in a big clamp instead of using my left thumb and forefinger as the increasingly sore clamp. But hey, I got through the whole thing pretty quick once I got the hang of it.

It might be worth it on the next one to lay a bead of thinned PVA white glue into the binding string and letting it dry first to keep the skewers even and not sliding during the work.  It might also help to avoid the loosening of the binding strings during the cutting.

Thursday, October 8, 2015

Frostgrave setup variant

Saturday we played our first game of Frostgrave. We had four players, and somewhat larger table size, with ruins running roughly diagonally, so I tweaked the setup rules:

Set out four setup zone markers, each about 6 inches out from the ruins and space out pretty evenly around the table. Each player will setup within 3 inches of one of these markers.

Each player will set up three treasure markers, one at a time, in rotation around the table. Each treasure marker should be 9" or more from a board edge, 9" or more from a setup marker, and 6" or more from any other treasure marker.

Roll randomly for which wizard sets up from which setup marker after treasure markers are out.

This should lead to more interesting set ups than "I set up my treasures as close as possible to me and you set up yours as close as possible to you", so they go to the places that seem more like treasure locations in the scenery. But they'll go out in a reasonably balanced fashion since you don't know who starts where.

Aaron looks over the table after terrain setup. We didn't do use the ice floes and boats at the far end as playable ground in this scenario, but might do something with that later. The buildings are TerraClips printed cardboard terrain, mostly from the Streets & Buildings of Malifaux sets, with some pieces from the dungeons sets.

Dave's Elementalist warband

 My archers and undead wardogs mistakenly pile up in cover, soon to be fireballed by Dave's Elementalist Apprentice.

John's goblins are heading up the stairs with one treasure marker and heading for the one near the altar atop the building to the right. But then they are surprised by a White Ape that appeared as a wandering monster in response to another pickup. Instead of starting all monsters from an edge, we diced a random grid position on the table, by dividing a long edge and a side edge into die increments. The ape popped up about 3" from the goblin treasure bearer.

 Aaron measures a move as John looks on. We played in John's kitchen.

 My Necromantic gang tries unsuccessfully to jump Dave's guy carrying away from the cauldron, but we did get his Apprentice that was covering the withdrawal.
John's Goblins chased up the stairs by the White Ape. Wounding it at the base of the stairs only infuriated it and it took out two goblins and chased the Orc Wizard right off the roof before he could grab the loot there.



Wednesday, August 19, 2015

Scry Overflow

In any sufficiently advanced magic using culture there should be commodity magic items or spells capable of accessing the magic equivalent of Stack Overflow.

"How did we ever do magic before Scry Overflow?" the apprentice wizard asks while cut and pasting a demon summoning that goes horribly wrong.


Wednesday, August 12, 2015

Rails callback sequence with observers and model inheritance

 Cleaning up a tangle of callbacks I need to know the order they fire in to guide my refactoring. I ran this experiment in a tiny rails app with Rails 4.0.9 and the 'rails-observers' gem to match a legacy app I am working on, upgrading soon.

I made a mini rails app with two models, one inheriting from the other:

class Thingy < ActiveRecord::Base
  after_create :thingy_created_callback
  def thingy_created_callback     
    puts "thingy_after_create_callback"
  end 
end

class SpecialThingy < Thingy   
  after_create :special_thingy_created_callback
  def special_thingy_created_callback 
    puts "special_thingy_after_create_callback"
  end 
end

Made an observer to observe each:

class ThingyObserver < ActiveRecord::Observer   
  observe Thingy   
  puts "ThingyObserver loaded"
  def after_create(thingy)
    puts "ThingyObserver.after_create"
  end
end


class SpecialThingyObserver < ActiveRecord::Observer   
  observe SpecialThingy   
  puts "SpecialThingyObserver loaded"   
  def after_create(thingy)
    puts "SpecialThingyObserver.after_create" 
  end 
end

When creating an instance of SpecialThingy at console, I see the results in this order:

thingy_after_create_callback
special_thingy_after_create_callback
SpecialThingyObserver.after_create
ThingyObserver.after_create

Sunday, August 2, 2015

What's next in DunGen

Got in some work this morning on the graph styling. Will let you set colors, shapes and borders on nodes, and line width and color of edges. The first editor that I am maybe half done on will be for the overall graph, then a second pass will add to the individual node and edge editors so you can call out an important room in red or with a star shape, or put an arrow on the downhill end of a slide or make water edges blue. Thinking about custom defaults being different for particular types of nodes and edges too, but may not go into that.

Another thing that will be coming pretty soon is to add theme tagging to the hooks and oddities tables so that there can be different lists of set dressing in a castle vs a temple vs a creepy horror setting. You'll only generate a litter of corpses if going totally random or you want stuff like that.

Lastly, I'm thinking to add tweak buttons to the node editing dialog (+Trap), (+Hook) (+Monster) (+Treasure) (+Oddity), so you can just add  a roll for one of them, not a total reroll.

Still mulling ideas about other mapping styles, more monster lists to add in - maybe a branch that does EPT lists instead of D&D, maybe swap in lists tailored to particular OSR rules instead of my personal mish mash. One possible map style would be to draw up a set of semi-geomorphs and record for them the points at which room numbers would go, so they could be tiled onto a canvas, room numbers overlaid, and then contents generated to match the room numbering. The result would be a traditional looking map with some flexibility and nicer looking than I could probably procedurally generate from code.

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.

  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

+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

Progress
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

This station has some gaming background music potential.
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

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.




LocationDescription 
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