Saturday, February 14, 2015

Dungeon Master Musings: Different Strokes for Different Folks


One of the most important lessons any DM can learn is the lesson of tailoring your game to the players that you have.  Ultimately, the objective of any DM is to make sure that those players are having as much fun as possible, while having a fun themselves.

As such, I've spent a lot of time monitoring my two groups of gamers, and trying to make the experiences as interesting as possible for both of them.

What they are looking for

For the guy's group, they are looking for exploration, accomplishment, success, and challenge.  They want to encounter situations and overcome them.  They want a more traditional dungeon crawl, where they handle each encounter by itself and gain power, glory, loot, and more capabilities as time goes on.  Role playing is a vehicle by which combat and victory are augmented and achieved.

The women's group is looking for a variety of interesting experiences and exploration.  They want to discover interesting people and interesting locales, while telling interesting stories about their characters.  Combat is interesting as a vehicle to help propel their characters forward and discover new qualities about themselves.

What they find important

For the guy's group, regularity and consistency are important, while storyline is secondary.  When the monster comes flying at them, they want the outcome of the scenario to be the same each time, based on some specific set of rules related to how the dice fell.

The women's group enjoys having more free-form encounters.  The monster trips, falls on its face, and lands prone.  You stab the wall with your sword and it impales itself into the cement.  Both bad and good things just randomly happen based on when I see an opportunity for bringing in interesting events.

One of my favorite things to do that I've started to tone down are critical hits/successes.  For the guy's group, having too much "interesting stuff" happen after a critical hit or miss was too much.  They complained multiple times about it being unfair and inconsistent.  So out it went.

But for the women's group we still have this.  And it results in some of the most amusing and interesting moments in those games.  "The shadow reaches out to touch the fighter, but overreaches, giving the fighter an opportunity to attack it.  Which she critically fails and manages instead to finally touch the shadow that she was trying to hit." is one scenario that happened.  In another, the player and the monster kept exchanging weapons as they fought.

Nothing is Normal

One of the biggest mistakes a DM can make is to assume that one style of play is necessarily better than the other.  Both are valid ways to play the game.  Whether you're doing a straight up tactical dungeon crawl or experiencing a story with many wild twists and turns, both are great if everyone is having fun, and it's best when you do a little bit of each.

Personally, the reason I prefer the looser version of the game is because it enables me to be creative and try to come up with interesting results of the players' actions.  But it does mean things are more chaotic and inconsistent, because I have to remember the "house rules" I've made in the past.  And do a good job of informing my players about those changes as much as I am able.


Thursday, February 12, 2015

Nutech: Ordering a 3d printer

Using money from our tax returns this year, we've decided to get a 3d printer.  Here's why, and some thoughts on 3d printing from someone about to get their first printer.

From everything I'm seeing online, 3d printing looks like it's about to start hitting mainstream.  Prices on printers and filament are dropping, and as more people are getting involved in 3d printing, more creators and ideas are starting to pop up.  For me personally, I have been interested in the technology and the ideas, but I honestly haven't thought of much I'd want to print.  About the only thing I can think of are board game modifications.

Like these Settlers of Catan trays and pieces.

I've been looking at printers and ideas for a year, but what with the wedding, the new car, and other stuff, it hasn't made financial sense for something that is basically a technology exploration.

About a month ago, I brought up the idea of getting a 3d printer to my partner.  Always the more frugal of the two of us, she immediately started preemptively trying to convince me that it wasn't something we should get.  Then I started showing her the various things she could make with the thing.  In less than an hour, she was trying to convince me that we should absolutely get it.  Ideas were flowing through her mind on how to build parts to mod X-wing Miniatures for newtonian physics, and war-game pieces, etc.

Nonetheless, I wasn't actually convinced to get one until I started talking to other folks in our social circle about it.  Asking around about it, folks seemed to have a very similar initial reaction to the idea of a 3d printer.  At first, they almost all said something along the lines of "I have no idea what I would make with that.  But as we chatted about it, their eyes lit up with possibilities.  Jewelery, costumery, decoration, tools, toys, board games, D&D minis, doll house furniture, cake molds, candy molds.  Etc. etc.  After each conversation, I walked away excited to see all the things they were going to come up with and/or find online to print.

After about half a week of this, I realized that if we got one, our social circle was going to be around to use it *constantly.*  So, once the tax returns started coming in, I ordered the Ultimaker 2 from Dynamism.
It looks like something out of a sci-fi movie.

I found it for faster shipping with cheaper PLA from shop3duniverse later, and switched to them as the vendor.  The unit should arrive some time between Feb. 9 and Feb. 13th. (So before this post actually posts.)

The process that people go through in thinking about 3d printing is fascinating.  At first, the mere notion that one can imagine or find virtually anything and manifest it into reality with this machine is unbelievable.  What once could only be achieved by working clay or carving wood or other similar activities, can now be achieved with a 3d model, some plastic filament, and a lot of time.  The ideas pour in, and people start to think of the 3d printer as some sort of magic "wish granting" genie.  Think something, and then it appears!  Over time, though, people start to recognize that it's just another tool.  If you want something specific, you need to create it yourself, using digital tools of varying quality.  The 3d printer doesn't replace ingenuity.  It just decouples design and creation so that you can work in tools that make the process a lot easier.

