Flythrough.Space Retrospective

I’m not going to rehash don’t remake an old game, but the principle very much applies. Flythrough.Space is a 3d remake of the EV series, and as such suffers from the “remastering someone else’s game” problem. That said, it was a long and involved software project, so there’s got to be something to take away from it, right?



Content Design

Don’t do content design up front. I had reams and reams of content for this project, a holdover from an even older project, making the oldest data seven years old! And the design of the map dates back to an EV Nova TC I attempted in 2005 or 6. The first plan involved using the graphics from Onyx’s Old Shipyard, back when the whole thing was going to be sprite based. FTS, while using the existing data, was 3d from the beginning so needed its own entire suite of assets.

I ended up using Blender because it’s Free Software and I wanted to keep the toolchain as free as possible. I wanted anyone to be able to pick up the same tools and build more content. It took me a while to become minimally proficient with Blender. One thing that ended up looking really cool was making rough textures with blender’s texture paint then applying a “paint” layer in GIMP with clean lines but dusted up with a rough brush and a makes for a worn look. The ships aren’t exactly up to modern standards, but I’m proud of the results nonetheless.

The planets turned out pretty good. Never did nail clouds though.

inshes.png

Technology

Flythrough.Space started out with very basic requirements. I wanted to do the game in 3d, I wanted menus, I wanted to be able to write object oriented code and I wanted to be able to break code into multiple files. Web was a platform I’d been working on for my whole career up to that point, and I wanted to make the game very easy to pick up and play, so web it was. There was a long period of using babel and Angular to compensate for the shortcomings of JS, but eventually we got all the goodies right in the browser! Once I was working in vanilla ES6 with no precompiler or other baggage, working with the code was pretty much a joy.

ECS

I tried to build an entity/component system. All of the game’s behavior is implemented in “systems” which are functions that get run each frame, requesting entities that have specific components to work on. For example:

export function velocitySystem(entMan){
  // Provides inertia.
  for (let ent of entMan.get_with(['velocity', 'position'])) {
    // Do physics
  }
}

The game state all belongs to entities or the player save object. This turned out to be a fairly awkward way to program a game. It was very nice that, say, velocity or AI could be added to any entity pretty easily. But there just weren’t that many different classes of things in FTS. A class hierarchy wouldn’t have become overly complicated, considering the small number of different entity types in the final game (ship, beam, planet, asteroid, projectile, explosion.) One major drawback was how it changed the code layout of the project. If you want to see what code controls the behavior of a ship, you need to browse several different files and it’s extremely unintuitive. Likewise, if you want to know what parameters a ship can have, there is similarly no single place to check out. There is no FTS bible. One possible evolution would be to put every possible ship param into the implicit base class, but then you’ve got a few parameters where absence matters…

Collisions

I wrote a primitive collision library myself, and my attempt to integrate a proper one later was frustrated by a lack of the primitives I needed, specifically objects with no rotation components.

The crowning achievement of the collision system is the line segment collider. Managing to implement (not invent, mind you, merely implement) allowed continuous collision detection which made combat work much better. It also enabled beams, which are a staple of the genre.

Missions

The missions system leverages ES6’s actually very nice text interpolation to make nice templated text. It uses eval all over the place to do it. It’s a bit fiendish how it works, and it works very nicely for stuff like “deliver cargo” but to add features like “go blow up ship” you’d need to add something in the system code to spawn ships depending on active missions. Probably wouldn’t even be so hard, but it’s low hanging fruit that I haven’t picked. Missions where a very late addition, right before the Alpha release. The json to define a mission looks like this:

  "smuggle": {
    "short_name": "Smuggle ${cgo(this.cargo.type)} to ${this.dest.spob}",
    "desc": "Some shady exporters need ${this.cargo.amount} tons of ${cgo(this.cargo.type)} moved discretely.",
    "offer_if": "true",
    "offer_state": "missions",
    "cargo": {
      "type": "${get_illegal_cargo()}",
      "amount": "randint(5,10)"
    },
    "dest": "get_spob_same_govt()",
    "reward": 14000,
    "accept_modal": {
      "text": "The dockhands quietly load the mislabeled containers of \"${cgo(get_legal_cargo())}\" into your hold."
    }
  },

