2018 July Dev Update

July wrapped up another solid month of development for us. Read on for all the details!

Probably the most important piece of functionality in July was the completion of the event spawning rules. These govern how, where, when and what kinds of events are generated. They’re a fairly complex set of interlocking rules, and I’m very happy to say that they are working as expected. The game took a major step forward in playability with the completion of the event spawning rules.

The Harvesters approach
The Harvesters approach


I want to emphasize that these rules are completely disconnected from how well the player is doing – if you fumble, the game will roll over you. XO is relentless, brutally hard, unforgiving, and just what I was hoping for at this stage. My current record is surviving for 90 days.

A new piece of event functionality was completed, the preTrigger. Up until now, events would not start unless the player hailed a ship. Now we can start events immediately when they are spawned. This was critical to what I call Attackship events, where warships jump in and target ships in your fleet.

With this functionality in place I made all of our existing Attackship events use the preTrigger. Attackship events have a chance to occur when you jump into space held by a faction you have a negative relationship with, and they dramatically increase the price you pay for making an enemy in the game. As I gain familiarity with the preTrigger and game balance I’ll be adding many more of these events.


The aftermath of an attackships event
The aftermath of an attackships event


Thanks to Heru we have another new event condition, the shipExists condition. This starts an event only if particular types, classes or abilities of ships are present. We can also specify if the ships are in the player fleet or not. So for example, if I wanted to create an event that only started if the player had a ship that could mine ore, I could. Or only if the player could repair, or if they had a food-producing ship.

Another great tag we now have in our event system is the assignShip tag. This allows us to specify a certain ship in events. So for example, a foodship in the player’s fleet can now be directly referenced in an event.

These three new event features are a big deal. But I’m not going to go into any further detail about the more fiendish events I have been developing with the preTrigger, shipExists condition, and assignShip functionality. You’ll have to use your imagination for now and wait to play the game to find out!

Alexander completed the Rover lifeboat icon which rounds out all the lifeboats, and I resized the lifeboat icons so they weren’t being mistaken for ships.


A Rover lifeboat jettisoned from a refugee ship
A Rover lifeboat jettisoned from a refugee ship


I created an animation for the minimap to show a new contact appearing. This hasn’t been implemented yet, but it will make new ships jumping in much more visible.

Now that crews are implemented, it is now possible to hail an abandoned enemy ship. And if you crew one of these ships it becomes yours… even if you are enemies with the faction. Probably next month we will discuss the consequences that come along with this strategy.

Speaking of that, Heru fixed an amusing bug where if you put crew on a station, the station would join your fleet and jump with you. You can still abandon crew on a station (with consequences) but the station doesn’t join or jump with you now.

I wrote the June Kickstarter update which took about two days including screencaps.

I adjusted the collision boxes on the Irenic station. And I made some minor changes to hover text for clarity.

Mostly in July I created many more events. First I created 27 new rescue events, bringing the total to 32. About half of those involve lifeboats.

Then I moved on to creating a lot more trade events. We’re up to 56 trade events now. I added a good number of join events, mostly warships last month, bringing the count of join events to 118.

The grand total of events is now at 274. I still have a very large number of ideas for new events, over a hundred ideas.

And since we’ve got so many events in the game, individual events are now no longer duplicated in a given game session. I’ve been looking forward to this one for a long time, as it really helps the narrative feeling of the game.


Starting a trade event
Starting a trade event


I was able to fix an issue with an event where rescuing crews from a station and using them to crew specific ships wasn’t working.

I continued to improve my scripts for helping me generate events; I added unique tags that we use to programmatically determine ‘main’ ships to the scripts, and expanded the destination tag to include script-generated dialog once you reach your destination in a given mission. I fixed a couple of minor syntax issues and improved the logic to require even less cut and pasting of events. Many events now require no adjustment from the script – I just paste them directly in. I’m very happy about this.

I added logic for shipTypeLimits since I’m mostly creating events that have a ships where there is a maximum number allowed. I also added a new MissionFail tag, and a new Destroyed trigger that starts actions when a specified ship is destroyed.

I expanded out the script I use to help me balance events, adding more detail and ratios. For example, the ratio of abandoned ships to crews that you can rescue is currently 3:2 — reflecting my desire for there to be more ships than crews you can find to put them in. Partly I want to encourage players to rescue as many crews as possible, partly I want the decision to crew a given abandoned ship to be fraught with the ‘but what if a better ship comes along?’ feeling. Right now the Join-to-rescue ratio is about 3:1. All these ratios are likely to change through alpha and beta.


A desperate defense
A desperate defense


You’re now able to click a skip button to bypass narrative/text blocks and jump straight to the decisions. It’s a pet peeve of mine when games with a lot of text don’t give an option for this. Later we’ll probably add a key-based skip, something like holding down a certain key (spacebar or controller button) for longer than a second.

