Effective Java & Pro JavaFX 2

Two new reviews for the Java Books archive. Effective Java is every bit as good as people say, and then some. Pro JavaFX 2 is on the other end of the spectrum, a mishmash of good and useless chapters that just barely clears the one-star hurdle.

Effective Java — Joshua Bloch, Addison-Wesley 2008 (2nd ed.) (****)

This is not just the best book on Java, but one of the best I’ve read on any programming subject. Every Java developer will benefit from Bloch’s solid advice and thorough exploration of language quirks, on a par with classic namesake Effective C++. Unlike that collection of arcana, however, Bloch’s lucid writing and broad coverage of essentials also make Effective Java a great introduction for users of other languages. Buy this book even if you don’t buy any other Java books, and buy it as soon as possible.

Pro JavaFX 2 — James L. Weaver et al., Apress 2012 (**)

With most JavaFX literature still based on version 1, this is the first comprehensive title for the current release. However, if you’re expecting a practical guide to building user interfaces you’ll be disappointed. The chapters on layout and common controls are maddeningly short and vague, inferior even to Oracle’s own free tutorials. JavaFX 2’s standard markup language FXML gets a ludicrous seven pages of coverage while an incredible 135 out of 619 pages are wasted on Visage, the informal (and now largely abandoned) successor to the obsolete JavaFX Script. This is shameless content recycling at its worst.

Pro JavaFX 2 has some merit regardless. JavaFX comprises not only UI controls and FXML, but also a complex new application infrastructure. The chapters devoted to aspects of that subject – concurrency, data binding with properties and collections, interaction with web services – are quite detailed and well worth reading. Lastly, chart controls and media playback are explained rather thoroughly, for whatever reason. You’ll have to decide for yourself if these bright spots justify putting up with the book’s significant content gaps, never mind the often clumsy and repetitive writing. JavaFX deserves better than this.

2013-06-15: On a related maintenance note, I moved my reviews of Windows Books from the general Development section to the .NET Archive section where they join all other subjects specific to Windows programming.

And from NewsBlur to RSSOwl

Bad news. NewsBlur’s feed update delays that I had originally considered a minor issue grew nastier the more I looked into them. They have now caused me to cancel my subscription while I could still reasonably ask for a refund. NewsBlur appears to have a history of trouble accepting push notifications or otherwise keeping smaller feeds up-to-date. Since I do subscribe to a bunch of somewhat esoteric feeds, I didn’t want to wait around until the situation got any worse. It didn’t help that NewsBlur’s replies when I asked about my own feed (itself irrelevant but a good test case!) consisted of deflecting the complaints while being unable to fix them. So in spite of the service’s other advantages, I cannot recommend it anymore.

The one good thing to come out of this sorry episode is that I finally enabled push notifications, for those services that do correctly listen to them. Meanwhile, I’ve briefly tried the mega-popular Feedly but my opinion has not improved. I don’t really like its display, it’s still extremely dependent on Google, not even allowing a separate login or OPML import, and I worry that the promised new backend will crash and burn when Google Reader is switched off in July.

So for now, I’ve abandoned all attempts to find a true replacement for Google Reader and have instead reverted to a local reader application. This time I chose RSSOwl since development of FeedDemon has already stopped. RSSOwl is a cross-platform Java application based on the Eclipse UI framework, and works just as well as FeedDemon based on my first impressions. The one drawback is its insistence to use a 32-bit JRE on Windows due to a native dependency. I generally recommend that people stay away from Oracle’s 32-bit JRE, but here it is necessary. Just make sure to keep the browser plugin disabled…

WordPress Caching & Pushing

A couple of unexpected issues came up after last month’s weblog move. First, Jetpack’s “Top Posts & Pages” widget (here titled “Popular Posts”) has a well-known bug: only 9–10 entries appear, even when a higher limit is set in the WordPress dashboard. I posted an explanation and PHP fix on the Jetpack support forum. Hopefully a maintainer will take note and patch the next release. Until then, you can easily edit the buggy PHP file yourself.

2013-05-31: Plugin author George Stephanis replied that the 10-post limit was intentional, so as to enable better caching in the statistics module. The real bug was the widget UI allowing numbers up to 20 rather than 10, hence the confusing discrepancy. The next Jetpack release should have a unified upper limit of 10 entries, minus the front page which never shows up in “Top Posts & Pages.” For now you can use my PHP fix to get more entries if you like.