But that sort of thing only covers random cargo missions. I’d designed the world for FTS without giving too much thought to how it would become involved in any sort of story, besides the idea that the Loyal Suns wanted to take everybody over and the Itaskans wanted you to visit every homeworld. This is a problem because in EV games, you’re supposed to play missions to unlock faction ships, and most of the ships in the game (especially the ones I’m most proud of) where faction ships. My inelegant solution: all ships available all the time. No dynamism. Nobody wins or looses. Some people just fight sometimes and if you hail them they’ll give you the slogans of their government. I think that without plotlines, there isn’t much of a hook. There’s certainly no endgame besides grinding up to an Absolver, Nightshade, Capital, Taoiseach, etc.

Data Driven

Every ship, star system, etc is defined in json files. Many previous game attempts had done a lot of work on making a perfect data loader. In this case, I was able to leverage Javascript’s own builtins to make something I’d consider basically perfect (or at least perfect in that it represents an idea taken to its full extent.) You can declare another object as a given object’s prototype and it just works, inheriting values that aren’t overridden. Objects are created on screen by instancing the data (with some enhancement, of course, but it’s all fairly easy to follow.) There’s no intermediary data is what I’m getting at; the javascript objects in the data directly translate to javascript objects in-game. Upgrades work by acting like a diff. Getting all of this to just work was one of the funnest parts of the project and will be the hardest part to let go of.

Community

The babylonjs community, by way of their forum, was extremely helpful. Having real live people who want your project to succeed and can help you use the tools they’ve built is a joy. I would definitely recommend treating community as a critical feature when picking frameworks and libraries.

That said, you also need to cultivate a community around your own project. That’s one angle where I failed in a big way. It isn’t easy to get other people to demo your game. Starting with something very you can get right into, rather than starting a player out as some sort of lowly level one wimp in an RPG might make a lot of sense. I eventually added cheat codes in the form of querystrings (bonus points if you can find them by looking through the source) so players could start in more powerful ships (and so that I could test them without grinding.) But without a large number of testers, tons of bugs slipped through the cracks. It took me way to long to realize that using Control as the fire button simply wasn’t going to work on mac, for example.

If you want to use FTS

I tried to do with FTS what Ambrosia never did with EV: make a totally open system that anyone can pick up, make a game, and truly own that game with. FTS is licensed under the GPL so if you throw in your own assets and release any code changes, you (yes, you!) can make a commercial EV Clone with it. The game scenario lives in the data and assets folders. If anyone has specific questions about how to implement something, I’d be glad to help. But I realized something: nobody is going to mod your game if they don’t love your game. Making a game easy to mod needs to be a secondary concern to making a great game. If you really truly want to build technology rather than a game, I would recommend partnering with someone with a vision for an excellent game, which brings us to our next point.

Putting the cart before the horse

I thought I knew exactly the game I was trying to build from scratch. However I was building it largely in a vacuum and I certainly wasn’t going back to EV Nova to see how the ship movement and turn speed compared. This was probably a mistake. I was so mired in what I could achieve technically that I wasn’t stopping to ask if the game I was building was actually fun or not.

I should have spent the bulk of the development on the basic combat loop, making sure the ship handling was fun, the AI was correct and tight and fun to play against, and the game balance was decent. Instead I focused on creating tons of content and features because I was trying to work from a feature checklist. Feature parity with a twenty year old game does not a compelling game make, as it turns out. On paper, FTS has what it needs, but I feel that it does not live up to that potential.

It’s a mistake I don’t intend to repeat. Future projects I’d like to get in front of people faster, I’d like to be less stuck on design decisions I didn’t even make, and I’d like to have the emotional fortitude to disengage from a project before it takes up half a decade.

Giant robot submarines, we’ve got those too

One interesting aspect of most knowledge being instantly accessible is the holes in that knowledge-things from the before time that never got ingested into the web and as such still mostly exist in your memory. I find myself trying to fill in those gaps sometimes. I found myself asking “what the heck was this old toy series I remember?” Not everything will get the Toys That Made Us treatment.

