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.
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.
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.
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.
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(functionrender(now){varstate0=get_previous_state();varstate1=get_current_state();varp=(now-state1.timestamp)/interval;// 'interval' is the same thing passed to setExactInterval.varrender_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.
Undoubtedly it's mostly wrapping gettimeofday,
GetTickCount, and related system calls. ↩
And similarly, this is probably clock_gettime,
QueryPerformanceCounter, and so on. ↩
If the next frame is late, it will even extrapolate for
you. You can view this as a bug or a feature. ↩
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.
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.
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:
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.
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.
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/shset -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"waitelseemacsclient -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(defunns-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.
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.
I'm pretty sure there's a new genre forming here. Which
is cool; games today need more secrets. ↩
That "how the game might make money" is now a "style" or "genre"
is a frustrating issue in itself. ↩
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:
Rapid Tunnel Future by syre. One-button racer-ish shmup-ish
arcade game. My wife recently got an old Game Boy Micro from work
and this would be great on it next to dotstream and COLORIS.
0 by Cosmologicon is a learn-it-yourself puzzle game with a
cool core mechanism.
Dragon Drop by Tom 7. Don't dismiss it quickly: There are two
ways to "win", and every hand can be won both ways. If you ever have
to choose "Restart", you've lost.
I had planned to have more than videogame links here but between Ludum
Dare and me being completely disorganized I have forgotten them all.
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).
No relation to 86856527. Which you should totally play. ↩
Vs lbh'er fghpx, cerff Pgey+Fcnpr gb fxvc gb gur arkg chmmyr. ↩
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).
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"
But wow, how cool would it be to have a SimCity-like
game where you had to live in the city you built. ↩
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.
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.
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.)
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.
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 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.
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.
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.
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# => Truea==b# => Falsea.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.
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.
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.
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"?
But really, for a game with a Lu Bu Costume, I'll forgive a lot.
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?