WP Super Cache

Next, I installed WP Super Cache even though my current traffic doesn’t really warrant caching. The reason was that my cheap hosting plan demonstrated why it’s so cheap: the shared MySQL database that backs the weblog went down for over four hours, showing all visitors a blank page! The static HTML files created by WP Super Cache don’t require a database connection, so I should be able to bridge the next such occurrence. Those static files should also load faster, but that’s probably not very noticeable at the current traffic level.

Some words on configuring WP Super Cache. I’m generally using the recommended settings except for CDN which I don’t really see the need for. Mobile device support is disabled since I’m already using a responsive theme. All posts are preloaded daily (1440 minute interval). Preloading is a bit awkward to control but works well in practice. The daily refresh updates the lists of recent & popular posts which would otherwise remain static.

2013-06-04: The feed files were getting re-cached several times per hour, despite being unchanged. Turns out that feeds always use a “legacy” WP Cache method that excludes them from cache preloading. This means that cache timeout applies (WP Super Cache Settings: Advanced: Expiry Time & Garbage Collection) which is otherwise ignored when preload is enabled. And the default value for this timeout is far too low. I changed the cache timeout to 86400 seconds (= 1 day), and likewise the garbage collection scheduler to once daily. That’s plenty when everything else is preloaded. Don’t worry, the feed files are still getting rebuilt instantly when their content actually changes.

2013-06-13: Weird bug: a cache preload interval of exactly one day (1440 minutes) does not appear to work. The preload simply doesn’t happen, neither at the specified time nor later. Intervals of slightly less than one day, e.g. 1400 minutes, do seem to work correctly.

PubSubHubbub

Finally, NewsBlur support pointed me towards PubSubHubbub as a way to avoid excessive NewsBlur update delays. This is a standard method for Atom/RSS push notifications that I was totally unaware of. Blogger and Tumblr support PubSubHubbub by default, and so does WordPress.com. Guess what doesn’t? That’s right, self-hosted WordPress.org installations such as mine. Neither the base package nor Jetpack include this apparently essential feature.

Happily, there’s a zero-configuration plugin that provides PubSubHubbub support over two popular community hubs, Google’s and SuperFeedr’s. The latter has already been working with NewsBlur for a while. So I hope future posts on this weblog will appear instantly on NewsBlur, and also on any other news service that uses these hubs.

Update: Apparently this plugin specifies an incorrect default hub URL. When I saw no push transmitted to NewsBlur, SuperFeedr support told me to change http://superfeedr.com/hubbub to http://pubsubhubbub.superfeedr.com. Let’s see if that works…

2013-06-01: Julien Genestoux (see below, hi!) confirmed that SuperFeedr is getting properly pinged with my updates now, and that those are getting properly pushed out to subscribers. Unfortunately, that still excluded NewsBlur which claimed my feed is real-time without having actually subscribed to the hub! I eventually canceled my account over these issues, but at least other services should now get push notifications from me.

From Google Reader to NewsBlur

I think I’ve finally found a good replacement for FeedDemon (Windows) and Reeder (iPad), the two commercial clients I had been using to access the Google Reader backend. Time was running short, with Reader shutting down in July and those two clients not supporting any other synchronization scheme. The most popular choice, Feedly, does not appeal to me. Its interface is too simplistic, and I’m deeply suspicious of another free service without a clear business model. Instead, I settled on NewsBlur. (Update: No longer, please see below.)

Samuel Clay’s paid service has been around since 2010. Its rather modest 1,500 daily users exploded to 50,000 when Google announced the shutdown of Reader. By now the flood has receded a bit, and NewsBlur has rapidly upscaled to accommodate a larger and growing customer base. Speed and availability are currently fine. According to NewsBlur statistics, 5,581 “premium” (paying) and 6,436 “standard” (free trial) users were online yesterday. At $24 per user & year, that looks comfortingly sustainable. Check out Adrianne Jeffries’s article for more information on NewsBlur’s history and its recent redesign.

NewsBlur Features

