Monthly Archives: March 2015

Should You Prefer Prefix over Postfix Increment?

I’ve been told in the past by a programming mentor that ++x is faster than x++, and I found myself refactoring a few increments in javascript the other day.

But then I got thinking – is it really faster? Wouldn’t most modern compilers optimize out the difference? I decided to do some science.

Here’s an outline of the code I ran on JSPerf:

    var x = 0;
    
    var obj = {
      x: 0
    }

  // test one: 
  x++;

  // test two:
  ++x;

  //test three:
  ++obj.x;

  //test four:
  obj.x++

Results:

For the most part, ++x has the same microperformance as x++.

Modern versions of Android Browser, Chrome, Firefox, Internet Explorer, and Safari all have similar performance for each of the benchmarks. This overrides my existing belief that prefix notation is faster.

In some browsers, there is a small but noticeable difference.

In FF19, ++x is faster than x++. But ++obj.x and obj.x++ are the same speed.

In FF31, ++x is faster than x++, but obj.x++ is faster than ++obj.x.

One interesting thing is that some browsers prefer x++ and others prefer ++x. The largest difference, FF31, is around a 1% increase in performance. But, Chrome Mobile loses that same amount (~1%), preferring x++ over ++x, so ultimately it’s a wash unless you’re targeting a specific browser.

From Manhattan,

–Erty

Making Tea With Javascript: OOP with the Prototype Chain

Javascript is weird.

Prototypical inheritance is really powerful, but it’s quite a bit to wrap your mind around if you’re new to it. My first language was Java, and I’m comfortable with the “traditional” OOP paradigm. In this post, I’ll build a traditional Superclass/Subclass relationship in Javascript in an attempt to untangle the weirdness that is Javascript’s prototypical inheritance model.

All of the source code is available in a repl.it.

Part 1: Superclass Constructor

Let’s brew a cup of tea.

//Superclass constructor
var Tea = function(options) {
    this.color = options.color || "herbal";
    this.caffeine = options.caffeine || 0;
    this.tannins = options.tannins || 0;
    this.minsSteeped = 0;
}

Here, we’ve created a constructor for some tea. This tea can’t really do anything, but it holds some useful information on whatever tea object we create in the future. I can make a cup of herbal tea by calling this with the new keyword.

var myHerbalTea = new Tea({});

 Part 2: Superclass Prototype

Now that we have an idea of how prototypes work, we can go ahead and construct a prototype that will be applied to instances of Tea.

Tea.prototype = {
  steep : function(cup) {
      //caffeine
      this.caffeine = Math.max(0, this.caffeine - 1);
      if (this.caffeine) {
        cup.caffeine ++;
      }

      //tannins
      cup.tannins += this.tannins * this.minsSteeped;

      //color
      cup.color = this.color;

      //minsSteeped
      this.minsSteeped ++;
  }
};

Now we create an object with a single method, steep, and assign that to be the prototype of Tea.  We usually want to put methods on the prototype, so that there’s only one copy of the function shared among all instances (this saves us a lot of memory).

After calling var myHerbalTea = new Tea({}), we’ll have the following inheritance structure:

Prototype Inheritance of myHerbalTea

 

Notice that the Tea function is not part of the prototype chain. It is simply a constructor function used to add the member variables (color, etc) to myHerbalTea. However, because Tea.prototype exists, it is chained to our instance of the Tea class.

Part 3: Subclass

Herbal tea is boring. Let’s make something to wake us up!

//Subclass constructor
var BlackTea = function(){
    //Put instance properties from the superclass constructor on the subclass instance
    Tea.call(this, {
        color : "Black",
        caffeine : 10,
        tannins : 3
    });
    this.hasMilk = false;
}

Here’s where the Javascript magic begins. And by magic I mean less of the Harry Potter and more of the Goat Sacrifice.

Let’s make some black tea:

var firstCup = new BlackTea();

This is another constructor function, composed of two main parts. First, we call the Tea() function, binding to the current instance. The call to Tea will have firstCup bound to this, which will apply all of the instance variables (color, etc), to firstCup. This is kind of like calling super() in a constructor in Java.

Here’s the relevant code. Everything that refers to firstCup when we create it is highlighted red.

var Tea = function(options) {
    this.color = options.color || "herbal";
    this.caffeine = options.caffeine || 0;
    this.tannins = options.tannins || 0;
    this.minsSteeped = 0;
}