pink robotic lobster toy

I picked up a set (not pictured) at what I seem to remember being an aquarium gift shop, but it could really have been any pit stop on the mass pike, back in the 90s or early 00s. The scifi theme and being unencumbered by a fleshed out fictional universe was appealing.

More recently, I decided to figure out what the heck they where. I didn’t have the original handy, but after googling some vague descriptions, an imageboard (of all places!) pointed me in the right direction with a very accurate rendition that sparked my memory.

I’ve now got a decent handle on what the internet seems to know about Silverlit Toys’ Multimac. There isn’t much of it. They can be had on ebay (see the lobster above.) There are good pictures of the drivers here, as well as some information.
some good pictures of the crustacean-shaped submarines as well. There are a couple of forum posts here and here that put it in context (how it related to other lines, where parts where reused, etc.)

But really, these just create more questions than answers. Especially looking at the shark, lobster, and crab shaped submarines I’m reminded of Lego’s Aquazone line – which one came first? Or was there a general atmosphere of “giant animal shaped robots piloted by humans” in the 90s?

I had a small breakthrough when looking at the packaging of the lobster and crab though – I believe that they are a later addition to the line because they have a URL on their packaging! It might be possible to date them by when that became common practice, but now I’m eager to actually dig up the site!

This one is small and hard to read.

And this one has a label over the URL, but a upon close reading they appear to have just owned “www.oceandiscovery.com”

And in 2001, the internet archive captured a copy!

And that’s it, everything the English-Speaking internet knows about this (dare I say mysterious?) line. I suppose that’s what made it appealing at the time: the suggestion of a wider world, a connection to a past (specifically the giant-robot-and-vehicle toy-verse that included more popular lines like Transformers and Zoids) that I didn’t really have knowledge but the matter-of-fact-ness of the packaging suggested it. It was as if to say “yeah, you know, giant robot submarines. We’ve got those too.”

Never will I ever (Pandemic: Week 9)

Having tons of time to fill can show you something about yourself: what will you really get around to? What, given unlimited time and boredom will you still never do or try?

Things I did do:
Music
Painting 40k miniatures
Working on Flythrough.space
Messing with Godot
landscaping
Boardgame (especially Machi koro)
Doom Eternal
Heroes of the storm
Deep Rock Galactic
Try to run old Java games
Obsess over the Cosmic Frontier Kickstarter
Lego
Walks
Rowing
Blogging

Things I did not do (yet)
Soldering
Painting battletech
Setting up a 3d printer
Getting into emulated games
Get up to speed on modern C++
Exploring the small internet
Hardware synths
Brewing beer
Sewing masks
Playing all the unplayed games in my Steam library

It’ll be at least three more weeks before this experiment ends, so


*Except as a home for our food horde

Pandemic: Week 8

We have a tentative back-to-the office date now: June 8th. That’s the best case scenario.

It’s finally official-we’ve got an alternate date for the wedding in October.

This has been an exhausting week, so I’ll just leave you with a smattering of links.

https://www.theatlantic.com/magazine/archive/2020/06/underlying-conditions/610261/

https://www.npr.org/2020/05/07/851712311/u-s-field-hospitals-stand-down-most-without-treating-any-covid-19-patients

https://www.newyorker.com/news/us-journal/how-the-coronavirus-pandemic-has-shattered-the-myth-of-college-in-america?utm_source=pocket-newtab

https://local.theonion.com/man-not-sure-why-he-thought-most-psychologically-taxing-1843004933

Pandemic: Week 7

Lucky number 7. We successfully flattened the curve in Mass, avoiding hospital overcrowding. The fight is far from over, but it seems like the horror of Lombardy will not be visited on us. As long as we stay inside. Meanwhile New York was devastated and some places are already opening up. The uncertainty isn’t over, and there is no new normal yet.

Making exciting amounts of progress on flythrough.space. In order to get fleets into the game I’ve needed to do a bit of refactoring, but it’s actually been very nice because everything player-related goes through the PlayerSave object so as I hack it up I’m also adding unit tests. I probably should have written them a long time ago, but the second best time to write tests is right now!

