Here’s our September in-depth development update for XO!
Functionality
For me our biggest accomplishment was implementing faction leaders and the four initial faction leader powers. This is a big deal, because faction leaders and their powers are pretty much the last pieces of core game functionality remaining. CAUTION: we still have lots of work to do! Lots more. More on that at the end of this update.
But first, faction leaders. Each of the four factions (Empire, Rover, Irenic, Corp) have one and only one faction leader. Whenever you rescue a crew or bring a refugee ship into your fleet, there is a chance that faction’s leader will be part of that crew. You can’t get a faction leader from industrial ships or warships.
Each leader has a specific special power. The leader is permanently attached to a crew, but you can move crew to several other kinds of ships, including your battleship… so whatever ship holds that crew gets the power. If you lose that crew, the faction leader and their power are lost for the entire game.
The Empire’s power is Intimidate. You can use it to bully any ship into jumping away, although that causes the intimidated faction to become angry at you. Probably not a good idea to try on Harvesters.
Diplomacy is the Irenic power. With it you can hail ships that would otherwise not talk with you… unless they’re really angry at you, in which case they’ll straight up attack.
The Rover power is Jury Rig. This gives a chance to quickly repair a disabled ship working condition. It doesn’t repair armor – it just gets the ship flying again. However, the repairs are sketchy so there’s a chance that Jury Rig fails and destroys the disabled ship!
The Corp’s power is Haggle. You can try to haggle in any trade action. If you’re successful, prices go down. Of course, there’s a chance your haggling /raises/ the prices too.
I’m super excited that we’ve finally completed faction leaders. In playtesting I am /much/ more likely to rescue refugee ships and crew, which was exactly what I intended. The powers are quite useful in the game.
For a long time the mining laser has had a fixed range. Now, just like all of the other weapons, range is variable from one mining laser to the next. So while you can’t upgrade a mining laser’s damage, you can get ones with better range.
In XO water management is critical; you cannot add ships to your fleet unless you have spare water. And if you lose too much water you’ll have riots and have to drop ships from your fleet. The good news is that Heru fully implemented the water gain/loss system (we’d been using placeholder code for a long time). Now at a water quality level of 51% and higher the fleet gains water; at 49% and lower the fleet loses water. The rate of gain or loss is based on the quality (max loss at 0%, max gain at 100%).
Speaking of water riots, when you drop a ship from your fleet it is now immediately dropped from its formation. This solves a few issues we were having.
I began adding final sound effects into the game. Having playtested for so long with just weapon sounds it makes such an incredible difference. I can’t wait to get all of our sound effects in place! Oh and some of the weapon sounds needed to be set properly, and I took care of that, too.
Event System
In our event system Heru added a factions tag to our shipExists condition and getShip action. I use this quite a lot in Attackship and fleet events. These allow me to start an event if the player has, for example, a Rover or Empire ship. Then using getShip I can do things with that specific ship.
We also have a new currentWater tag, which allows me to trigger events if the player’s current water level is at a certain point. This took a little longer than expected to get right, but it’s working great now.
The first use I have for currentWater is to trigger a kind of mini-tutorial event that (optionally) explains what water is and how it works using narrative. I’ll be adding many more non-tutorial events that have a chance to trigger at certain water levels. Mainly I want to make sure that if I’m dropping a cache of water for the player, it’ll be useful. I also want to give opportunities to sacrifice something to get more water in a desperate situation.
Along the same lines, we now have resource quality tags that I can use to trigger events when a given resource (fuel, water or ore) on a planet is below, at, or above a certain quality level. I’ll be using these for purely narrative events as well as tying certain types of caches to planetary types where they make sense. A fuel cache at a destination with high fuel quality wouldn’t make sense, right?
Similarly, I can now start an event based on the type(s) of world you are on, so I can tie specific events to things that might happen say, only on a molten world.
Heru implemented a new action tag for our events, leaveFleet. This causes a specific ship to leave the player’s fleet, and this is functionality I’ve been looking forward to for a long, long time. So I immediately I went through all of our existing events and added the leaveFleet tag where it was needed.
Heru also added a critical condition to our events, isHarvested. This allows an event to perform specific actions if a certain ship is harvested while the event is being played.
Heru added action tags for self destruct and proximity destruct. This brings us one step away from being able to create a Battlestar Galactica-esque ‘Olympic Carrier’ event. It’s difficult to put into words just how badly I want to pull off these kinds of events!
We have another important action tag thanks to Heru, the destroyShip tag. As you might expect, this tag destroys a specific ship. I plan to use this tag mostly on ships that are not in the player’s fleet, although I may yet create some events where a catastrophically bad leadership decision could lead to a ship being destroyed.
And at last we can do conditional choices! Now I can set up a choice with any conditions I want in a given event and they will only be shown to the player if the specific conditions are met. It took a fair amount of tweaking to get this right, as choices are at the heart of our event system and there are many different conditions, but I love this new functionality.
Events in XO ordinarily don’t start unless you hail a ship. So Heru added the Start tag to our event system which is used to, yes, start an event. This fixed an issue where mission timers weren’t working correctly when they were started from a preTrigger, but this tag ended up opening some other avenues for me in event creation land and I’ve started using it quite a lot.
We also expanded out our event spawning system with five new rules. Most of the rules have to do with missions; in XO, you can have multiple events running at once, but only one mission running at a time.
So our first spawning rule requires that fleet events be created along with the destination events when it is scouted, because some fleet events can contain missions.
Our second rule makes sure that if a mission is already running, a fleet event with a mission is not created.
The third rule prevents events with a mission from being created if the fleet event contains a mission.
Another rule helps us make sure only one mission can be running at a time. In our game, new events are created either when you scout or when you jump into an unscouted destination. If the player scouted a destination, a mission type event could have been created. But the player could have started a different mission in the meantime. This new rule swaps in a different event if the player arrives with a mission running.
And the last rule requires that events are created at current day +1 for minDay and maxDay tags.
Bug fixing
We continued to stomp out bugs. We had two issues crop up with the edges of our auto-scaling dialog windows that Heru fixed.
Heru fixed a bug where in certain cases the shipHealth tag wasn’t working.
We had a situation where events that required a specific kind of ship weren’t triggering, and that’s fixed now.
The correct mission time wasn’t showing in fleet events, but that works now.
For a short period there was a bug that was triggering when you told a formation to go weapons-free; no longer.
We had another bug that threw an error if you had all your weapon slots full and came across a weapons cache, which is gone now.
Heru fixed a problem where the newly implemented leaveFleet tag threw an error if it was immediately followed by a jumpAway tag.
The formation retreat command needed a little bug fixing, which Heru took care of.
I accidentally used ‘faction’ instead of ‘factions’ in my event generation script, so I fixed that and did a quick search/replace on all of our events. Oops!
Trades in fleet events were throwing an error, that’s all working good now, thank you Heru.
I found an issue where some multiple condition events weren’t working right, and that’s all been fixed now.
For a while, only the first ship in an event was being returned in a scouting report. Now all ships in an event are reported.
We briefly suffered through a return of the dreaded vertical text bug. This one pops up sometimes when we make a change to one of our windows and forget to adjust the text area. Heru fixed this one quick.
Heru fixed a bug that was putting the game into an infinite loop and locking it up. As a testament to the strength of the code, this is the first one of these I’ve come across.
There was also a problem with hovering the fleet info window that was causing long delays, and Heru got that under control.
I fixed a small formatting bug in water riots where it would show an incredibly long decimal number instead of rounding up to the nearest integer. I also added a teeny bit of logic to say “1 ship” or “2 ships.”
In the starmap, the battleship icon that orbits your current location was orbiting backwards. So I flipped it 180 degrees.
The ship icon in the contextual menu was too small and not properly placed, so I fixed that.
Balancing
In the balancing category I adjusted equipment costs across the board to match ore capacity. I’m pretty happy with the results at the moment.
I reduced the rate at which new weapons with higher damage levels can appear, as I was getting demolished too fast by higher damage weapons way too early in the game.
I also adjusted the starmap to put the resource poor rocky, molten and ice worlds much closer, reducing the habitable ‘safe zone’ that the player starts in. Traveling through the outer worlds without the right ships will be very difficult.
As a result of adding the proximity destruct tag to events, I decided to reduce the damage from the blast. Now it will wipe out any ship — except the battleship, which it damages heavily.
I gave refugee ships the ability to carry two additional crew. While this depowers the Irenic cruiseliner, it vastly increases the value of a refugee ship. I also want the player to feel like they can and should rescue as many crews and ships as they can. Because of their extremely slow speed, refugee ships are really only good for storage, not rescue. So in the end I feel like this was the right decision.
We modified the retreat command slightly – now if you retreat from a fighter you actually retreat from the /carrier/ that is launching the fighters. What was happening was, you’d order a retreat from a fighter and then destroy the fighter, and the retreating ship would stop retreating (and then get swarmed). Now retreating works more like you’d expect. This is an action I have been using /a lot/ in playtesting.
We adjusted the hailing range of a ship out much farther. This solved a couple of nuisances. For one, stations are very large, and ships were coming in too close, leading to challenges seeing and selecting. Two, and probably more important, coming in so close really changed the tactical situation for combat, putting ships right on top of one another. Now formation spacing and weapon ranges are much more meaningful in play.
Visuals and Sound
I’ve begun polishing up the UI. One thing I did was adjust the hover line (which is actually a 3D model like everything else in our game) so that it wasn’t overlapping things on the screen. This also makes more space for another very important piece of UI functionality that we’ve yet to add.
I took that opportunity to improve the tooltip messages for the main UI elements.
I created an animation to pulse the nav arrow when the player has enough fuel to jump but hasn’t plotted a course. The pulse hasn’t been implemented yet but I suspect we may need to add a subtle sound effect there too. I want to make sure that new players don’t get stuck on a world, but I also don’t want to beat people over the head with an annoying tutorial. Hopefully this strikes the right balance.
On the 3D modeling side, I made a small adjustment to the Rover getter so its trails and hover line looked better.
I also created the animation for the Intimidate action and put it into the game.
Narrative and Events
On the narrative side, I created a few more fleet and trade events in September. We now have 51 fleet events and 72 trade events for a total of 354 events.\
And once we reached 350 events I took a bit of a break from new event creation. Instead I spent quite a bit of time adding conditions and actions to existing events.
After an event ends, sometimes there is a ship remaining that hasn’t joined your fleet. Hailing a ship like that now displays some kind of ‘nothing to say, move along’ message. I wrote at least one of those for each ship.
I also rounded out the ‘hail fail’ messages for trying and failing to hail certain ships when you have a hostile or neutral relationship with them.
And since we have faction leader powers, I added the new Rover juryRig action tag that Heru created to quite a few events. I also added quite a few isIntimidated conditions to existing events to match up with the new Intimidation power.
I added triggers to abandoned warship events so if you crew them and have a negative relationship with that faction, the warship jumps away but the relationship improves slightly. It felt kind of cheaty otherwise.
I also began adding more complexity to our Attackships events. Without giving too much away, many of them now target specific types of ships in your fleet when you have jumped into a destination controlled by a faction that is hostile to you.
I continued to add functionality to my event creation script. I updated the SuccessCrew tag to use the new crewCount functionality, added more options to the preTrigger damage tag, and added Start, Destroy, Factions and isIntimidated functionality. I fixed some syntax errors, added a new benefit ship tag, and added two ways for a harvested ship to communicate their extreme displeasure at being harvested. And I added faction pairs to the #faction tagging that I use to help balance events.
I also updated the script I use to help me balance faction relationship fleet events, which I will be adding quite a few of in the coming weeks.
In summary we did a lot less bug fixing in September than in August so we were able to add some large pieces to the game. Our pace continues to be steady and the code is holding up well to changes.
We’re really grateful for everyone’s comments in support of our ongoing work. Thank you so much!