// ...

var BlackTea = function(){
    Tea.call(this, {
        color : "Black",
        caffeine : 10,
        tannins : 3
    });
    this.hasMilk = false;
}

var firstCup = new BlackTea();

// ...

Ok, pop quiz. what is currently the prototype of firstCup?

Answer: undefined.

If you thought it was Tea, remember that Tea is just the constructor and is never really a “thing”.

If you thought it was Tea.prototype (I totally did), know that even though we do Tea.call(...), we haven’t bound BlackTea‘s prototype yet, so firstCup.__proto__ is nothing.

Let’s set up the prototype and make a second cup.

Part 4: Subclass Prototype

Remember that the prototype of a class is the object that will be assigned to the __proto__ property of any instances created of that class. So in order to create a second cup of tea, we need to first change BlackTea.prototype.

BlackTea.prototype = Object.create(Tea.prototype);

var secondCup = new BlackTea();

It wasn’t obvious to me at first why we don’t bind BlackTea.prototype directly to Tea.prototype. Instead, we create an object whose prototype is Tea.prototype, and then set BlackTea.prototype to that new, empty object. Our secondCup object can still see the steep(cup) function, but it checks an empty object on its way up the prototype chain. Hmm…

But say we want to be able to add milk to our black tea. (Adding milk to green or herbal tea is icky and we shouldn’t allow our users to do that). If I modify BlackTea.prototype to be able to add milk:

BlackTea.prototype.addMilk = function(cup) {
    //adding milk makes the cup of tea less harsh!
    cup.tannins = Math.floor(cup.tannins / 2);
    this.hasMilk = true;
}

Remember that BlackTea.prototype is not Tea.prototype! It’s an object whose prototype is Tea.prototype. This means that addMilk is only available to instances of BlackTea, not any kind of tea.

Our prototype chain now looks like

withmilk

Yay!

Part 5: Actually Make Tea

//ok, let's make some tea
var myTea = new BlackTea();

var myCup = {
    color : "clear",
    caffeine : 0,
    tannins : 0
};

//steep for three minutes
myTea.steep(myCup);
myTea.steep(myCup);
myTea.steep(myCup);

//add some milk
myTea.addMilk(myCup);

//drink up
console.log(myCup, myTea);

This produces:
myCup is { color: ‘Black’, caffeine: 3, tannins: 4 }
myTea is { color: ‘Black’, caffeine: 7, tannins: 3, minsSteeped: 3, hasMilk: true }

Part 6: Recap

  • Javascript prototypal inheritance is super weird
  • Use the new keyword to treat a function as a constructor
    • The prototype of that function will become the __proto__ of the object, which is where the object looks for methods that aren’t declared locally.
    • Then you can call that constructor (like Java’s super()) using Class.call(object)
  • Explicitly set prototypes to an object with the prototype you want to create
    • e.g. myObject.prototype = Object.create(Constructor.prototype)

I hope this blog post cleared up some of the mystery around prototypes and inheritance!

From Manhattan,

–Erty Seidohl

P.S. Thanks to Ryan McVerry and Julia Evans for proofreading! Also Michael Mulley for helping me understand the WTF-ness of .prototype not actually returning anything on an object.

Notes from PAX East 2015 (Part 3 / 3 – Dungeon Mastering)

I went to PAX East 2015! It was awesome! I took a lot of notes!

(Part 1: Social Stuff)
(Part 2: Making & Selling Games)

Here are the notes from the one talk that I went to on being a good Game Master.

Playing Between The Lines

