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.
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.
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.
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.
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:
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.
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 notTea.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
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.
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.
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.
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.
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.
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.
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)
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).
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.
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” )
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.