After this final step, people seem to calm down about it.  It's a tool.  A limited tool.  It enables a lot of creation and cheap production, but it's no magic genie of plastic.  It's just another way to make things, like a printer, or anything else.

I think it's exciting, and I'm really looking forward to getting ours.  After I've played with it a bit, I'll post about the tools we're using to make things.

Tuesday, February 10, 2015

Tuesday Tidbits: I am a unique snowflake

Snowflake created by Petr Kratochvil
GoPro cameras annoy me.  As do most adventure photo blogs, and similar stuff.  Why?  Because it's all about bragging about the awesome things you do.

LOOK AT ME! The GoPro-er cries.  I DO REALLY INTERESTING AND UNIQUE THINGS AND MUST BROADCAST IT TO THE WORLD!

Look.  I get it.  I'm a pilot.  I've done rock climbing.  I've canyoneered through some of the canyons of Zion National Park.  When we do these things, we're doing awesome things, and we want the rest of the world to share in it.  But really, when you are doing a blog or a video post that is nothing but you sitting at the controls of your Cessna 172, or climbing up a rock wall that many others have climbed, there's little to no value add that you're bringing to the table.

I mean really.  Go to youtube and do a search for Cessna 172 and you'll find hundreds of videos.

Check out my blog where I post
photos of cool places I've spent money at!
Most of it is unedited footage showing someone doing loops around their home airport, or traveling from one popular location to another popular location.  While it's useful to have some data to check out when planning out one's flight, there's really little left there except ego stroking.  The world really doesn't need yet another rich person showing off their Cirrus SR-22 and bragging about how awesome they are when they fly.

What we need is value addition.  Comment on it.  Talk about it.  Do analysis.  Check out Flight Chops.  Now there's a guy that adds something to his GoPro videos.  Great editing, and great analysis.  A willingness to self-criticize and self-analyze.  There's something there to learn from.  It's extra material.  Do something more than just record yourself doing something.  You're not unique.  You're not special.  You're doing something that hundreds of people do.  You're not a unique snowflake.  While it's really awesome that you're a pilot/rock climber/skiier/whatever, unless you're doing really amazing stunts, there's just not a lot of value for most people, most of the time.

That's why I don't ever want this blog to devolve into me just bragging about the cool games I've played or cool stuff I've done.  I want to do reviews, analysis, and other critical thinking pieces.

I am not a unique snowflake.  There are hundreds, if not thousands, of people just like me writing blogs about their hobbies, or making videos, etc.  Many add much more value to those presentations than I ever hope to add.  But I've got some thoughts to share, and I really enjoy writing, so here you go.

I promise to try my best to add value to my experiences in this blog, rather than just reporting on those experiences.  Although part of what I want to capture are "first time" experiences doing things, so I may blog about those things a bit more personally.  But there, I hope the value add is that I am providing a newbie's perspective on something.

Saturday, February 7, 2015

Dungeon Master Musings: Building a good map


The first map that I made for Dungeons and Dragons was the Grove level of the Sunless Citadel.

The grove level of the Sunless Citadel
It was a lovely little place with a lot of interesting spaces.  But, because of my newbishness, there were a lot of things I did poorly, and wound up taking 20 hours doing intricate detail work that nobody would ever notice.  On the other hand, reviewing the maps with my players gave me lots of ideas on how to improve them, and how to focus on spending my time doing things of value to them.

First of all, one of the things that went almost completely unnoticed was a lot of the airbrush work that I put into the piece.  If you look at the full size version of the map, you'll see what I'm talking about if you look very closely.  I airbrushed in pathways, trails, and other details to make it look like certain spots were more well trodden than others.  And nobody noticed.  But hooboy, people noticed when a simple table was missing from the Bugbear Hunter's room!

I thought the walls for my first map were boring, so for my second map, I put WAY too much detail into the walls

The Mountain Door to the Forge of Fury
Which is silly, because no one is going to look at the walls.  It's al covered by the in-game MapTool Fog of War stuff.  At most, the players will see 10 pixels into the wall.  And that's it.

What really matters to the players is interesting set pieces.  They want to know the shape of the room and what's in it.  They don't care as much about the shading or the detail work.  They just want a grid, a room, and *STUFF.*  What blew my mind was that the thing that people liked the most about my second map was the rope bridge.  I literally traced over the rope bridge in the DM map in brown, and that's the thing everyone liked the best.  Check it out on the higher resolution version.

It just goes to show that design is complicated.  What people want is usually not what the designer or creator thinks people want.  Things like these need to be *usable* not beautiful or whatever.