Luke Crane, Adam Koebel, Sage LaTorra, Thor Olavsrud

  • DMs are authoritative. (this is bullshit)
  • DMs enforce a social contract.
  • DMs organize & wrangle humans
  • THE DM IS JUST ANOTHER PLAYER WITH DIFFERENT RULES.
  • Prep
    • Creating Scenarios
    • Homework
    • Game Design
    • “Lonely Fun”
      • The DM who creates adventures that will never be run. And has a great time doing it.
  • Prep in the most minimal way possible.
  • Find and create things that will drive action.
  • The GM is expected to always be thinking about the game. (this is also bullshit)
  • What does prep look like for…
    • D&D
      • Reading
      • Research
      • Environment Building
      • Narrative Stuff
    • The Great Pendragon Campaign
      • Reading Le Morte D’Arthur
      • Reading about the current period and year
      • Tying in past family events and scandalous rumors
    • Dogs in the Vineyard
      • Towns, Sins, Demons, People, Relationships, Mormons, Guns
      • Play a GM Minigame to create the campaign (Lonely Fun)
      • Use their system for “creating problems”
    • The Burning Wheel
      • Building Characters
      • Developing Relationships, both oppositional and supportive
      • Challenging Beliefs
    • Dungeon World
      • Make shit up
      • Wave hands like muppet
      • Talk in funny voices
      • Buy more copies of Dungeon World [note: the publisher of D.W. was on the panel]
  • 90% of DMing is making shit up (improv)
  • Building a cool world:
    • If you are playing a game with characters, you need to build the map in personal terms instead of locational terms.
    • Your campaign doesn’t exist in a vacuum. Learn to build external media into your campaign. Steal from pop culture. Don’t worry about it as long as it’s fun.
    • Read A Wizard of EarthSea
      • Names are magical. They give things solidity. Going after a +3 broadsword is way less cool than going after Sunbrand, Sword of the Western Hills
      • Use language dictionaries. “What langauge is magic performed in?” (mongolian!)
  • Have a folder.
    • Name List
    • Map
    • Notes
  • DRAW MAPS, LEAVE BLANKS.
    • (JIT DM)
    • Collaborate in worldbuilding with the players
  • Character (NPC) prep:
    • Use the rules. Then fudge the rules.
    • Build opposition to the characters
    • The axiom of antagonists: “They have something appalling that they want, but use methods that the players approve of” or “They have something good that they want, but use appalling methods to achieve it
    • Then take it a step further and make sure the antagonist wants something from the PCs.
  • For any character in the game, you should have 3 things that describe them.
  • Story:
    • Relationship Maps! (example)
    • NPCs should have reactions to player events.
      • “What does your NPC dad think of what your PC is doing?”
      • “What do the rest of the goblins do after you’ve killed their king?”
    • Behind the scenes, or indirect action.
  • rtfm
  • Game Mastering is Learned, Not Borned
    • Skills, not genetics
    • These skills can be taught
    • Anyone can become a GM if they’re not afraid

Notes from PAX East 2015 (Part 2 / 3 – Making & Selling Games)

I went to PAX East 2015! It was awesome! I took a lot of notes!

(Part 1: Social Stuff)
(Part 3: Dungeon Mastering)

Here are the notes from the “how to make and sell games” type talks.

Business Basics for Indies

Dan Adelman

This talk is mostly about video, not board games

  •  Business Strategy
  • Also: What are the barriers to entry?
    • Indie games have a low barrier to entry
    • Marginal Revenue (selling one more copy) > Marginal Cost (making one more copy)
      • Marginal Cost is 0 for video games (i.e. it is free to sell a copy. Thus selling at any price = profit). Except not.
      • Everyone can undercut, leading to a race to the bottom
        • 99 cents is expensive when your competition is free
  • Adelman’s Law of the Games Industry: “Anyone in the games industry to make money is in the wrong place.”
  • Marketing: Helping people who would love your game, find out about your game (not spammy!)
  • Product  Quality of product
    Differentiation from competitors
    Audience Expectations
    Internal Consistency (art, music, gameplay, marketing all aiming for the same audience).
    PlACE/
    PLatform
    Know where your customers are
    What platforms are excited about your game? (They will give you free publicity)
    Where does your game belong?
    PROMOTION  Where does your core audience get their information?
    Establish a relationship with journalists. But! If you are at the point that you need to establish a relationship with a journalist to market your game, you’re too late.
    Price Low low low but don’t undersell yourself. This is tricky.
    Announce in advance when your price will drop so customers don’t feel cheated
    Examine the competition carefully
    Check your audiences’ disposable income
  • The 4 P’s must fit together and be internally consistent; point to the same consumers.
  • Negotiation: Know these words.
    • Specifically, make sure you understand “BATNA”, “Logrolling” vs “Fixed Pie”
  • Never be afraid to ask for a better deal than they offer. Raising your money per game from $2 to $4 doubles your profits and takes a 5 minute discussion if they’re willing.
  • Practice negotiation. Roleplay, rehearse. Make it a conversation. Remove ego.
  • (You have to work with them afterward. If either side gets heated during negotiation, is this really a partnership you want?)
  • Get to know people before you need them (see: Promotion, above). But don’t be disingenuous!
  • Everyone will remember everything you say. Good and bad.
  • Everyone starts at the bottom.

