SUBPROJECTS := 123456789 choicecss heroik matrixcreatrix mlpccg webcart1000 labelle
+.PHONY: all clean superclean update
+
all: $(ICONS)
$(SUBPROJECTS):
clean:
$(RM) $(ICONS)
+superclean: clean
+ $(RM) -r $(SUBPROJECTS)
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<rss version="2.0"
+ xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle"
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <channel>
+ <title>Changes in Enjoyable</title>
+ <link>http://yukkurigames.com/enjoyable/appcast.xml</link>
+ <description>Most recent changes with links to updates.</description>
+ <language>en</language>
+ <item>
+ <title>Version 1.1</title>
+ <description><![CDATA[
+ <p>
+ Mouse simulation now includes drag-and-drop, middle and extended
+ button presses, and horizontal scrolling.
+ </p>
+ <p>
+ The system menu bar now contains a status item when Enjoyable is
+ running. You can enable and disable it and change mappings from this
+ item. It flashes briefly when the mapping changes automatically.
+ </p>
+ <p>
+ Automatic switching for applications with ambiguous names
+ (e.g. "Flash Player") was improved. You can also name a mapping after
+ the application's filename.
+ </p>
+ ]]>
+ </description>
+ <pubDate>Mon, 01 Apr 2013 10:26:13 -0500</pubDate>
+ <enclosure url="http://yukkurigames.com/enjoyable/Enjoyable-1.1.zip"
+ sparkle:version="583"
+ sparkle:shortVersionString="1.1"
+ length="1260799"
+ type="application/octet-stream" />
+ </item>
+ </channel>
+</rss>
--- /dev/null
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name=viewport content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="/css/main.css" type="text/css">
+ <title>Enjoyable - Joystick and gamepad mapping for Mac OS X ~ Yukkuri Games</title>
+ <meta name="Description" content="Use your gamepad or joystick like a mousee and keyboard on Mac OS X. Like joy2key / JoyToKey on other operating systems." />
+ </head>
+ <body>
+ <header>
+ <a href="/">
+ <img src="/logotype_horizontal_1.png" class=logo alt="(◕ ヮ ◕)">
+ <img src="/logotype_horizontal_2.png" class=optional
+ alt="Yukkuri Games">
+ </a>
+ <h1>Enjoyable</h1>
+ </header>
+ <main>
+ <p style="text-align: center; max-width: 70%; margin-left: 15%;">
+ Use your gamepad or joystick like a mouse and keyboard on Mac OS
+ X.<br />
+ <a href="Enjoyable-1.1.zip">
+ <img src="screenshot.png"
+ alt="A screenshot of Enjoyable"
+ style="max-width: 100%"></a>
+ </p>
+ <ul class="download">
+ <li><a href="Enjoyable-1.1.zip">Enjoyable-1.1.zip</a> (1.2MB)
+ <li class="sh"><span data-optional>git clone </span><a href="http://git.yukkurigames.com/enjoyable.git">http://git.yukkurigames.com/enjoyable.git</a>
+ </ul>
+
+ <h2>Requirements</h2>
+
+ <ul>
+ <li>Mac OS X 10.7+</li>
+ <li>One or more HID-compatible (e.g. USB or Bluetooth) input devices</li>
+ </ul>
+
+ <h2>Mappings</h2>
+ <p>
+ I play games with a Playstation 3 controller, so these will be
+ useless if you have a different controller. These are the
+ mappings I use for games I like. To use them, just save them and
+ double-click on them in Finder, or use ⌘O in Enjoyable to import
+ them.
+ </p>
+ <ul style="font-size: 0.9em;">
+ <li><a href="mappings/6180%20the%20moon.enjoyable">6180 the moon</a></li>
+ <li><a href="mappings/Anodyne.enjoyable">Anodyne</a></li>
+ <li><a href="mappings/BasketBelle.enjoyable">BasketBelle</a></li>
+ <li><a href="mappings/Canabalt.enjoyable">Canabalt</a></li>
+ <li><a href="mappings/Forget-Me-Not.enjoyable">Forget-Me-Not</a></li>
+ <li><a href="mappings/KRUNCH.enjoyable">KRUNCH</a></li>
+ <li><a href="mappings/Probability%200.enjoyable">Probability 0</a></li>
+ <li><a href="mappings/Red%20Rogue.enjoyable">Red Rogue</a></li>
+ <li><a href="mappings/Runner2.enjoyable">Bit.Trip Presents Runner 2: Future Legend of Rhythm Alien</a></li>
+ <li><a href="mappings/Super%20Hexagon.enjoyable">Super Hexagon</a></li>
+ </ul>
+
+ <h2>License</h2>
+ <div class="copyright">2013
+ Joe Wreschnig, 2012 Yifeng Huang, 2009 Sam McCall
+ <p>Enjoyable is free software written by Joe Wreschnig and is
+ based on the Enjoy codebase written
+ by <a href="http://nongraphical.com">Yifeng Huang</a>
+ and <a href="http://abstractable.net/enjoy/">Sam McCall</a>.</p>
+
+
+ <p>Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:</p>
+
+ <p>The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.</p>
+
+ </div>
+ </main>
+ </body>
+</html>
--- /dev/null
+{
+ "name" : "6180 the moon",
+ "entries" : {
+ "1356:616:1~Button 8" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Button 7" : {
+ "type" : "key press",
+ "key" : 125
+ },
+ "1356:616:1~Button 6" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Button 5" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 16" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Button 4" : {
+ "type" : "key press",
+ "key" : 53
+ },
+ "1356:616:1~Button 15" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 1" : {
+ "type" : "key press",
+ "key" : 15
+ },
+ "1356:616:1~Button 12" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Button 14" : {
+ "type" : "key press",
+ "key" : 49
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "name" : "Anodyne",
+ "entries" : {
+ "1356:616:1~Button 6" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Axis 1~Low" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Button 1" : {
+ "type" : "key press",
+ "key" : 53
+ },
+ "1356:616:1~Button 7" : {
+ "type" : "key press",
+ "key" : 125
+ },
+ "1356:616:1~Button 15" : {
+ "type" : "key press",
+ "key" : 8
+ },
+ "1356:616:1~Button 8" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Axis 1~High" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Button 16" : {
+ "type" : "key press",
+ "key" : 7
+ },
+ "1356:616:1~Button 13" : {
+ "type" : "key press",
+ "key" : 36
+ },
+ "1356:616:1~Axis 2~High" : {
+ "type" : "key press",
+ "key" : 125
+ },
+ "1356:616:1~Button 4" : {
+ "type" : "key press",
+ "key" : 36
+ },
+ "1356:616:1~Axis 2~Low" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 5" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 14" : {
+ "type" : "key press",
+ "key" : 7
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "name" : "BasketBelle",
+ "entries" : {
+ "1356:616:1~Button 6" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Axis 1~Low" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Button 7" : {
+ "type" : "key press",
+ "key" : 125
+ },
+ "1356:616:1~Button 15" : {
+ "type" : "key press",
+ "key" : 7
+ },
+ "1356:616:1~Button 8" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Axis 1~High" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Button 16" : {
+ "type" : "key press",
+ "key" : 7
+ },
+ "1356:616:1~Axis 2~High" : {
+ "type" : "key press",
+ "key" : 125
+ },
+ "1356:616:1~Button 4" : {
+ "type" : "key press",
+ "key" : 36
+ },
+ "1356:616:1~Axis 2~Low" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 5" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 14" : {
+ "type" : "key press",
+ "key" : 53
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "name" : "Canabalt",
+ "entries" : {
+ "1356:616:1~Button 13" : {
+ "type" : "key press",
+ "key" : 7
+ },
+ "1356:616:1~Button 9" : {
+ "type" : "key press",
+ "key" : 27
+ },
+ "1356:616:1~Button 7" : {
+ "type" : "key press",
+ "key" : 125
+ },
+ "1356:616:1~Button 5" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 16" : {
+ "type" : "key press",
+ "key" : 7
+ },
+ "1356:616:1~Button 4" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Button 15" : {
+ "type" : "key press",
+ "key" : 7
+ },
+ "1356:616:1~Button 1" : {
+ "type" : "key press",
+ "key" : 53
+ },
+ "1356:616:1~Button 10" : {
+ "type" : "key press",
+ "key" : 24
+ },
+ "1356:616:1~Button 14" : {
+ "type" : "key press",
+ "key" : 7
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "name" : "Forget-Me-Not",
+ "entries" : {
+ "1356:616:1~Axis 2~Low" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 8" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Button 7" : {
+ "type" : "key press",
+ "key" : 125
+ },
+ "1356:616:1~Button 6" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Button 5" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 4" : {
+ "type" : "key press",
+ "key" : 36
+ },
+ "1356:616:1~Button 16" : {
+ "type" : "key press",
+ "key" : 36
+ },
+ "1356:616:1~Button 15" : {
+ "type" : "key press",
+ "key" : 36
+ },
+ "1356:616:1~Axis 1~Low" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Axis 2~High" : {
+ "type" : "key press",
+ "key" : 125
+ },
+ "1356:616:1~Axis 1~High" : {
+ "type" : "key press",
+ "key" : 124
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "name" : "KRUNCH",
+ "entries" : {
+ "1356:616:1~Button 8" : {
+ "type" : "key press",
+ "key" : 0
+ },
+ "1356:616:1~Button 7" : {
+ "type" : "key press",
+ "key" : 1
+ },
+ "1356:616:1~Button 6" : {
+ "type" : "key press",
+ "key" : 2
+ },
+ "1356:616:1~Button 5" : {
+ "type" : "key press",
+ "key" : 13
+ },
+ "1356:616:1~Button 16" : {
+ "type" : "key press",
+ "key" : 6
+ },
+ "1356:616:1~Button 4" : {
+ "type" : "key press",
+ "key" : 53
+ },
+ "1356:616:1~Button 15" : {
+ "type" : "key press",
+ "key" : 6
+ },
+ "1356:616:1~Button 14" : {
+ "type" : "key press",
+ "key" : 53
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "name" : "Probability 0",
+ "entries" : {
+ "1356:616:1~Button 8" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Button 7" : {
+ "type" : "key press",
+ "key" : 125
+ },
+ "1356:616:1~Button 6" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Button 5" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 4" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Button 16" : {
+ "type" : "key press",
+ "key" : 7
+ },
+ "1356:616:1~Button 15" : {
+ "type" : "key press",
+ "key" : 6
+ },
+ "1356:616:1~Axis 1~Low" : {
+ "type" : "key press",
+ "key" : 55
+ },
+ "1356:616:1~Button 14" : {
+ "type" : "key press",
+ "key" : 12
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "name" : "Red Rogue",
+ "entries" : {
+ "1356:616:1~Button 11" : {
+ "type" : "key press",
+ "key" : 3
+ },
+ "1356:616:1~Button 6" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Button 7" : {
+ "type" : "key press",
+ "key" : 125
+ },
+ "1356:616:1~Button 15" : {
+ "type" : "key press",
+ "key" : 7
+ },
+ "1356:616:1~Button 12" : {
+ "type" : "key press",
+ "key" : 3
+ },
+ "1356:616:1~Button 8" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Button 16" : {
+ "type" : "key press",
+ "key" : 6
+ },
+ "1356:616:1~Button 13" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Button 4" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Button 10" : {
+ "type" : "key press",
+ "key" : 8
+ },
+ "1356:616:1~Button 5" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 14" : {
+ "type" : "key press",
+ "key" : 9
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "name" : "Runner2",
+ "entries" : {
+ "1356:616:1~Button 6" : {
+ "type" : "key press",
+ "key" : 2
+ },
+ "1356:616:1~Axis 1~Low" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Axis 4~Low" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Button 7" : {
+ "type" : "key press",
+ "key" : 1
+ },
+ "1356:616:1~Button 15" : {
+ "type" : "key press",
+ "key" : 38
+ },
+ "1356:616:1~Button 12" : {
+ "type" : "key press",
+ "key" : 59
+ },
+ "1356:616:1~Axis 3~High" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Button 8" : {
+ "type" : "key press",
+ "key" : 0
+ },
+ "1356:616:1~Axis 4~High" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Axis 3~Low" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Button 16" : {
+ "type" : "key press",
+ "key" : 40
+ },
+ "1356:616:1~Axis 1~High" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Axis 2~High" : {
+ "type" : "key press",
+ "key" : 125
+ },
+ "1356:616:1~Button 13" : {
+ "type" : "key press",
+ "key" : 12
+ },
+ "1356:616:1~Button 4" : {
+ "type" : "key press",
+ "key" : 36
+ },
+ "1356:616:1~Axis 2~Low" : {
+ "type" : "key press",
+ "key" : 126
+ },
+ "1356:616:1~Button 5" : {
+ "type" : "key press",
+ "key" : 13
+ },
+ "1356:616:1~Button 14" : {
+ "type" : "key press",
+ "key" : 53
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+{
+ "name" : "Super Hexagon",
+ "entries" : {
+ "1356:616:1~Button 9" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Button 8" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Axis 1~High" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Button 6" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Button 12" : {
+ "type" : "key press",
+ "key" : 124
+ },
+ "1356:616:1~Button 4" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Button 11" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Button 15" : {
+ "type" : "key press",
+ "key" : 49
+ },
+ "1356:616:1~Axis 1~Low" : {
+ "type" : "key press",
+ "key" : 123
+ },
+ "1356:616:1~Button 14" : {
+ "type" : "key press",
+ "key" : 53
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+<?xml encoding="utf-8"?>
+<html>
+ <head>
+ <title>Rogue (1980)</title>
+ <style>
+ body { font-family: sans-serif; width: 80%; margin-left: 10%; }
+ </style>
+ </head>
+ <body>
+ <h1>Rogue (1980)</h1>
+ <h2>Exploring the Cavern of Cuties</h2>
+ <div style="width: 70%; margin-left: 15%;">
+ <blockquote style="font-style: italic;">
+ With as much time as game designers and critics
+ think and write about the specifics of game interactions, it's
+ often useful to step back and look at the basics. Let’s ask a
+ simple question: why are there so many video games dealing with
+ social interaction and relationships, and so few that explore
+ violence and action-oriented gameplay?
+</blockquote>
+ - <a href="http://ludusnovus.net/2011/08/15/why-so-few-violent-games/">Gregory
+ Weir, <em>Why So Few Violent Games?</em></a>
+ </div>
+ <p>
+ This question is critical to understanding the value, despite
+ otherwise negative attitudes, of <em>Rogue</em>, a
+ roleplaying game from the early 1980s. <em>Rogue</em> is usually
+ noted at best as a historical anomaly, one of the first games
+ that visualized a sense of space but with otherwise uncompelling
+ mechanics; at worst, it has been called a "murder simulator" and
+ "training for psychopaths".
+ </p>
+ <p>
+ Rather than try to adapt the existing dialogue and interpersonal
+ mechanics of text-driven fantasy adventure games to their new
+ interface for spatial navigation, the creators decided to add in
+ a variety of weaponry and offer exclusively utilitarian
+ fashion. In addition to the usual romantic options, the game
+ allows you to hit monsters with swords. This puzzling choice
+ might be related to its authorship - it was designed by college
+ students studying computer science rather than out of the more
+ usual fields like sociology or psychology.
+ </p>
+ <p>
+ <em>Rogue</em> was poorly received at the time of release. Historians
+ decried the mixture of weapons and armor from disparate
+ periods. Experts in weaponry were frustrated by its limited
+ tactics. <em>Drawing Room</em> magazine, a contemporary publication
+ for gaming hobbyists, said in its column "The Role of
+ Computers",
+ </p>
+ <blockquote>
+ The sweeping cinematic fight scenes found around the table in
+ games like <em>Counts and Courtship</em> are totally absent. The
+ difference between the precision of a duel, the chaos of a
+ bar-room brawl, or the stealthy preparation for an assassination
+ - all lost to a mush best described as "bumping and grinding"
+ that would have been better served to provide more variety to
+ the game's interpersonal interactions.
+ </blockquote>
+ <p>
+ Nonetheles, I think it provides an interesting view into the
+ world Weir hypothesizes - one in which games work with conflict
+ as often as cooperation, physics as much as politics.
+ </p>
+ <hr/>
+ <p>
+ The games controls are available by entering <kbd>?</kbd>, then
+ <kbd>*</kbd> for a list of commands. In addition to expected
+ ones like <kbd>f</kbd>lirt, <kbd>g</kbd>ift, and
+ <kbd>E</kbd>mbrace, the game supports <kbd>w</kbd>ield,
+ <kbd>z</kbd>ap, and other violent verbs. If <kbd>esc</kbd>
+ doesn't work to cancel a command, try <kbd>ctrl+g</kbd>; this
+ appears to be another artifact of 1980s code.
+ </p>
+ <p style="text-align: center">
+ Download Rogue (1980) for<br/>
+ <a href="rogue-1980-linux.zip">Linux</a>
+ - <a href="rogue-1980-win.zip">Windows</a>
+ - <a href="rogue-1980-osx.zip">Mac OS X</a>
+ - <a href="http://git.yukkurigames.com/?p=rogue-pphs.git;a=summary">Source</a>
+ </p>
+ <p>
+ Please note that this source code is from 1981 and written in
+ pre-standardized C. Only minor effort has been undertaken to
+ make it compile on modern computers, mostly related to 64 bit
+ cleanliness. It may crash, and it certainly will have security
+ problems if installed, as used to be traditional, with
+ setuid/setgid on a multi-user system.
+ </p>
+ <hr/>
+ <p>
+ If you're confused, don't worry! Everything above this line is a
+ half-truth at best. This was a game designed
+ for <a href="http://www.electricopolis.net/2013/03/29/pphs-jam/">♥♡♥
+ THE PULSE POUNDING HEART STOPPING DATING SIM JAM ♥♡♥ in
+ 2013</a>. <a href="postpartum.html">I've written some more about what it "really" is and why I made it</a>.
+ </p>
+ </body>
+</html>
--- /dev/null
+<!doctype html>
+<html>
+ <head>
+ <title>Rogue (1980) (2013)</title>
+ <style>
+ body { font-family: sans-serif; width: 80%; margin-left: 10%; }
+ </style>
+ </head>
+ <body>
+ <h1>Rogue (1980) (2013)</h1>
+ <div style="width: 70%; margin-left: 15%;">
+ <blockquote style="font-style: italic;">
+ what idiot called it roguelike instead of roguehate
+ </blockquote> - <a href="https://twitter.com/pillowfort/status/322083264175144960">@pillowfort (Mat Jones)</a>
+ </div>
+ <p>
+ (What follows is some mostly unorganized thoughts about
+ designing and playing the game, and then some unorganized
+ explanation of the code changes. The title of this modified
+ game, by the way, is <em>Rogue (1980)</em>, to distinguish it
+ from <em>Rogue</em>.)
+ </p>
+ <p>
+ This game was an experiment. Not in the usual sense of
+ "experimental" game design as something mechanically unusual,
+ but rather as a system designed to prod at a particular problem
+ - abundance of violence / lack of romance - when played. It's
+ not trying to be a "correct" implementation of dating in a
+ roguelike setting. Rather I'm considering how "deep" our combat
+ mechanics actually are (they're not, and most modern games are
+ actually less so than <em>Rogue</em>), and what we demand of
+ them vs. what we demand of dating mechanics.
+ </p>
+ <p>
+ I was trying to reverse-triangulate a game design for a
+ universe in
+ which e.g. <a href="http://auntiepixelante.com/triad/">Triad</a> is
+ unexceptional. If comfortable cuddling rather than explosion was
+ the default theming of our puzzle games, what might that games
+ industry have produced during its formative years?
+ </p>
+ <p>
+ I chose <em>Rogue</em> to start with because its core design can
+ be traced up to many modern titles, often barely changed or even
+ simplified. That's kind of bullshit, isn't it? Thirty years and
+ we're still making games with the same kind of rules about the
+ same kind of violence, then claiming we don't try emotion
+ because it's "difficult" to mechanize. I also chose it because
+ it's a game I enjoy and know well.
+ </p>
+ <p>
+ I don't want to unpack too much about my own game here
+ because, who cares? I'm no expert at games criticism. But I do
+ want to mention a few things.
+ </p>
+ <p>
+ Adding flirting to the game made the combat mechanics so much
+ grosser. In roguelikes you kill a <em>lot</em> of stuff, usually
+ unprompted and as an invader. But no one would
+ call <em>Rogue</em> a violent game. Well, when you put in a
+ flirt command, that ends. Just by having a non-violent choice
+ the resort to combat mechanics, otherwise unmodified, becomes
+ more disturbing. I'm convinced if we had made even token efforts
+ towards including this stuff early on, there's no way we'd be
+ looking at such gross shit like <em>Far Cry 3</em> today. The
+ dissonance would be too great.
+ </p>
+ <p>
+ Similarly the source code is still loaded with references to
+ "kill", "enemy", "attack", etc., even for non-violent
+ actions. Problematic units run through the architecture,
+ content, and output of the program creating a structural,
+ intersecting push back against my attempts to add non-violent
+ options. The age of the code means it's fragile and creaky, and
+ the changes required to fix this would be destabilizing beyond
+ what I could deal with given the time I had to make it.
+ </p>
+ <p>
+ Although you can attract multiple monsters, at the end of the
+ game you can only leave with one. This is my least favorite
+ decision - I'd rather you be able to leave with all nearby
+ monsters when you quit. But again, the base game encodes a very
+ specific (and inaccurate) notion of violence - one specific
+ entity is the cause of killing you. Mapping that system into
+ "non-violence" then forces monogamy.
+ </p>
+ <h2>Mechanical Stuff</h2>
+ <p>
+ <em>Rogue (1980)</em> adds two character attributes and three
+ verbs to <em>Rogue</em>. The first attribute
+ is <em>orientation</em>. It's a set of six on/off flags. Every
+ monster has a randomly-generated orientation. The player also
+ has an orientation attribute, which would maybe better be called
+ presentation - the degree to which the monster's orientation
+ mixes with the player's determines the probability of a
+ successful <kbd>f</kbd>lirt. There's no notion of gender or sex
+ beyond this representation; that may mean there's no notion of
+ gender or sex at all depending on how you interpret it.
+ </p>
+ <p>
+ Successful flirting raises the other new
+ attribute, <em>interest</em>. When interest gets high enough,
+ the monster stops attacking the player and starts
+ accepting <kbd>g</kbd>iven gifts.
+ </p>
+ <p>
+ Orientation also determines how a monster reacts to gifts, as
+ the item ID is hashed to produce an "item presentation". Gifts
+ raise interest much faster than flirting.
+ </p>
+ <p>
+ Once interest is high enough, you can <kbd>E</kbd>mbrace the
+ monster to end the game. You get a score bonus proportional to
+ the experience points the monster would have given for a kill.
+ An optimum score is now reliant on getting the amulet and then
+ dating a <tt>D</tt> or <tt>P</tt> on the way back up. Dating
+ them is not actually harder than dating any given <kbd>B</kbd>
+ or <kbd>K</kbd>.
+ </p>
+ <p>
+ At one point during development embracing enemies was an
+ alternate method to get rid of them rather than another endgame
+ state. If you succeeded they disappeared and dropped a new kind
+ of food item, a date. It was too goofy, and too much
+ "romance-as-conquest". At another point when I was frustrated
+ with debugging the pre-ANSI C, I was just going to write a much
+ longer false context and release <em>Rogue</em> unmodified, but
+ I'm not a good enough writer and that was too lazy even for me.
+ </p>
+ <p>
+ The source code alternates between calling <kbd>@</kbd> and the
+ player "he" and "she" with a preference for the masculine.
+ There's only one instance of a neutral "him/her". Interestingly
+ it's in the context of <kbd>W</kbd>earing, which is the action
+ most closely associated with real-world gender roles, even
+ though <em>Rogue</em> has no gendered clothing. (Wichmann also
+ says armor was a late addition to the game, so maybe it's just
+ because it's from a different developer than the other
+ comments.) This is years before e.g. the D&D manuals would
+ do the same. In roguelike communities today, I don't think I've
+ ever seen anyone call the original <kbd>@</kbd> a woman.
+ </p>
+ <p>
+ Do you have a problem with any of this stuff? Cool! I'm just a
+ mostly-conventional cis man who spent my formative years
+ playing <em>Rogue</em>, the real one. Which is to say, I'm sure
+ I'm blinded to a lot of things going on here. Roguelike culture
+ has always been big on remixing and reinterpreting. I would love
+ to see reconstructions of <em>Hack (1985)</em> and <em>Angband
+ (1990)</em> and so on, even just descriptions of what they might
+ be like. Or any feedback / reactions really.
+ </p>
+ <h2>More Reading</h2>
+ <ul>
+ <li><a href="http://www.gamasutra.com/view/feature/4013/the_history_of_rogue_have__you_.php">The
+ History of Rogue: Have @ You, You Deadly Zs</a> on Gamasutra;
+ Ken Arnold and Glenn Wichmann weigh in in the comments.</li>
+ <li><a href="http://www.wichman.org/roguehistory.html">Glenn
+ Wichmann's <em>A Brief History of "Rogue"</em></a>, this one
+ accurate to our universe.</li>
+ <li><a href="http://www.blackgreengames.com/games.html">Black
+ & Green Games</a> publishes some neat things that might as
+ well be <em>Counts and Courtship</em>. (Other people have as
+ well, but those are the ones I'm most familiar with.)</li>
+ </body>
+</html>