We’ve had a couple of mercifully sunny weekends to bookend the dreadful rain so we’ve been making great progress on our project to clear the vines and pricker bushes out of our yard. The vines are Bittersweet (we think Orbicalatus) and have already brought one tree down. We’d like to prevent it from taking the next one down too. Be somewhat cautious when fighting with bittersweet vines-many of the scratches got alarming (though temporary) reactions. Speaking of trees, the town took down a tree in our front yard that had enveloped some power lines and that might be the most exciting thing that happened all week.

Pandemic: Week 6

Are we nearing the end? It’s a bit of a time of suspense – will the quarantine end soon, or are we in for another month or two? Uncharted territory.

Had a really fun DnD session via Zoom. I guess it’s finally time to make the jump to 5th edition. They really streamlined the Wizard class. We’ve also been taking long drives to nowhere.

I’ve been making really rapid progress on http://flythrough.space. I expect to do something resembling a release soon. I’m not sure when I should call it done. There’s certainly more space to fill out, more balancing, and, like, sound. But Plunder, shot impacts, and other real game features are in. And I seem to be nearly done with ship models, leaving only some tidying up and shot models to go.

Digital Native: workflows

Made in Renoise with a Monologue sample, the same Cheetah drumkit I used for BattleMETAL, and an Ob-Xd. Mastered in Reason.

I wrote the melody in Reason (sequenced on some ABL-3s, played on Manis Iteritas), exported each measure as a separate file, then imported them all into Renoise and painstakingly sequenced them back in order so I could write drums on top. Then I exported the tracks, put the drums back into Reason, and finished the track. This took quite a bit of time but the results speak for themselves.

Sequenced entirely in reason, with mouse-edited drums and mostly ABL-3’d synths (starring the TAL-Bassline 101).

ABL-3s driving Manis Iteritas again, except this time the sequences where random! I let the machines go and automated the whole thing in one epic train ride into Boston.

Pandemic: week 5

The Culprit

This week got interesting. 60mph winds took down power lines and left our street (along with hundreds of other people in New England) without power. I remember how safe we’d felt when we stocked up. Having to throw away so much meat that had spoiled was painful, as was having to go out again, as was having the illusion of security shattered.

This week we, bizzarely, saw protests demanding an end to the lockdown. They appear to be AstroTurfed.

Pandemic: Week 4

We’re in the shit now. People I know and family of friends are starting to test positive. I imagine that this will be a difficult spring. Horror stories are coming out about what it’s like to be on a ventilator. Send a letter to your grandparents.

I can only speak for myself, but any attempt to suppress my vote this November by disrupting the USPS will be unsuccessful.

Pandemic: Week 3

This is where we started the week, giant tent hospital in the middle of central park. Vigilantes locking people in their homes. Some are still flagrantly violating the quarantine order but as evidenced by video of empty streets, it seems that most are complying. More people in the US have died of Covid then died on 9/11.

(u/Mholz)

Scott Aaronson wrote a very strong Mean Culpa regarding his initial reaction to the outbreak. I’d like to see more of these. Here’s mine: I totally bought into the propaganda that masks don’t help. They obviously do and I’m a contrarian idiot for arguing even the most watered down version of the anti-mask position.

In the context of private industry being praised for it’s response to the pandemic, this article is very interesting, showing how the medical device industry utterly failed to produce the ventilator stockpile that we now so desperately need. We needed a Manhattan project, we got a OICW program. Speaking of utter failures, this opinion piece by the Boston Globe clearly lays out the case against the trump administration.

We’ve run out of Bananas, beginning our slow crawl towards needing to go out and get food again. My worry is that we’ll be unable to stock up for longer then a week again and be forced to return to the grocery store too frequently. I’m hoping that the panic will have turned to a grim march by that time. We shouldn’t need to go out and get food until next week.

I can’t believe we’re three weeks in. It feels like just yesterday that I was back at the office. I keep telling myself that I’ve adjusted well, but I’m not so sure.

But hey, I released Digital Native, a collection of tracks I’m extremely proud of. I also published (on this blog) my essay laying out the case against fan remakes.