Aside from the service’s solid three-year history, successful expansion after the Google Reader influx, and sustainable business model, these are my reasons for picking NewsBlur.

  • Fantastic interfaces. The web app for desktop browsers is easily on a par with FeedDemon, a native Windows application. You get the same configurable three-pane layout with a large number of hotkeys, and even nearly the same speed.

  • The free iOS app lacks some functionality and polish by comparison, but is still perfectly usable. Remarkably, both web and iOS app can show articles in either Lucida or Georgia, and at a variety of font sizes to boot! (There’s also an Android app I didn’t try.)

  • Articles can show corrections within the text, using strike-through and colors, whenever NewsBlur had fetched an earlier version of a story and then later a changed version. I don’t think I’ve ever seen that feature in another news reader.

  • NewsBlur is fully open source, including the apps, and offers a documented API. This is not relevant to keeping the servers running, but it’s a nice gesture nonetheless, and possibly enables third-party clients, as well as enhancements and bug fixes.

NewsBlur also offers features I wouldn’t count as advantages, namely its own private social mini-network in the form of “shared stories” with comments and followers. Fortunately you can ignore this nonsense if you don’t want it.

Update: NewsBlur Trouble

Immediately after posting this recommendation I discovered one important drawback that you should be aware of. Just like Google Reader, NewsBlur updates smaller feeds very slowly if they don’t send push notifications. I haven’t seen the days of delay threatened in the NewsBlur FAQ, but my own feed got classified with a 9.5–12 hour update cycle. This delay is visible in each feed’s statistics panel (web client only). Push notifications would force an update but WordPress doesn’t send those, and I’m no longer going through FeedBurner which did.

Fortunately, the feed options (on both web and iOS) also include “Insta-Fetch Stories” which appears to instantly refresh the feed in the shared database. So I’ll have to do that manually whenever I make a new post. Interestingly, neither the NewsBlur FAQ nor NewsBlur support who told me about feed statistics mentioned insta-fetch. I’m guessing they don’t want people to overuse it, but for now this leaves a bad taste in my mouth. I would have expected a paid service to check each feed at least once per hour. I still maintain my recommendation in view of NewsBlur’s excellent clients and a lack of good alternatives, though.

2013-06-01: After digging deeper, I decided to cancel my account as NewsBlur appears to have pervasive problems with feed updates that they cannot fix and refuse to acknowledge.

Reader Emigration Trouble

One problem did occur during the transition to NewsBlur, but that turned out to be Google’s fault. Specifically, a few of my ca. 150 subscriptions had not been imported. As it turned out, that was because they had not been in my current FeedDemon export file either! Apparently Google Reader had stopped accepting new subscriptions a while ago, and FeedDemon had silently omitted those rejected subscriptions from its OPML export file, even though they appeared correctly in FeedDemon’s own feed list. Something to watch out for if you’re making a similar transition from a third-party client coupled to Google Reader.

I had to dismiss another promising service, Feed Wrangler, because its OPML import simply aborted on multiple attempts, after about a third of my subscriptions. To their credit, they refunded my subscriptions within a day. I’ve heard of a similar problem with The Old Reader but haven’t tried that service myself. Wherever you go, you’ll want to double-check that all your subscriptions have actually arrived at the new service.

Rolling Your Own

I briefly considered writing my own multi-device feed reader without server-side code, just using JavaScript and “dumb storage” (FTP or WebDAV). Open-source readers that require a full server already exist, e.g. Tiny Tiny RSS, but I wanted to see if I could avoid that.

Parsing OPML and fetching feeds using XMLHttpRequest should be straightforward. Synchronization is a bit problematic since JavaScript cannot write to FTP servers. XMLHttpRequest is supposed to do that, but browsers don’t implement any protocol other than HTTP(S). That leaves WebDAV which is accessed through HTTP. So the reader would have to request WebDAV credentials, presumably store them in a local cookie, and then write state data to the WebDAV server. So far, so good.

But what state data should be written? Storing the read state of every single article, let alone the full articles themselves, would quickly grow to a volume that needs a proper database. So realistically, I’d only store the last read date per feed and declare all newer articles unread. However, that means that all feeds and articles need to be fetched from the original site in every session. This makes looking through a feed’s history slow and unreliable, or outright impossible when an old article has dropped out of the current XML feed file.

That’s not really better than just using a single-device reader with a proper local archive, never mind an excellent web service such as NewsBlur. For now I’ve shelved the idea of writing my own minimal reader.

RSS Praise & Nostalgia

