2018 May Dev Update

It’s time for our monthly update on XO’s progress.  May was another productive month as you’ll see. This is the longest update we’ve ever done, mostly because a lot of items we have been working on over time happened to get completed last month.


Defending the fleet
Defending the fleet


You may recall that the enemies in the game are called Harvesters, because they latch on to ships, carry them back to their mothership and, well, harvest the crews from them (ew!). They then discard the lifeless ship as we might do with a lobster shell.

Well, I’m happy to say that crews and their related functionality are now fully complete. Here’s how it all works:

One unit of crew represents all the people required to operate a starship. Each ship requires one crew of a specific faction. Each crew consumes 1 unit of water. Some ships can carry passengers — basically extra crew. These ships can rescue crew from lifeboats, and evacuate crew from stations and ships. Oh and you can’t evacuate people who don’t want to be evacuated — at least, not with a simple evacuate command!

Ships without a crew are abandoned – and so if you have a spare crew matching the faction of that abandoned ship, you can put the crew aboard and take possession of the ship.

And because of the Harvesters, you’ll not only come across crews looking to be rescued, but abandoned ships… so having spare crews is quite helpful.


Coming across an abandoned tanker
Coming across an abandoned tanker


Along with this, if one of your ships becomes disabled, you can now issue an abandon ship order! This drops the crew into a lifeboat. Lifeboats can’t jump but they do keep crews alive indefinitely.

This is reasonably important for a couple of reasons – once a ship is disabled it begins slowly tumbling into the atmosphere where it eventually burns up. So abandoning ship to a lifeboat buys you time to rescue a crew even if you can’t repair the ship. You don’t want to leave crew behind for the Harvesters… you’ll make an enemy of that faction for sure. Oh and you can’t abandon ship if the ship is already latched by Harvesters — but you can fire on your own ships and disable them if you so desire.

Right now there are three ships that can carry passengers. Your battleship has space for one. The new Rover getter has space for two, and the Irenic cruiseliner has space for four. (Passenger capacity and the number and types of ships that carry them may change before release…)

There’s an additional command available to an abandoned warship: self destruct. You can choose to blow the ship up on your command, or when the first enemy reaches it. The ship blows up the same as a nuke, in a big ball of doom that wipes out anything nearby. Like the crew functions, these commands are fully completed.

Now once all this was implemented, of course we caught a few edge cases. For example, we made sure that you couldn’t rescue or obtain Harvester crews! We’ll probably find others as we continue to test.

In the meantime, Heru continued to refine and improve trade. Now your battleship info panel automatically comes up when you begin trading so it’s easier to trade items. Repairs done via trade come as a single use package, for example Repair +5. Caches were incorrectly charging the player for items, now they are free, and the number of items in a cache are limited to one of each type. Cache items are also limited to the faction’s allowable types. The trade action now occurs where it was specified in the structure of the event, instead of always at the beginning. Ships available through trade now honor other rules (e.g. you can’t get another battleship through trade).


Getting items from a cache
Getting items from a cache


As of now, /where/ you decide to jump matters even more, because Heru added another tag to our event system, the faction tag. Events with this tag will only occur at destinations ‘owned’ by the specified faction. For testing I have almost all of the events locked to specific factions, although I am likely to loosen that up as I add more events.

Speaking of events, we currently have 136 events! 89 of those are narrative, where player choice makes a difference in the outcome. The rest are trade, pure combat, and abandoned ship events. I’m trying to write at least one narrative event every workday. I’m happy to say that my ideas for new events continues to outpace my ability to write them, and I’m having a lot of fun with them.

I also continue to make small improvements to the automated script for creating events I’m using. In the last month I made eight improvements to that script, mostly to add new functionality introduced by Heru, or add new ships. The pipeline for creating events is really smooth now.

Heru also added minDay and maxDay tags, which allow me to restrict certain types of events to happen before, during or after certain times in the game. This is really helpful so that the larger fleet encounters don’t occur on day three and utterly wipe you out. I’m experimenting with using these tags to help with the narrative flow of the game, but I won’t give anything away there.

Another tag was implemented, the denyShipTypes tag, which allows me to control the maximum number of certain types of ships that the player will be able to get. Now the player won’t get more than one refinery ship, or too many barges for example.

With these tags in place I was able to craft a series of introductory events. These set up the narrative and help the player see what kinds of things are possible to do in the game. All but the first will be optional. Depending on how well these work in alpha, we may not need a formal tutorial.

Another set of event tags were put in place that allow me to issue Rules of Engagement and Protect commands on any ship. These give me a lot of flexibility narratively, and I’m still coming up with devious ways to exploit this feature. But the most critical thing these tags do is allow me to set warships to defend industrial or refugee ships.


The new jump timer
The new jump timer


Now in last month’s screenshots you may have noticed a big JUMP button in the top center. That’s because one of the first things we did in May was to implement the UI for scouting and jumping. Now when you begin plotting a jump a plotting timer bar appears at the top of the screen. Then when you are ready to jump, a big JUMP button appears the jump timer begins counting down. If you don’t jump before that timer finishes, you’ll have to plot again.

Scouting works in a similar fashion – when you send a scout you’ll see a timer indicating how long until the ship returns… IF it returns, that is. If your scout returns safely, you’ll see an indication that their report is ready that gradually fades from view.


Plotting and scouting simultaneously
Plotting and scouting simultaneously


Because events expire, we fixed an issue where events could be incorrectly reported in a scouting report by adding a timer for scouting reports. Now once the scout report timer is expired, you have to scout again to see what awaits you at a given destination.


A scout report
A scout report


Overall we’ve made quite a few improvements to jumping and scouting. Jumping is now a one-click action, and you have clear visual progress of how much time until the plot is completed and how long you have before your jump window closes. And it finally cements the top of the screen as the place to look for critical information.

