1. Technical Illusions's augmented reality glasses

    I can't get excited about Google Glass. The public privacy concerns are too great. The platform is too closed, the software too crappy. The company making it has too patchy a history of support and too disgusting a commercial mandate.

    I can't get excited about Oculus Rift. The issues I want to see more game designs tackle right now are ones it makes worse. It's a device that cuts out everyone around you, that makes 25% of people motion sick, that seems basically purpose-built to re-sell the same first-person action games and designs in an era where the usual rasterization improvements have hit diminishing returns. Its backers crow about immersion, but videogame immersion is bullshit. On a purely technical level I care more about color-accurate and high-DPI displays and it's a big step backwards for both these things.

    But yesterday Sean Hollister at The Verge interviewed Jeri Ellsworth and Rick Johnson and demoed some new AR glasses from Technical Illusions, a company being described as "spin-off," but sounds more like a cast-off, of Valve.

    This is what I want. They don't take pictures. They don't tell me where to go. They don't encourage me to come back to Doom, Team Fortress, or other designs that worked perfectly well on traditional displays. Instead they show me something new; they let me interact in new kinds of spaces with other people; they let people who are not plugged in spectate.

    It's actually all in the name, right? They augment my experience. They don't replace it, they don't virtualize it, and they certainly don't "smooth," "simplify," or "filter" it.

  2. Fathers, Daughters, and ROMs

    Rachel Weil at Femicom wrote an incisive article about female agency and female-inclusive NES ROM hacks:

    I would suggest that the recent popularization of these harassment stories has created a sort of anxiety around men's culpability in these scenarios, and that these pieces on "daddy hackers" aim to relieve this anxiety. They are heartwarming stories that present men as problem solvers rather than problem creators. These men use the technical knowledge that only they seem to possess in order to, as PC Mag reports, "empower female gamers."

    It's really cool that these hacks are happening. It's not cool how they're being framed - as an afeminist, male-driven pursuit; a way to defuse concerns about women in nerd culture while still ignoring them. It immediately reminded me of when male progressives in the US talk about issues affecting "our wives, daughters, mothers" - women are liminally present, but they're never the ones speaking and never the ones spoken to.

    So here's a list of games hacked to have more women, without any of that commentary, from Pauli Kohberger.

  3. Game loops in JavaScript

    I'm learning JavaScript! I mean, I already wrote some crap in it before, but now I'm learning enough to write something substantial. Like a (non-Perlenspiel) game.

    One of the things you need for a game is a game loop. In large games these are increasingly tricky affairs spread out over multiple threads and designed to optimize memory access patterns. In JavaScript, you can't do that, but you can at least implement the basics correctly. The canonical tutorial on this stuff is deWiTTERS Game Loop which goes over several implementation strategies. Only of those implementations, "Constant Game Speed independent of Variable FPS," is worth pursuing. (To know why, read the article.) So how to do it in JavaScript?

    The first needed bit is a monotonic high-resolution timer. With only 16 milliseconds between loops you need something with one millisecond measurement precision or better, and you definitely don't want it running backwards. This is the first hitch - the usual method, Date().getTime(), is non-monotonic and accurate to somewhere between 1 and 15 milliseconds.1 The best possibility is the worst reasonable expectation. Instead there's the new High Resolution Time proposal which promises sub-millisecond precision.2 So use that after installing a fallback to make sure there's no crash (just inaccuracy) on older browsers.

    window.performance = window.performance || {
        now: function() { return new Date().getTime(); }
    };
    

    Then use it to build a standard accumulating tick loop:

    function setExactInterval (callback, interval) {
        var accum = 0;
        var start = window.performance.now();
        return setInterval(function() {
            var now = window.performance.now();
            accum += now - start;
            while (accum >= interval) {
                accum -= interval;
                callback(interval, now - accum);
            }
            start = now;
        }, interval);
    };
    

    This looks a lot like, and uses, the long-standing setInterval function. setInterval by itself has significant drift and inaccuracy. Managing the accumulation will run the step twice if the interval is too long, or not at all if it's too short.

    The two arguments to the callback function are the simulated time delta (which is fixed) and the absolute time at the simulated step (which will be behind the actual now() time).

    With "exact" logic timing out of the way, what about rendering? There's another new function, requestAnimationFrame, which is stepped with the browser's internal repaint schedule. This means as close as possible to 60Hz in the foreground, less to save power in the background.

    requestAnimationFrame(function render (now) {
        var state0 = get_previous_state();
        var state1 = get_current_state();
        var p = (now - state1.timestamp) / interval;
            // 'interval' is the same thing passed to setExactInterval.
        var render_state = interpolate(state0, state1, p);
        draw(render_state);
        requestAnimationFrame(render);
    });
    

    This function has some things you'll need to fill in yourself. draw()'s obvious, but what about interpolate()? This function generates data to draw by interpolating the current and past game state. The details are beyond what I can cover generally but note the callback arguments in setExactInterval: not just the delta time, but the total simulated time, which can be stored on the state. Since the time delta is fixed, that means the difference between now and the current simulated state is the same as the interpolation needed between the previous and current state. If the current frame just finished that difference is near zero so you get the previous state; if the next frame is almost ready the difference is near the interval so you'll get the current frame.3

    If the game's logic interval is much shorter than the render interval, say by two times or more, or it doesn't need smooth movement, you can probably make do without the interpolation at all.

    As far as I can tell, that's the current best approach for high-performance JavaScript game loops - window.performance.now, setInterval with manual accumulation management, and requestAnimationFrame for rendering. Probably in a month or two I'll have worked through WebWorkers and realize this is all garbage, though.


    1. Undoubtedly it's mostly wrapping gettimeofday, GetTickCount, and related system calls. 

    2. And similarly, this is probably clock_gettime, QueryPerformanceCounter, and so on. 

    3. If the next frame is late, it will even extrapolate for you. You can view this as a bug or a feature. 

  4. Linkspam, May 11th, 2013

    A bit over a hundred years ago, California was all set to build a great-looking bike highway. Unfortunately they built car highways instead and pretty much doomed good urban planning, air quality, international politics, etc. More alternate history stories should pick events like this as divergence points, rather than boring crap like who won wars.

    California continues its century-plus history of bad decisions through to today, as documented in a beautiful letter from Robert Meister to Daphne Koller about Coursera's state lobbying efforts to delegitimize and destroy public education:

    I will know my course has been successful when my students understand Coursera’s business model behind offering free higher education globally (along with the promise of greater social equality) as an exciting venture capital investment opportunity through which to increase privately-held wealth and lock in existing educational hierarchies.

    Relatedly (I promise) bees are still dying for unknown reasons:

    Rising food prices led farmers to plant crops in fields previously considered marginal or set aside as grasslands. Honeybees forage in those grasslands, and can’t get the nutrition they need from flowering crops alone.

    This is a positive feedback loop, since without bees fruits don't get pollinated and food gets even more expensive. If this was, say, a college education, or health care, the solution is obvious: large-scale private pollination efforts. If you want fruit, you'd better spend your lunch hour pollinating that garden to earn a fruit certificate to exchange for a shitty melon. (Hah hah, just kidding, who gets a lunch hour anymore?)

    Shane Carruth has released his new film, Upstream Color, as a $20 DRM-free download. His previous film Primer is one of my favorites. I don't feel quite as good about Upstream Color, but I still recommend it.

    Someone (an adult) reviewed every Goosebumps book. Eight-year-old-me is jealous. Today-me hopes the reviewer is still okay.

    Here is a version of Astroids that is also a security hole and the author, Michal Zalewski, explaining how it works. This attack is oblique, involves multiple levels of the platform stack, and the information immediately leaked is not usually thought of as a security problem by those under attack. This also describes things like cache timing attacks or the BEAST and CRIME TLS attacks. The biggest challenge facing computer security right now isn't even just plugging all the holes, but explaining to laypeople and novice programmers what kinds of things are risks and threats.

    God of Blades came out for personal computers (a while ago, and I missed it). I'd previously played it on iOS. Satisfying slow-paced hack-and-slash with an underused aesthetic. A bourbon to Devil May Cry's wine. (Bayonetta's tequila? God of War's jello shots?)

    Porpentine's essay, 7 Thoughts on Women in Games had a line that I thought was a critical takeaway for any kind of activism, because it succinctly sums up what's broken about the hyper-libertarianism in so many parts of the Internet today:

    Communities aren’t “just friends”. Sure, they’re often groups of friends based around a common interest, but when a community of friends overlaps or encompasses technical resources, they must take responsibility.

  5. Configuring Emacs on Mac OS X

    I wanted a nice experience using Emacs for Mac OS X. By "nice" I mean:

    • Emacs runs in server mode. It's started like other OS X software by Launch Services.
    • I can connect to it with graphical or terminal-based clients easily.
    • Graphical clients use Cocoa and not X11.
    • There's an icon on my dock to pop up a new graphical frame.
    • There's a shell command I can type to open a new graphical frame.
    • There's something I can type into Spotlight to open a new graphical frame.
    • If the server is dead for some reason, there's a way to start it in a small number of clicks.
    • If the server is dead for some reason, as many as the above features as possible still work.
    • It's easy, but not the default, to start standalone (non-client) Emacs instances as well.

    You too can bring several hours and three separate scripting tools to bear on this, or follow the simple (hah hah) instructions below.

    First, install Emacs For Mac OS X. The Emacs that comes with OS X is old and crusty, and the one at that site is new and Cocoa-ready and Retina-enabled and so on. Put it in /Applications - if you put it somewhere else, you'll need to correct all the other scripts I'm mentioning in this post.

    Emacs Server at Login

    Open up the AppleScript Editor. If you're an Emacs user this probably looks awful and confusing to you. Paste the following into it:

    tell application "Terminal"
       do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs --daemon"
    end tell
    

    Press ⌘K to compile it, then ⌘S and save it in /Applications/Development. (This subfolder keeps your Applications menu clean, and has an important effect on sort order later.) To give it a nice icon, select the original Emacs.app; press ⌘I; click the icon in the top-left; press ⌘C; select on your new Emacs Server.app bundle; press ⌘I; click the icon in the top-left; press ⌘V.

    Open up System Preferences > Users & Groups > Login Items and now you can press the + button and choose Emacs Server.

    The server is invisible until you first connect a client to it. Then it will appear in the dock, as the regular Emacs.app.

    New Frame Dock Icon

    To make a dock icon that opens up a new Emacs frame - a client if the server is available, a standalone instance otherwise - create the following script in the AppleScript Editor and save it as an Application named Emacs Client. in /Applications/Development.

    tell application "Terminal"
        try
            do shell script "/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -c -n &"
            tell application "Emacs" to activate
        on error
            do shell script "/Applications/Emacs.app/Contents/MacOS/Emacs"
        end try
    end tell
    

    Then drag this from the Applications folder to your dock. This will also make it so typing emacs into Spotlight selects this as the first item ("Development" sorts before "Emacs", "Client" sorts before "Server").

    If connected to the server, this opens up a new client frame each click, by design. To just raise existing frames, click the other Emacs icon on the dock, representing the running application.

    Server-aware Shell Scripts

    I put these in ~/.local/bin. You'll need to add that to your $PATH if you haven't already. First, two simple ones. These will start new instances, not clients, but they're necessary to properly handle shell arguments for fallbacks for clients. They're also nice to have if you actually want to start a new instance.

    Start a new Cocoa instance - emacsc:

    #!/bin/sh
    set -e
    /Applications/Emacs.app/Contents/MacOS/Emacs "$@"
    

    Start a new terminal instance - emacst:

    #!/bin/sh
    set -e
    /Applications/Emacs.app/Contents/MacOS/Emacs "$@"
    

    Now for something more complicated - ec, start a Cocoa client or fall back to a new instance (via the above emacsc) if the server is unavailable.

    #!/bin/sh
    
    set -e
    
    alias emacsclient="/Applications/Emacs.app/Contents/MacOS/bin/emacsclient"
    
    if [ "$#" -eq 0 ]; then
            # Emacs doesn't activate itself when there's no filename.
            emacsclient -c -a ~/.local/bin/emacsc &
            sleep 0.1
            osascript -e "tell application \"Emacs\" to activate"
            wait
    else
            emacsclient -c -a ~/.local/bin/emacsc "$@"
    fi
    

    Finally: Some aliases for ~/.bash_profile.

    alias emacsclient="/Applications/Emacs.app/Contents/MacOS/bin/emacsclient"
    alias et="emacsclient -t -a ~/.local/bin/emacst"
    alias emacs="ec"
    export EDITOR="ec"
    

    et is like ec except it starts a terminal client (/ new terminal instance as a fallback); unlike ec it doesn't need to interact with Finder. As a personal preference, plain old emacs should create a new Cocoa client frame.

    Activate Emacs on New Frames

    The AppleScript and shell scripts we made will automatically activate the Emacs application when you start a client through them. What if we start a client some other way? There's a lot of ways Emacs can end up launching and no matter how it does, you probably want the new frame to have the focus so you can just start typing.

    To do this, we can take advantage of the ns features in Emacs Lisp and the frame-creation hooks. Add the following to your ~/.emacs or some file it loads:

    (if (featurep 'ns)
        (progn
          (defun ns-raise-emacs ()
            "Raise Emacs."
            (ns-do-applescript "tell application \"Emacs\" to activate"))
    
          (if (display-graphic-p)
              (progn
                (add-hook 'server-visit-hook 'ns-raise-emacs)
                (add-hook 'before-make-frame-hook 'ns-raise-emacs)
                (ns-raise-emacs)))))
    

    Now anything that opens or selects a frame will also activate Emacs for Finder. The featurep check means this is harmless to load on non-OS X platforms, and ns-raise-emacs is not (interactive) for reasons that will be self-evident if you think about them.

    Remaining Issues

    Launch Services is happy to start the Emacs Server instance but loses track of it afterwards. This is mostly harmless but annoying.

    The second Emacs icon on the dock (the one for the main Emacs.app rather than your custom Emacs Client.app) behaves oddly when no frames are visible. Its menu bar and context menu don't work, and you can't start a new frame from it directly. This is likely an issue because both Emacs and Finder assume any graphical application has at least one main window / frame, even if it might not be visible.

  6. I played: Candy Box

    Candy Box is getting a lot of attention. I'm enjoying it. You should probably go start playing it before you read on, because it's kind of like Frog Fractions or Drop a Beat, Giuseppe! or Dragon Drop (and if you're not sure what I'm talking about, go play all those too).1


    I'm spending way more time with Candy Box that I expected. Even after it opened up what I saw at first was an ordinary energy-waiting-spending mechanism. These are common in F2P games but lately they're found even in other styles2 of game, and I hate them.

    But for Candy Box this is another layer of trickery. If you're really paying attention you get on an exponential feedback loop within about an hour of play. There's the "opening up" after a few minutes, but then also a second at that point, where you start to get meaningful choices on intervals comparable to the time it takes to make the choice. The candy energy becomes almost irrelevant (say, as relevant as how many potions you have in a Final Fantasy game) as you start to consider how you can use the potions and scrolls available. Eventually you get the cauldron and navigable levels and it's more like animation lockdowns than waiting for energy; the scales are so short and there's so many near-term options at each juncture.

    What really drew me in was the mechanism of the Wishing Well (although a similar choice appears with smaller magnitude at other points in the game). It gives you a one-time ability to gain items proportional to the items you have. In a game where the decision space unlocks gradually a one-time ability comes with worries that you might not even know what's important. Between the exponential power curve and granting this ability it becomes a game about patience rather than just a game in which I must be patient.

    When you have to wait two days and can pay $10 to remove that, it's abusive or at least stressful in a bad way. But what is it when you can wait an hour or two days or five days and then invoke an ability - exactly once - to multiply your energy by eight? Then it becomes a game of patience and suspicion. How long can I wait before invoking this? I know if I do it after an hour I'll get to do this new thing. I don't know, but suspect, if I wait a day it's going to open up much more. I don't suspect, but might believe, that if I wait a another day it's going to open even more.

    So it's kind of a game of chicken, but against a static system: When do I think the designer stopped implementing new things? Inevitably the comparison, when would I stop adding new things? How much do I think I don't know? It's constantly asking me that, and I think that's an uncommon question in videogames.


    1. I'm pretty sure there's a new genre forming here. Which is cool; games today need more secrets. 

    2. That "how the game might make money" is now a "style" or "genre" is a frustrating issue in itself. 

  7. Linkspam, May 4th, 2013

    Mike Joffe deconstructs Super Princess Peach and finds that, although it continues Nintendo's history of problematic character design, it also has some unlikely subtext that helped him resonate with Peach's character:

    Bowser's giant vibrating phallus of emotion is too strong for other men, but it leaves him irrational and emotive, allowing the collected, in-control female hero to defeat him with her logical use and understanding of her emotions.

    An essay by Jordan Erica Webber in the latest issue of Five out of Ten, Reflecting Reality, covers similar ground but with a different conclusion while considering Patricia Tannis in Borderlands 2. (There's other good stuff in the magazine too.)

    Aniwey's Candy Box was pretty cool until I accidentally hit backspace and lost a couple (critical) hours of progress.

    High-resolution background art from Final Fantasy IX, cut from the game (probably for size reasons). FFIX is the only one in the series I've respected more as I age (and probably mature). I would love to see these put into a re-release or hacked into the existing game.

    Some recommendations after a week of playing Ludum Dare games:

    I had planned to have more than videogame links here but between Ludum Dare and me being completely disorganized I have forgotten them all.

  8. Ludum Dare 26 - 123456789

    I made a game called 1234567891 for Ludum Dare 26. It's a short web-based puzzle game. At first I didn't much like the theme and wasn't going to do anything. (I prefer to view themes as prompts for something the game should be about, not just a style for the game to be in.) But my wife was playing Hyperdimension Neptunia V all day so I had to do something other than Monster Hunter for a change. It probably took about five hours to make playable and then another two to add sound, playtest and make some interface tweaks.

    I don't really like puzzle three but it's doing double-duty as a hint for puzzle nine, which is inscrutable enough even with it. People are having more trouble with puzzle six than I expected.2 Puzzle eight is perfect.

    The core mechanics and feel are inspired by Nemesis Factor, a toy that felt like something you'd find in an abandoned Martian daycare center. The form is inspired by Anna Anthropy, Leon Arnott, and Liz Ryerson's Triad - a quick riff on a theme and then it's over, no time wasted on a 255 board checklist or "infinite procedural levels!" no one will play.

    Like my last completed Ludum Dare game it uses Perlenspiel and should run properly in any modern-ish browser, including phones and tablets (for which a secret button appears since you can't just press Escape).


    1. No relation to 86856527. Which you should totally play. 

    2. Vs lbh'er fghpx, cerff Pgey+Fcnpr gb fxvc gb gur arkg chmmyr. 

  9. Lego stuff

    I put up the Lego stuff from my old site. LDraw parts for Heroica and a page about X-Pod Play Off. Modified Heroica rules are on hiatus for a while until I figure out the best way to integrate stuff from Ilrion and plug a few new balance holes.

    As far as I can tell Heroica is canceled, though. Lego needs to figure out how to keep their (good) games around for more than a year and a half. They've been scaling back the whole Games line and the only mainstays seem to be Creationary (fine, but not very interesting) and LEGO Champion (horrible, and yet still the only way to get female microfigures who are not an unlicensed Cho Chang).

  10. We Have Never Been Hunters

    I'm playing a ton of Monster Hunter 3 Ultimate. It's the first in the series I've really dug into - I played through the first few village quest levels of Freedom Unite but quit for various reasons. Monster Hunter's a really big game, wide and deep, and my thoughts about it - aside from "I like it, it's fun" - are vague and meandering right now.

    It slowly morphs between a couple different games, each one acting as a tutorial for the next. There are a lot of moving parts and each one feeds into the next one, and some of them feed back as well. You gather and farm (literally, organizing agricultural production; figuratively, performing repetitive actions) to get resources to build tools to let you farm more effectively to hire and train assistants to take on bigger challenges, and repeat. The change is slow, but when you compare one star vs. five star vs. challenge quests, it's sort of like proceeding from gomoku to capture go to proper go. (If you also had to fell and cut lumber for the board and find shells and mine rock for the stones.) Same parts, similar mechanisms, very different game. Each step I have to pick up some new tactic or tool or I risk losing more often.

    This also means it's very slow - I've "beaten" it after around 50 hours, but that really just means I'm now doing high-rank quests. I suspect that high-rank to G-rank is going to be another slow ramp up to a new kind of game.

    The size of the game also dominates online discussion. There's a lot of explanation of what and how because there's a lot to learn (and I don't want to downplay the friendly community) but not much critical analysis of if and why.


    I have a complicated relationship with physical violence in games. I play a lot of horror games (and watch a lot of bloody horror films) and that doesn't bug me; Grand Theft Auto: San Andreas doesn't bug me; Hotline Miami bugs me in what I suspect is exactly the way it's designed to; Saint's Row 3 was really troubling for me; I found Grand Theft Auto 4 more or less unplayable. Intent, magnitude and amount, fidelity, agency, a bunch of different (and non-orthogonal) axes make it difficult for me to guess how I might react or tease out what exactly bothers me.

    Monster Hunter doesn't bother me. There's a fair amount of blood, and everything about it is really brutal: the hits and knockdowns, breaks and carves, bites and smashes. It knows it's toeing some kind of line, and so when you attack the speaking Lynians or the cute Kelbi, it's careful to show them retreating rather than dying.


    There's probably something to say about Monster Hunter and ecology. I'm not smart enough to really dig in, but that won't stop me from writing a bunch of crap.

    First, it's a game that has an ecology in the normal sense. There are fictional books styled as notes from naturalists who have studied the monsters. This offers an ecological interpretation of its game mechanics: The research is a tool for players to learn how to deal with (fight, avoid, steal from, etc.) monsters. Take this description of Qurupeco, an early monster:

    Bird Wyverns with unique plumage. Well known for using their thoracic vocal organs to imitate others monsters calls, first summoning them, then using the distraction to flee. Spits a dangerous combustible body fluid.

    We have the veneer of "real" natural history with a reference to the genus "bird wyvern". This tells the player about its general shape and behavior. It also offers an outline of how it interacts with other monsters in the area and its unique behaviors. Every monster and many other objects in the game have descriptions in this form.

    But Monster Hunter isn't an ecological simulation in the sense of e.g. SimCity where you take on the role of a transcendent planner and explore ecological potentials1. Instead it has an ecology, and you - the player/character - are part of it, unable to cause macro-level change on your own, and instead must prepare and learn about it in order to survive and enable a series of micro-level changes.

    Second, the games' plots usually concern the relationship between particular human settlements and the surrounding environment. Humans in the world of Monster Hunter seem constantly at risk of extinction through large-scale ecological disaster. In the case of 3 Ultimate, a giant monster butting its head against the ocean floor nearby is causing earthquakes.

    Humans don't have any dominion over that space (e.g. the ocean floor), they only mitigate, course-correct, survive. They also aren't very interested in developing a dominion. By the end of the game your village's interaction is broader, but it's not physically larger, and it interacts with the larger space in the same way it did with the smaller one. You can displace the cause of the quakes, but it comes back, or creates a space for other problems - you achieve an equilibrium, not ownership, control, or transcendence.

    But it's also not a "primitive" society. There's global travel, money and trade, advanced metalworking and steam power, domesticated animals, division of labor, bureaucracy, books and scientific research. Some aspects are tribal and agrarian, but most of the culture is late-Enlightenment at the earliest.

    Is it particularly good at any of this? Does it really put forward a coherent viewpoint when considered over the course of all games / quests? Can we learn anything about ecology from it? I've got no idea so far.

    My hypothesis - which like the previous ones, is too coarse - is that we are going to have to slow down, reorient and regulate the proliferation of monsters... Bruno Latour, "We Have Never Been Modern"


    1. But wow, how cool would it be to have a SimCity-like game where you had to live in the city you built. 

  11. Nigoro's "Problem of Faith"

    One of the difficult things when Japanese make games for foreign countries is the problems with faith. From the historical background of Japan the interest in faith has been weak. It’s difficult to understand the feeling of things such as making vows with a hand over the Bible during the presidential inauguration; or how Islamic faith views the absolute moral...

    And it can’t just end there, so what’s OK and what’s bad needs to be thought out, but there is no such rule existing.

    Nigoro, developers of La-Mulana, "Problem of Faith"

    I'm an atheist and I don't necessarily agree with the choices they've made in this instance. But I also see it's a difficult problem, and I can't read their minds and see what they were trying to do in the first place.

    What I do know is that this kind of public discussion about how we use cultural symbols - especially other's cultural symbols - is desperately needed. In the West it really only happens among tiny development teams, one or two people. So to read a reflection on it, from a "large" independent studio whose native language is not English, is a rare treasure.

    The comments, unfortunately but expectedly, are horrible.

  12. I played: The Guardian

    I played Nicole Brauer's The Guardian. It's a Flash-based sidescroller and takes about 20 minutes. (I think? I took a break in the middle.)

    Screenshot of the village in the game

    It suffers from some pacing problems. I hardly ever enjoy screens with slowly appearing text.

    What's cool is how the scale of the game - you're a single pixel - changes how you parse the landscape. Shapes that would be irrelevant details in other games take on an active role helping/hindering you. The scale also changes the primary verb. It's mechanically identical to "jump" but the sizes and angles involved make it feel more like climbing.

    (via Shawn Trautman's Discover Games)

  13. Introduction

    meta

    This blog is mostly to assist my own memory and writing skills, both of which have been getting steadily worse. It will mostly be about (video)games, toys, and software development.

    Posts before this one are things I wrote on an old, shared blog and am not completely embarassed by.

    If you like it, that's cool. If you don't, that's cool too.

    If you care, I'm using Pelican.

  14. Two notes on CMake...

    1. If you actually want to know what the heck it is doing when it fails, make VERBOSE=1 prints the commands it's running. This is dumb, but maybe forgiveable when you consider not everyone compiling the software may be developing it, and most users will only care about the progress meter. Then again, I'd rather get away from non-developers compiling software.

    2. If you actually want to see output when your tests (from add_test) fail, make test CTEST_OUTPUT_ON_FAILURE=1, otherwise the only failure report you get is the name of your executable, not anything it printed - like the list of tests that actually failed. That that isn't on by default is ridiculous.

  15. Highly Unnatural Activities

    I recently finished reading Coders at Work. Rather than another site on the Internet praising it or damning some particular person in it, these are just some quotes that gave me pause.

    [Patterns] show some kind of defect in the language. These patterns are not free. There's no free lunch. So we should be looking for evolution in the language that adds the right bits. Brandon Eich, p.148

    Merriam-Webster's Collegiate Dictionary, 11th Edition. Never go anywhere without it. It's not something you actually need to read, but as I said, when you're writing programs you need to be able to name your identifiers well. Joshua Bloch, p.172

    But people just want to put stuff in. What do engineers do? They write code. And if they are writing a library or writing a language, they want to put their stuff in. You need some presence, some guiding voice... Because there's simply more stuff that you could put in than you should put in to any given language. Joshua Bloch, p.195

    Over the years I've kind of made a generic mistake and the generic mistake is to not open the black box. Joe Armstrong, p.211

    Nobody's going to build a bridge that traverses the Atlantic any time soon. And [unlike normal bridges,] that really might fall down if you built it. But that's not the reason people won't build it - it's just because it'd be too expensive. Whereas nowadays, with software, once you can build bridges over the Channel pretty quickly and cheaply, well then, that becomes a done deal and we now think that's pretty cheap so we'll now try the Atlantic. And now it falls apart again. Simon Peyton Jones, p.280

    Programming is a highly unnatural activity, I'm convinced, and it must be carefully learned. Guy Steele, p.360

    I don't care that the program works. The fact you're working here at all means that I expect you to be able to write programs that work. Writing programs that work is a skilled craft and you're good at it. Now you have to learn how to program. Bernie Cosell, p.542

    Also, Simon Peyton Jones mentioned Steven Clarke's API usability studies, which I was not aware of, and seems like a ridiculously good investment of time and money.

    Peter Seibel (the author) has been aggregating interview questions by topic on his blog, calling out testing and C++ so far.

  16. Sentinel Objects

    One thing I find myself needing sometimes in Python is a very light-weight sentinel value. It's not very common, but when I do need it it has unique requirements. Maybe I want to signal an special condition via a return rather than exception, or I want to return a guaranteed unique key for the caller to pass back later. These often need to be hashable for speed, lightweight in memory overhead, and ideally not compare equally to any other object in the system - so integers, floats, and strings are out. I could write my own class that does nothing, but that fails the "lightweight" requirement.

    Luckily, Python provides exactly what I want in the object base type used by all "new"-style classes:

    a, b = object(), object()
    a == b        # => True
    a == b        # => False
    a.foo = 1     # => AttributeError, base objects do not waste
                  #    memory on instance dictionaries
    { a: 3 }      # {<object object at 0xb7ce3498>: 3}
    

    a is guaranteed to forever be unique in the land of Python variables, and if it's initially created as a local variable, there's no way (short of poking around in the gc) for anything to get an implicit or indirect handle or equal object to it.

  17. I played: Fatal Labyrinth

    Fatal Labyrinth is a game for the Sega Genesis / Mega Drive, available emulated in several collections. It takes a couple hours to finish, but you will probably need to play it multiple times (or save scum) to do so.

    Screenshot of the ending

    As someone who played Nintendo consoles as a kid, my exposure to Sega is pretty much 1) Sonic, and 2) the trainwreck they are now. So Sonic's Ultimate Genesis Collection - the headlining title being the least interesting - is pretty much designed for me. One thing I was stunned to find on it was Fatal Labyrinth which as far as I can tell was the first console roguelike. In fact, released in 1990, it's contemporary with Angband (and so not too surprisingly, it's much more Hack-like than future Japanese roguelikes - persistent levels and only a cursory town).

    Honestly? The game is crap, even if you can fly. But as is usual for roguelikes most comments complain about the reviewer's dislike of fundamental aspects of the genre, rather than the particular implementation. That is if you handed them Shiren, Pokemon Mystery Dungeon, and ADOM, they'd review them all the same.

    What Worked

    The level generation, including secret doors, was fine. I think it was a little more interesting than the random generation present in later Chunsoft-developed roguelikes. Rogue is meticulously balanced in terms of food vs. exploration and Chunsoft games tended to ignore that by eschewing secret doors. While there's an abundance of food in Fatal Labyrinth you can't actually pick it up and need to eat it on the spot, so starvation is a real threat in the early levels if you explore inefficiently.

    The "you've been on the level too long" notification, common in Japanese roguelikes, is found here. Probably for the first time. Between this and the food, the game does a good job of forcing you into progressively harder levels at the right pace.

    There were breeders, enemies that spawn copies of themselves.

    The theoretical difficulty curve was good, but I'll get to some particulars of why it was bad at the end.

    What Didn't Work

    The controls. I don't think I was happy with a set of roguelike controls on a dedicated gaming device until Izuna Ni. Notably, you can't turn without moving.

    The UI. There's some excuse here for the same reason as the controls (I won't blame it for attack numbers getting truncated to two digits) but in other cases it's horrible. You can't see what an item is until you pick it up, you can't see how satiating food is until you eat it, and if you cancel out of the second or third stage of the three-level menu you need to start over from the first.

    Loot is shallow. There's a lot of things (and the full gamut of types - armor, scrolls, wands, rings, and a couple classes of weapons) including some cursed items, but they don't have +X/-X variants variants.

    The key place the game falls over is risk management. The primary goal of the player in a roguelike is to minimize the effect of the random number generator, because unpredictability is always what makes you lose. This problem manifested in two ways. First, damage variance was enormous. Tracking damage per hit looked like 12, 5, 106, 45, 19, 2, 95. Especially when you first encountered enemies I had no idea how much damage they could do, even after they hit me half a dozen times. Even if I knew I was safe I had no idea how long it would take me to kill the enemy.

    Second, I had no options to mitigate non-damage risks. It's common for there to be rings or scrolls that will prevent some class of status ailment or raise your resistance to it but this game had no such thing I could find. I probably spent 90% of levels 15 to 25 confused, and all the items to fix that are consumable. None of the rings or armor offered me resistance benefits I could see, and the enemy attacks could be done at range so using a bow or shuriken did not help.

    Fatal Labyrinth is a game I'm unlikely to ever play again, but as first efforts go it's an admirable re-imagining of Rogue for a console system.

  18. Gender Icons

    While I am as excited for Pop CUTIE! Street Fashion Simulation as the next person (okay, a lot more than the next person), am I the only one that sees the inappropriateness of using a person in a dress as the iconic representation for "can wear this thing that is not a dress"?

    A screenshot of an androgynous character wearing a ceremonial Chinese military uniform

    But really, for a game with a Lu Bu Costume, I'll forgive a lot.

  19. Art in Games

    About five minutes walk outside of Tokione - somewhat risky, but in my opinion worth it - there's an impressive art installation. A small room lifted about three stories up contains an enormous portrait-framed window. Looking out the portrait gives you a beautiful view of the forest, one that you probably ignored not 30 seconds ago while on the ground, even though it's more impressive from down there. It's a thought-provoking rebuttal to Edward Tufte's "depedestalization" - why shouldn't we use thousands of years of artistic experience to make beautiful things stand out, whether they be natural or artificial?

    Of course, the other interesting thing about this piece is that it exists only on the fictional planet of Landroll, in the game Opoona.

    Art is universal to human culture - not necessarily the same forms or themes, but the same drive to abstract, represent, and express creatively. But the worlds of video games are bereft of non-functional elements - like toilets, one rarely finds art in video games. Final Fantasy X has a country united in culture, by religion and by common enemy, and yet has no recognizable architectural, musical, or visual artistic movements. Mass Effect expects us to believe that the only sculpture in the universe is one used to appease a wronged race after a war. How many games have entire palaces without any portraiture or sculpture? By contrast, the world-builders of Star Trek saw fit to create distinct styles of music, painting, literature, food, and even games for each alien race, and writers like Mike Resnick or China Miéville flesh out their alien worlds with an abundance of equally alien art.

    "Fictional art" is a great way to enhance a game world believably and creatively. Its forms can range from the above, to TV shows in No More Heroes and Harvest Moon, books (fiction and non-fiction) in Elder Scrolls games, and the theater in Final Fantasy IX. Wipeout features a huge number of fake corporate logotypes, and Contact even has fictional videogames being sold in a fictional Akihabara! The converse is also true; missing or perverted art can add flavor to a dystopian culture. The state of Fort Frolic and Sander Cohen in Bioshock is particularly shocking because we know how art "normally" works, and how much it has been twisted in the game's world.

    There's another side to this, and that's that video game worlds can provide a platform for art that might be otherwise inaccessible. Building an actual three-story-tall installation in a forest and keeping it up would probably cost more than Opoona did to make, be seen by fewer people (maybe not - the game barely sold 10,000 copies in Japan), and eventually come down. There's another installation in Innocent Life (probably not coincidentally also developed by ArtePiazza) which is a bunch of telephones installed in trees - where are you going to find an orchard to actually do that in?

    There's a lot of unexplored possibilities. Where's the coffee houses filled with a new band every night (discs are definitely big enough now)? Or stand-up comedians? With the cliché cooking minigames, where are the great chefs in Breath of Fire? What music is playing on the Persona 3 protagonist's omnipresent headphones? Does Frank West look up to André Kertész? And when can Hyrule finally get some statues that weren't either built hundreds of years ago and/or turn into Armos?

Page 1 / 1