The outrage over Google’s shutdown of Reader has died down, but March and April saw a couple of noteworthy articles that I wouldn’t want to leave unquoted. So here’s another batch of hopefully premature epitaphs on the red-headed stepchild of social media.

MG Siegler, What If The Google Reader Readers Just Don’t Come Back? RSS is not just a major traffic source in its own right but also seeds social media linking.

Reader’s users, while […] relatively small in number, are hugely influential in the spread of news around the web. In a sense, Reader is the flower that allows the news bees to pollinate the social web. You know all those links you click on and re-share on Twitter and Facebook? They have to first be found somewhere, by someone. And I’d guess a lot of that discovery happens by news junkies using Reader.

Marco Arment, The power of the RSS reader. If you don’t see the point you’re doing it wrong.

The true power of the RSS inbox is keeping you informed of new posts that you probably won’t see linked elsewhere, or that you really don’t want to miss if you scroll past a few hours of your Twitter timeline.

Annalee Newitz, Magazines have finally killed blogs – but in a way you never expected. Reader-controlled syndication is an aberration. The historical norm are publisher-controlled bundles and walled gardens.

That’s why RSS readers were so remarkable — they let you take information from everywhere and organize it however you like. Your Wired stories were filed in the same place as your Entertainment Weekly stories. Everything was mixed together in an information jumble. […] Information in the world of RSS is not organized into silos that resemble magazines or social networks.

Ryan Holiday, Our Regressive Web. RSS gives readers power over what and how they consume, and that’s exactly why publishers and advertisers hate the format.

When a site stopped delivering a quality product, I had the satisfying ability to withdraw my subscription. Apparently that power was threatening. […] RSS is impervious to blogging’s worst, but most profitable, traits: [banner ads, slide shows, click baits, pagination, etc.] No wonder nobody ever pushed for widespread adoption of RSS.

Meanwhile at Google

While shutting down Reader and retiring its RSS browser extension, Google introduced Google+ Notifications, another Chrome extension that tracks website updates. Of course, as Panayotis Vryonis complains, those websites must be Google+ pages, you must be logged into Google+ yourself, and Google will analyze the sites you visit to check for Google+ links.

That’s a terrible replacement for a proper RSS reader, but it fits Ben Thompson’s interpretation of Google+ as a global identity and tracking service. Contrary to what pundits usually focus on, it’s quite irrelevant how many people chat on G+ compared to Facebook or Twitter. Google cares more that people are constantly logged into G+ while browsing other websites than whether they are active on G+ itself.

Every feature of Google+ – or of YouTube, or Maps, or GMail, or any other service – is a flytrap meant to ensure you are logged in and being logged by Google at all times. […] Make no mistake, Google+ has been a massive success. Credit to Google for their willingness to be misunderstood and portrayed as a loser even as they mine information Mark Zuckerberg can’t even dream of.

Eclipse: New Dawn for Strategy Games

Eclipse: New Dawn for the Galaxy is Big Daddy Creations’ recent iOS port of the popular 2011 board game. Thematically, Eclipse is a space 4X game and insofar resembles many PC classics of that genre, most famously Master of Orion by SimTex. Mechanically, however, Eclipse is a Euro-style board game, and that’s where things get interesting.

Eclipse is far from the only space 4X game on iOS. Chimera Software’s acclaimed Starbase Orion is a more straightforward continuation of the PC legacy: huge and lengthy, firmly rooted in the “more is better” ideology, a veritable galaxy simulator with an abundance of buttons and features, numbers and lists. Eclipse is the opposite, and that’s what I like about it.

The User Interface

Eclipse is far from trivial – indeed I recommend obtaining the board game rules from Board Game Geek to get an idea what’s going on. However, the learning curve is mostly a result of the board game heritage. Some rules may surprise veteran PC gamers (more on that later), and the extremely compact presentation is heavy on icons that you simply have to memorize.

On the upside, the game is played almost entirely from a single screen, with combat resolution as the major exception. The first of the following screenshots shows the sparse galaxy map, and the second shows all available UI panels. That’s it – almost the whole game at a glance! Once you know your way around it, this design allows very rapid gameplay with a minimum of context switches or extraneous inputs.

Eclipse Map

Eclipse Panels