Heads Up: the Art of Interface and Graphic Design in Video Games

Vicki Ebberts, Alexandria Neonakis, Kate Welch, Eric Monacelli

  • Read this article by Anthony Stonehouse
  • Fiction Geometry Notes Example
    Diagetic Yes Yes You and the character can see the same information, in the same way. Pip Boy
    Meta Yes No In-game elements “seen by the character” projected against the 2D HUD Plane Blood Splatter
    Spatial No Yes Elements that you see, that exist in the game world, that are invisible to the character. Floating Money
    Non-Diagetic No No The classic “HUD”, which is removed from the game world and doesn’t exist in the game fiction. WOW HUD
  • New UI problems will present themselves in nontraditional games.
    • Oculus rift is going to be AWESOME AND WEIRD AND INTERESTING
    • Hearthstone is already breaking this model – the entire game is a user interface – there’s almost no “fiction”.
  • What do companies look for in designers?
    • Graphic Design
      • Ability to organize information in a smart way.
      • Ability to organize information in a hierarchy clearly.
    • Being aware of what’s new and fresh, and also what’s out of date
    • Fail a lot and don’t give up
    • Ability to think like a user of any product
  • Process
    • Get clear goals. What problem are we trying to solve? How does this help the player?
    • Sketch out ideas on paper. Don’t discriminate against bad ideas.
    • Whiteboard user flow. Confirmations. Transisions! User Feel. Buttons.
    • Wireframe. Prototype anything new/risky/tricky. Use physical paper to prototype quickly.
  • Pair. Work with a developer until things feel right. User test frequently!
  • If anyone is noticing your UI, then it’s probably in their way.
  • In AAA Shooters, the UI is not the content. In nontraditional games (hearthstone), the UI is the content.
  • Watch playthroughs on youtube to find elements that work well. But make sure it works in your game.
  • Just go on twitter and search #UX and #UI. See what happens.

 Do You Have What it Takes to Publish an Indie Board Game?!

Breeze Grigas, Jeff Gracia, Sarah Como, Eli Kosminsky, Aerjen Tamminga, Luke Peterschmidt

  • Basically the answer to most of your questions is kickstarter but this isn’t a kickstarter panel so we’re going to assume you know that.
  • Why do you want to make games? Is it to quit your job? Make something with your friends? Check “make a board game” off your list?
  • ^^ Answer that question before going further.
  • As a publisher, what is your product line.
  • You don’t need a finished product to approach a publisher. It just needs to play, and show the core idea. You must make it. Test It!
  • If you decide to self publish, you’re going to spend 80% of your time not making games. You’ll spend 80% of your time publishing, and then 100% of your time selling.
  • Remember that the publisher takes the risk.
  • Retail price should be 5x creation cost.
    • 2/5 Retailer
      1/5 Distributor
      1/5 Publisher -> 1/5 of that to you
      1/5 [??? didn’t write this down]
    • Example: $210k kickstarter, had to spend $80k in shipping (incl. international).
  • Find your local game developer cabal and ask them.
  • Go to the Unpub Convention in Florida.
  • “Design toward what you can do”, “Pick something you can execute on”.
  • Get to know Board Game Geek.
  • Read The Characteristics of Games
  • Read The Design of Everyday Things
  • Playing bad games is a great way to make good games.
  • Play games that people love but you don’t like. (“Read 50 Shades, and figure out why it sells. You don’t have to love the actual product to learn something from it”)
  • Give your game to other people, then just sit back and watch! (Blind Playtesting).
  • Three Questions that you should be able to answer for your fictional character in the game / player character in the game:
    • Who are you?
    • What do you do?
    • How do you win?
  • Immersive Gameplay (top down design) > Canvasing (same rules, different art)
  • Listen to Mark Rosewater’s Podcast.
  • Playtest with new people. But also make sure to playtest with the same group for a few times so that they figure out the strategy of your game.
  • You want to hear: “This is fun, and I’d like to play it again.”
  • Play with other designers, and be able to answer their questions about why you didn’t make certain decisions.
  • You can go for an LLC or just a DBA (“Do Business As”). Actually, just get a deleware C Corp. (srsly).
  • YOU WILL PROBABLY SPEND ABOUT $10,000 BEFORE YOU GET TO MARKET. Have this money ready to go when you go to publish.
  • Have a “red button gamer” play your game. (rbg is someone who just wants to blow things up and see what happens – they’ll have different strategies and tactics and might find new ways your game is broken).
  • Go to your local game store with your game
    • Get the best local M:TG players to play your game. They will break it. Retool. Have them play it again. They will break it again. Repeat until it takes them “long enough” to break your game.
  • (Game design tip: Blind Bid events even out the game).
  • Think about weight for shipping!
  • Check out the GameCrafter site.