Oh and since caches and stations don’t jump, Heru disabled them from appearing after you’d arrived at a destination. We may end up programmatically distributing stations when the game first begins, but I won’t be worrying about that for a while.

Work was completed on the refinery ship. The refinery ship acts as a sort of exchange. It allows you to combine any two resources to get a third using the Transmogrify command. For example, you can exchange fuel and water for ore.


Transmogrification with the refinery ship
Transmogrification with the refinery ship


Weapons as trade items now appear at set times. For example, for the first few game days you only have access to lasers when trading.

And now at this point the only thing remaining for trade is the UI polish – for example we need to add tooltip functionality to every button so it’s crystal clear what actions you can take.

Turning to visuals, when you issue a command, typically an animation plays on or above the target ship. This gives critical visual feedback to the player that the order is confirmed. I added several new animations to the game to support our new actions: evacuate/rescue, crew, abandon ship, proximity destruct, melt ice and mine ore. I added animations for existing Rules of Engagement settings: hold fire, defend and weapons free. And I polished up several of the existing animations like protect. We also added a holo indicator – a short animation that plays before each -above the ship- animation. Some additional work may be necessary there to polish that up just right, but it helps to unify the actions.

We continue to make adjustments to how ships engage one another in combat. It’s very close, but more work will be needed. I had Heru try a ranging type of behavior, but it was better before, so we will be reverting to that.

More work was done to catch edge cases. For example plotting a second jump, scouting while plotting and then changing to another location had minor issues that had to be addressed. Some formatting and window placement errors were fixed, and some problems with trading resources and equipping weapons were corrected. Heru also fixed a long-standing but minor issue where our tooltips were disappearing after the first contextual action.

Alexander built out some beautiful icons for stations, caches, the Pact lifeboat and the Corp tanker.

Heru adjusted our pathfinding to make ships hail other ships quicker. He sped up the time it took ships to respond to an attack order. He made sure fighters would latch on to ships when they came from planetward. And he fixed an issue where some ships were failing to attack based on where they were spawned, and another where mining lasers were hitting but not destroying Harvester fighters.

As of now, once the Harvesters have reached a given destination, they never leave. This makes it quite dangerous to return to a harvested destination. Fighters now stop spawning when their carrier is destroyed, if you are crazy enough to attack a carrier.

The mining laser was restricted from attacking warships, since it cannot damage them. Rules of Engagement were extended to include the mining laser, so if you issue Hold Fire, Defend or Weapons Free it has an effect whether you are mining, melting or defending. Ships with mining lasers were also set to default to collecting ore automatically until given a different order.

The Corp extractor is a mining ship that also has the ability to salvage an abandoned ship for ore. We’ve had it in the game for a while. It had been incorrectly reporting repair abilities instead of salvage, and had an issue where it only wanted to salvage once, and not give the player any ore. We got that all fixed.

We fully implemented the Corp tanker, which adds fuel capacity to your fleet. These ships are critical to supporting the fuel demands of larger battles and helping you get through destinations with low fuel quality. I also redesigned the Corp tanker from scratch as it was looking too much like a Harvester for my taste. I may tweak it a bit more but it’s now unmistakably a tanker.


Tanker, work in progress
Tanker, work in progress


We also implemented Rover fixers. These are ships that can fly up to a disabled ship and probably, just barely get it running again. Heru fixed an issue where they would accidentally haul ships they were fixing through jump. Only the Auxiliary is powerful enough to do that.

The newly implemented cruiseliner and refinery ships weren’t draggable, so Heru fixed that.

Heru fixed an issue with the jump timer where you’d click jump with less than a second remaining but your fleet would not jump, because the jump didn’t occur until after a short delay.

I added more ship names for new and existing ships, caches and stations.

I created a new Irenic station and Corp cache models. I adjusted the collision boxes on the Pact station. I created an icon for plans and one for weapons to be used in trade. I optimized several 3D models including the Harvester carrier, bringing its size down considerably with no discernable loss in quality.


An Irenic station
An Irenic station


In April I finalized all the 3D models of our destructible warships. Well, this required me to rework the Unity prefabs which added additional time in May. But I’m really happy with the results. As part of this, I also adjusted the collision boxes on them so they could be selected easier. Heru also fixed an issue where switching between the intact and destructible models was causing the ship to appear higher or lower, and another issue where the switch was causing rotation.


A corp warehouse
A corp warehouse


I made some design adjustments to the fuel icon and the left/right arrows used to switch game views bringing them more in line with the visual look and feel of the game. I also increased the size of the minimap model so ships did not appear outside of it, adding pips and a more appropriate wireframed planet instead of a big white dot.

I’m spending more of my time balancing the game. In May I adjusted the formula for weapon and plan costs, as well as ship capacities for ore to bring things into better balance. I increased the number of items present in a given trade event, and changed repair and fix times. I made further adjustments to the range and rate of fire for the laser. Enemy ships were given more resources so they can fight longer.

An ongoing point of balance that I’m working on has to do with relationships. At the moment, no matter how many good deeds you do for a faction, you max out at +1 Friend. If you reach 0, you fall to Neutral, and at -1 you’re an Enemy. But unlike being a Friend, there is no limit on how negative things can go.

I’ll wind up this month’s update with a story. Last week it was coming to the end of a day and I fired up the game to see how it played.  Over one unrelenting 66 minute game I had more close calls than I can count, lost my entire fleet once and had to rebuild from scratch. I made friends and enemies. I had to make some tough calls. In the end I was able to last 51 days and accumulate a good sized fleet, but I gambled on sending a scout, took my eye off my fuel use and lost it all. Whew! XO is /hard/. And it’s starting to really come together.

We still have a lot to do, but we are getting there.