We now no longer spawn two of the same ‘main’ ships if more than one event is spawned. So for example, you’ll never have to choose between rescuing two refugee ships, or two lifeboats, or two warships. This really helps to make your choices more meaningful.

A bug was fixed by Heru where the shield counter would move around with the camera when the game was paused.

Heru fixed an issue where the Harvester fighters were moving quite slow and failing to latch.

Heru also fixed an issue where a preTriggered event didn’t like other events running simultaneously.

We had a bug where a ship that was mining ore or melting ice threw an error after jumping. Heru took care of that one, and another one where you weren’t able to mine ore too, and a different one where in some cases you couldn’t melt water.

Another bug related to melting water happened when you had a water riot and dismissed the ship that was doing the melting, but that one is also gone now thanks to Heru.

He fixed another issue where multiple missiles were firing on a single fighter, wasting missiles.

Another bug was fixed related to jumping when a ship in a formation became disabled.

The shield collapse animation was implemented by Heru, which brings shields to 100% implemented. I’m reasonably happy with the animation I created; I may yet decide to improve it.

He also fixed an issue where a ship in a formation with a shieldship wasn’t being protected by the shield when attacked with the mining laser.

Another shield issue was fixed having to do with equipping a shield from the trade dialog. Fighters striking a shield now hit the expanding shield all of the time instead of only when the shield was at 100% radius.

Yet another shield bug was squashed, this one when the shield collapse animation was triggered.

And one more shield bug crept in and was eliminated, this one was thrown every time you shot at a shield.


Jumping with only three seconds until a water riot
Jumping with only three seconds until a water riot


I’m happy to say that all of our combat rules have now been implemented.  This is a great step, but there are quite a number of outstanding issues and edge cases we have yet to address, as well as making adjustments on how the ships move and interact. This will definitely take substantial additional time.

As a result we now have a working ‘running attack’ which makes a warship attempt to kite its target ship in the opposite direction of travel.

We also now have a basic retreat command. This causes your ship (if it is under attack) to run in the opposite direction of an attacker until it is out of weapons range. It still needs some additional code to work with Harvester fighters properly, but it’s working great against warships. Any ship can retreat, not just warships.

Formation attack rules were adjusted so that formations do not flip sides, and the outermost ship in a formation is used to determine things like stopping distances for formations when the close to attack. Ships now automatically return to their formation at the conclusion of a given order, and on emerging from jump form themselves into their formation.

Ships that are protecting other ships now only pursue attackers when they come in weapons range, otherwise they stay close to the protectee. This fixed an issue where protectors would seem to abandon the ship they were protecting to try and intercept incoming Harvester fighters when they were on the other side of the map.

We also finally have an Abort action. This halts any action in progress, which in my playtesting has come in handy uncountable times. For example when a bunch of Harvesters jump in and change the tactical situation. The Abort action in the contextual list (when you right click a ship) also tells you what action the ship is currently taking.


Abort! Abort!
Abort! Abort!


I don’t often mention it, but when we add new features we adjust our software tests, and this was the case for the final combat functions too.

Heru made it so that when you abandoned ship to lifeboat, the lifeboat didn’t jump with you to the next destination. Soon you will also lose relationship with the faction that you left behind!

You can now evacuate passengers from a station that is neutral or friendly with you. You can also move passenger crews around from one ship to another on ships in your own fleet.


Rescue ops on enemy crews
Rescue ops on enemy crews


Heru also completed the adjustments to our rules for generating planet types at the start of the game. I’ll be balancing these to dial in the right mix, but this is now functionally complete. Heru added a nice overlay in the scene view to help me with balancing too.

Also on the balancing side, I adjusted the missile acceleration and top speed to equalize the Empire warships. Missiles are now dramatically faster and cannot be outrun. I made some adjustments to the frequency of habitable worlds.


A better galactic mix
A better galactic mix


For a long time in XO, when you did the Protect action on a ship it would also join your fleet if relations were friendly enough. This didn’t make sense with the new event system but I kept it in place to help me playtest the game. Well I’m happy to say we no longer need that crutch, because the game is playable without it, so we removed the joining action from protect. It is a small thing but a very personal milestone for me.

I feel like July was quite productive given that I had to take a week off. My wonderful aunt passed away and I had to help with her estate sale and attend her ceremonies. Still, we’re making good progress against the remaining tasks. Just a heads up for everyone, August is likely to have much less functionality completed than July. Once Heru finishes the functionality for fleet events we will turn to aggressively fix a number of small but annoying bugs that have accumulated, cover off quite a few edge cases we’ve found, and make further improvements to combat.

Thank you everyone for the support and positivity. It really makes a difference.