The only dedicated action buttons are the ones in the lower right. Otherwise, all icons do double or triple duty: they show available resources and/or actions, some can be tapped for more detailed information, and some can be dragged to initiate an action. “Research Track” shows available technologies and their costs; drag a highlighted item to your “Technology Track” and it’s researched. “Ships” shows available components to the left, using the same icons as the corresponding technologies. All information is visualized directly within the icon: sparks for energy draw, multiple dots for multiple points of damage or protection, etc. Drag a highlighted component to a ship design and all ships of that type are upgraded. These UI mechanics are a direct translation of the counters and panels that ship with the board game, and they work extremely well in Big Daddy’s implementation.

The Good: Fast & Focused

Eclipse offers a respectable diversity of player actions, but tightly restricts how many can be performed. The entire game runs for only nine turns, and each player’s actions per turn are limited by an “influence” meter. Controlled sectors and performed actions each cost influence – essentially money, supplied by one of the three kinds of planets. Should you ever go so far into the red that you cannot pay for your influence, you’ve automatically lost the game due to bankruptcy. Similarly, there are limits to how many ships you can build in total and per action, and how many ships you can move at once.

This means every single action matters, and the range of possible actions reflects that. There are no planetary buildings, let alone build queues. Planets are naturally specialized for one of three outputs (money, science, materials) and that’s all. This seems primitive at first, but I found it removes much pointless tedium compared to standard 4X games while making the “terrain” of space more important. Go conquer another sector if you need a different planet, that’s what the game is all about!

Research and ship upgrades are relatively detailed but likewise show a welcome focus on essentials. While a few technologies are incremental upgrades, research isn’t dominated by boring 5% bonuses or dreary Laser 1-2-3 progressions as in certain popular PC games. Eclipse’s combat is designed for six-sided dice, so every single modifier point can change the outcome of a battle. Moreover, nearly half of all technologies represent new abilities or non-combat bonuses. Each player can research only a fraction of all available technologies in one game, so specialization is inevitable.

Since Eclipse is originally based on physical counters, production and expenses increase in predefined steps that represent non-linear point increases. For example, the fifth science planet provides two extra research points rather than one. This is another simple and effective means of rewarding focus and specialization.

Finally, I’m quite fond of the semi-interactive combat system. Two fleets automatically fire on each other, with players deciding where to assign hits and whether to withdraw. The system is simple but also fast and elegant, reminiscent of older space 4X classics like SSG’s Reach for the Stars. Some people love elaborate tactical combat layers in strategy games but I’m not one of them. I feel they slow down the bigger game too much, and they tend to either make strategic decisions irrelevant or else become meaningless busywork themselves.

The Bad: Abstract & Random

The board game heritage also results in some excessive abstractions, due to the idiosyncracies of physical markers and tiles. If your influence meter is full you cannot take any more actions, even if you’re swimming in gold. Players can arbitrarily rotate sectors upon “discovery” to determine their wormhole connections, and discard unwanted ones. The number of explorable sectors is not limited by space or time, but rather by the number of sector tiles in the original board game. Technologies become randomly available for research, and mysteriously have only one or two “copies” each: researching the last one denies the next player that technology.

The so-called “virtual fleet” strategy is entirely based on Eclipse’s abstract build system. Since you can build ships anywhere instantly, a virtual fleet (i.e. one that does not yet exist) is strategically more valuable than a real one, as the latter must slowly travel across the map! This somewhat resembles chess where the best moves often just threaten pieces rather than taking them. On the opposite end of the spectrum, buying units in Civilization is possible but inefficient. It’s an emergency action that rather feels like cheating – you’re supposed to “realistically” build units in high-production cities. Eclipse completely ignores such concerns of simulated reality.

Winning the game is not decided by controlling the galaxy, as one might infer from the theme, but by the dreaded concept of victory points. Only a fraction of those comes from occupying sectors. Another major source is winning battles, regardless of who ends up owning the contested sector. Worst of all, you can simply pick the “Victory Points” option when you discover an ancient relic! Usually, when presented with the nonsensical choice of 2 VPs versus a unique powerful relic you’re better off taking the 2 VPs. This is perhaps my least favorite aspect of Eclipse.

As in any dice-based game, there’s also a rather excessive component of random chance. Two-player games are all but pointless since they are dominated by the luck of early exploration. The player who finds better nearby sectors and wins the first few battles against sector guardians almost invariably wins. The minimum number of players for a decent game of Eclipse appears to be four. Here, a leading player may be targeted by multiple opponents who can also form diplomatic relationships, giving each a small resource boost. This somewhat mitigates the randomness, although several good or bad die rolls in a row can still be decisive.