Birthing Board Games: From Conception to Maturity

Timothy Blank, Donald Mitchell, Lauren Woolsey, Phil Cartagena

  • Find your local game maker’s guild. Join it.
  • Games are made of: Concept, Theme, Components, Mechanics
  • “A good game gives its players interesting choices” — Sid Meier

[this panel wasn’t particularly information dense!]

 

 

Notes from PAX East 2015 (Part 1 / 3 – Social Stuff)

I went to PAX East 2015! It was awesome! I took a lot of notes!

(Part 2: Making & Selling Games)
(Part 3: Dungeon Mastering)

Here are the notes from the “social media / dealing with people” type talks.

Enabling Co-Op Mode

Tracy Hurley, Christine Chung, Georgia Dow

  • Social Identity Theory
    • We need to form groups to survive. We want to protect our group. We like to form an identity with out group. We form “ourselves”, and “belong” to the ingroup. The outgroup is the “other”.
    • We protect our identity as part of our own self-esteem. We think of our ingroup as better than they really are.
    • Now we have globalization which goes against this.
    • Actors in Planet of the Apes took to ingroups that matched their ape costumes.
    • Power and Identity
      • Conflict due to differences in identity
    • It’s the self-esteem connection to identity and connection to in-group (views) that is “the problem”
    • Cognitive Dissonance
    • Social Resources
      • What are they?
    • One of the things to do is contact, actually meet the outgroup to realize that they are more diverse. We see our ingroup as diverse but the outgroup as monolithic stereotypes. (“varied” / “unrealistic” )
    • Just putting people in the same place doesn’t work, but getting them to work together does.
    • Replace the “instance” of the outgroup with an actual human being.
    • Use gaming to reinforce, or, hopefully, break down these stereotypes.
      • Stereotype break down is not about repetition but about diversity of experiences with “The other”
      • Aggressiveness breeds aggressiveness.
    • We want to be seen and accepted. We want our feelings to be seen and accepted.
    • Remember that some [trolls] may be upset about something else.
      • Don’t build up ammo
      • Aim your weaponry, just not at each other
      • Accept that you do not have to agree, to win
      • We don’t have to be right
      • We want peace, space, and reception, if not agreement
    • Look for common ground (what do both people care about?)
    • People who are uncomfortable with uncertainty are more likely to end up in conflict.
    • Use “I” statements, not “You” statements [when dealing with trolls]. Also pay attention to body language (this doesn’t translate well online).
    • Accountability.
    • Don’t feed the trolls?
      • The trolls aren’t ususally actually upset about *this*, but this is the forum in which they express the anger.
      • Games as *escape*, to get away from other *anger*, which follows them into the game.
      • Remember that you’re not just speaking to the troll but also the audience. So make sure you speak in a way that brings people together, not divides them.
      • Pause, wait, breathe, calm down before posting.

Player Select: Identifying with our virtual selves (video)

Alexa Ray Corriea, Neha Tiwari, Mitch Dyer, Elisa Melendez, Mike Laidlaw

  • Background Reading One: Leveling Up for Dummies
  • Background Reading Two: The Proteus Effect
  • More attractive avatars walked closer and divulged more information in game
  • People rarely (3%) create “scary” or “unattractive” avatars
  • Men trended toward average avatars, women toward attractive avatars.
  • Katrina Fong is doing cool research. Also Aria Bendix.
  • People who are comfortable with themselves don’t have such strong tendencies to create heroic or beautiful avatars.
  • Character creation is intentional.
  • Convince the player that the relationship is real and not the result of some systems.
  • Samantha Traynor is a good example of a character who breaks the “sex as reward” system (for male Shep) by turning him down no matter his advances.