For a WXGA (1280x800) projector, the 50 pixels per square size works quite reasonably.  200 pixels per square would give a lot more space to play with, but 50 is pretty easy to work with, easily fits within available memory and performance constraints, and looks good enough.  Most of the time, the players play with the map zoomed out anyways, only zooming in for figuring out tactics for combat.

Ooh.  Another thing I learned.  So the doors on the two maps above aren't really obvious.  I was trying for more realistic doors, and frankly, they're hard to do and just don't look very good.  It's hard to figure out where to put the dividing line for the vision blocking when setting up the rooms, and it just doesn't feel right.  In later maps, I decided to go back to the more abstract/stylized version of doors:

This map is unfinished as yet.

As you can see, it's a lot easier, now to see where doors are at, and it makes it easy to divide them in half for doors.

I'll share more mapmaking tips, as well as a description of the tools and process I use for making them, later on!

Friday, February 6, 2015

Contemplating Code: Rx Follow up

Ooh!  It looks like my post on Rx got a few readers!  That tells me I should take some time and put together a more in depth and interesting article on my early learnings in Rx and Reactive programming, as I stumble around in it.  Exciting!

Thursday, February 5, 2015

Contemplating Code: My introduction to Rx and Reactive Programming.

I have the extreme pleasure of working with one of the best educators and proponents of Rx in the software industry.  When he first introduced our team to Rx, I was skeptical.  What could this reactive programming stuff really bring to the table.  But over time, I've really gotten hooked on writing Rx to solve problems.

In non-Rx programming, you might write a bit of code that looks like this to listen for events from a mouse.

function listenToMouseEvents(){
    mouseEventEmitter.addEventListener(mouse, function(event) {
        processMouseEvent(event);
    });
}

Oh, but you need a bit more than that, actually.  Because this will probably live inside a class of some sort.  And you need to maintain its lifecycle.  And you probably want to catch exceptions.

function MouseEventProcess (mouseEventEmitter) {
    this._mouseEventEmitter = mouseEventEmitter;
    this._boundOnMouseEvent = this._onMouseEvent.bind(this);

    mouseEventEmitter.addEventListener('mouse', this._boundOnMouseEvent);
};

MouseEventProcessor.prototype = {
    _onMouseEvent: function(event) {
        try {
            this._processMouseEvent(event);
        } catch(e) {
            this._processException(e);
        }
    },

    destroy: function() {
        this._mouseEventEmitter.
            removeEventListener('mouse', this._boundOnMouseEvent);
    }
};

You might start building functionality around the mouse where you support various kinds of gestures, and have a library for emitting those.  But you need to be able to manage all those life cycles simultaneously.  Even the example above misses issues where errors cause us to want to remove our event listener.

Using Rx, you get that for free, and don't have to do much different.  Heck, I think the following example looks even simpler than before.

function MouseEventProcess (mouseEventEmitter) {
    this._compositeDisposable = new Rx.Observable.CompositeDisposable();

    var disposable = Rx.Observable.fromEvent(mouseEventEmitter, 'mouse').
         .subscribe(
             this._processMouseEvent.bind(this),
             this._processException.bind(this),
             NOOP);

    this._compositeDisposable.add(disposable);
}

MouseEventProcess.prototype.destroy = function() {
    this._compositeDisposable.dispose();
}

This is a simplistic example of how Rx gets started.  Where Rx really shines is when you start adding more complexity to it.  By creating multiple gestures, etc., you just keep chaining off of the initial mouse event emitter.  By adding everything to the composite disposable, you get to clean it all up when you're done.  There's also other tricks that are suddenly surprisingly easy, and tons of "free" stuff you get when you do things this way.

Most importantly, you don't have to spend as much time managing the lifecycle of your event emitters, callbacks, and listeners.  By just disposing of the disposable returned by the subscribe method, every observable subscription in the observable chain is automatically unsubscribed, and that does all the work you need it to do.

Building bullet proof applications in Rx seems a lot easier once you get to know it, but hoo boy is it a bit of a steep learning curve.  Particularly if you don't know anything about functional programming.

Next time, I should talk about the difference between reactive programming and procedural programming as I understand it so far, and go into detail about the benefits that Rx provides me.

Tuesday, February 3, 2015

Tuesday Tidbits: Software, Love yourself.

One thing I've learned working in tech is that change is pretty much a constant.  Some really smart people build a system, then people that don't understand it as well work on it for a while, and eventually break it terribly, and then other people feel the need to refactor it into another new system, which other people that don't understand it very well modify, and so on.

That doesn't mean it's a bad idea to refactor a pre-existing system.  It's just that it's not special.  Every system has flaws, and doesn't handle tomorrow's design requirements.  And has a ton of edge cases that it doesn't handle.

Really, I hate this myth of the ideal software system.  All software is perfect the way it is, with all its blemishes and bloat.  All its stinky odors and incomplete modifications.  Its scars from the past, and its hopes and dreams for the future.  It is in the ever changing journey to the future that it truly is idealized.  The only constant is change, and embracing that change is the only way of maintaining sanity in the face of a barrage of external pressures to be something different than it is.

Wait is this a body image campaign or a post on software?