Game Design Lessons

Eclipse surprised me, as I’m more familiar with computer games than modern board games. Despite its flaws, the game and its iOS port are in some ways far superior to traditional PC strategy games. I’ll try to formulate my impressions as two design lessons.

Minimize Numbers.  Avoid showing naked numbers – especially large numbers or percentages. Quantities should be shown as symbols that can convey multiple quantities of different qualities. Formulate game mechanics in terms of small whole numbers. Refine them by introducing new qualities associated with integral quantities.

Minimize Actions.  Where possible, make symbols interactive to avoid extra UI controls. Every game action must involve a choice, so remove all predictable or inevitable actions. Impose artificial limits to avoid repetitive actions. AI governors imply design failure. If an action can be automated, remove it from the game instead.

Closing Remarks

Although Eclipse for iOS is quite polished overall, there are some defects and annoyances. First, Big Daddy Creations requires an e-mail account even for single player! The official excuse is future cross-device matchmaking. Asynchronous multiplayer is hampered by unreliable notifications and a total lack of turn replays. Fortunately the AI is quite good, if sadly addicted to plasma missiles. Lastly, the initial release has a number of bugs which BDC is working on. One important bug lets players keep production from sectors abandoned due to bankruptcy, as described in this comment.

If you’d like to know more about Eclipse, Kelsey Rinella and Michael Barnes wrote two glowing reviews. Brandon Cackowski-Schnell describes the typical experience of the novice Eclipse player, i.e. losing a lot. If that happens to you, consult Taogaming’s very helpful Five Thousand Words about Eclipse and David Ogren’s reply on Stack Exchange.

Zen Pinball & Pinball FX2

Zen Studios makes digital pinball games for a variety of platforms, marketed as Zen Pinball on Apple iOS and Sony PlayStation 3 & Vita, and Pinball FX2 on Xbox 360 and lately Steam for Windows. The popular series boasts numerous licensed Marvel Comics and Star Wars tables. Within the realm of digital pinball, Zen hews closer to Nintendo’s cheerfully unrealistic Metroid Prime Pinball than to the austere simulation of Pinball Arcade. Mechanically impossible gadgets and mini-games abound, the ball physics are rather suspect, and there’s even a comet-like glowing trail following the ball.

For my part, I don’t much enjoy Pinball Arcade but I love Zen/FX2! While not on the sublime level of LittleWing Pinball, Zen handily beats my previous second choice on iOS, Gameprom’s Pinball HD. The tables are just as pretty and thematically attractive, but much fairer – fewer balls shot straight through the flippers, more generous ball saves and kickbacks, and no tasks that require impossibly lucky shots. Your best way to judge for yourself is the new Steam version, it’s free and offers time-limited demos of all available tables. Here are some tips to enjoying the series:

  1. Skip the licensed tables, unless you’re a huge fan of some particular property. I found them generally inferior to the original tables – too much licensed product placement, not enough solid gameplay.

  2. Use landscape orientation even on iOS, and pick a zoomed-in roaming camera view. The best angle varies with platform and table but it’s usually 3–6. In my experience, this “frog perspective” makes all tables much clearer and more playable. Counterintuitively, the default overhead perspective tends to obscure the table mechanics.

  3. Pay attention to the instructions in the top-left grid display, and download the extensive official table guides to learn about the gameplay mechanics. The mini-games in particular can be somewhat inscrutable.

The iOS and Steam versions currently share only two original tables, but happily this includes the excellent Tesla (pictured below) and the hilarious Shaman. Of the other original iOS tables, three are very good as well (Epic Quest, Excalibur, Paranormal). The one table I found rather dull is Sorcerer’s Lair, which unfortunately is also the free default table. I advise you to buy another table or try the Steam version before judging the game based on Sorcerer’s Lair.

The Steam version sells tables in fairly expensive packs rather than individually, but the outstanding implementations with full gamepad support are worth it. The original tables are split between the Zen Classics Pack (including Tesla and Shaman) and the Pinball FX2 Core Pack, and they all range from decent to excellent in my opinion. 2013-05-30: Epic Quest is now also available on Steam.

Tesla Table

Voltage Fluctuations!