First, two big pieces of news:
We have an alpha date for XO! (skip to the end if you can’t wait)
And the teaser trailer for XO is done! Click here to view the XO trailer on YouTube. Comments and likes on YouTube are greatly appreciated! And don’t forget to watch it in full 1440p glory.
Special thanks to Jason Siadek for the huge improvements he made to the rough cut. And yes, that’s one of Jim Guthrie’s superb tunes from the XO soundtrack.
Before I dive into what we did in May, I have to share something that happened a few days ago while I was playtesting. The game was on day 27 and I’d managed to get both a Rover leader and an Empire leader in my small but growing fleet. Things were looking good! I put the faction leaders into a slow-moving and defenseless Empire supply ship, left the battleship to guard the supply ship and the rest of the fleet, and sent my two frigates out to crew and protect a gatherer that had popped up.
Suddenly I had to deal with a pirate ship that jumped in, and my battleship was the only option. I sent the battleship, and quickly disabled the pirate ship. Using the jury rig abilities of the Rover leader I repaired the disabled pirate and put a prize crew aboard, making her mine! Then I turned to deal with the frigates and the gatherer.
I took the gatherer into my fleet and ordered my frigates to try and reach a nearby repair cache.
But during that time I took my eye off the fleet… and a load of Harvester reapers had descended on my fleet. That poor supply ship looked to be the first they would take! To make matters worse, the battleship was out of range having dealt with the pirate. The situation looked pretty grim.
But I said to myself, “I really don’t want to lose those two leaders, so I’m going all in to try and save them.” So I gathered up the battleship and my newly acquired prize warship and sent them to try and clear out the reapers, even though the prize was just barely operational.
Then I paused and evaluated the situation. My frigates were farther away than my battleship and prize but had more velocity built up – they were screaming along to the repair cache. If I gave them new orders, they’d reach the supply ship first!
So I gave one of my frigates new orders to protect the supply ship and told the other to run for the repair cache. The first frigate flew in and started clearing reapers, and the second made it to the repair cache. Using the cache I repaired the prize, giving it a little breathing room in the fight ahead, then I sent the other frigate in to help protect the supply ship.
The reapers closed in, lasers flashing out. They held off the first few… but there were too many of them and they disabled the supply ship just moments before my battleship and prize reached firing range.
It was a crushing blow. In that moment I thought all was lost, but suddenly I remembered something – I could order the the supply ship to abandon ship! I did that and suddenly two lifeboats appeared. I had bought myself a few more seconds.
Knowing it would only be moments before the reapers took out the lifeboats, too, I gave hasty orders to my frigates to rescue a lifeboat each, and ordered their weapons free. I tasked the battleship and my new prize to defend each lifeboat and quickly went to the starmap and ordered a course plotted to get me the heck out of the system… if this plan worked.
Lasers licked out and picked off the nearby reapers. The frigates absorbed several suicide hits each. But then my first frigate pulled off a rescue, and then the second one did. I had rescued both leaders!
I ordered all ships to retreat as the course plotting completed… and jumped to safety. I’d lost the supply ship but I saved my faction leaders. I was glowing in the victory.
All this happened just as I wrote it. I made liberal use of the spacebar to pause the action, consider my options and issue commands, and that made all the difference.
Moments like this are exactly why I have worked so hard and so long on XO.
Ok, now on to what we accomplished in May.
In May I invited a few people to come in to my office and play XO. Each session was several hours long, and each gave us about thirty things that needed to be fixed or adjusted, most of them fairly minor. Generally I tried to have everything fixed before doing a new playtest.
Analytics were completed and merged in. We’ll use the data to help tune the game during alpha and beta.
Events now automatically end if a main event ship is dropped from the fleet or if a main event ship is lost or left behind while scouting.
Save games now restore the planet type.
I moved our website to a much faster server with vastly more bandwidth, away from our weak little in-office server. It still needs a few bits set up like the store.
Right clicking on a plan now trades it when you are in trade view; tooltips were also updated to reflect this.
Braking and rotation was improved for ships.
Formations now stay in formation throughout their flight path.
Formations now properly restrict all ships in a formation to the turn and acceleration rates of the slowest ship in the formation.
All of the remaining sound effects were added to the game.
The player’s character head no longer has a chance of being duplicated with other members of your crew. We’ll restrict this a little further, but this helps differentiate between ‘you’ and ‘your crew.’
Events now have global variables that I can set to any integer value, and check them in any event. This was required for early narrative and other balancing, but I’m looking forward to using it for more interesting purposes later!
Events are now fully randomized, subject to their conditions.
Our in-game debugging tools for events were improved. The game also saves an output log that helps us track down bugs.
The hailedBy trigger now overrides the default hail_xx_xx message when present.
Scanning a cache no longer shows crew.
For alpha and beta we added two buttons that pop up when an end-of-event text box appears – ‘I liked it’ and ‘I didn’t like it’ so you alpha and beta players can give me quick feedback on events. Those buttons act the same as the close button as well, so no extra clicks are required.
You can now scan any ship without having any other ship selected. Sounds minor, but it fixed a big annoyance.
Lastly, a few adjustments were made to combat:
We added a berzerk rule of engagement (ROE) that tells a ship to ignore all incoming missiles and only target hostile ships.
The defend ROE tells a ship to attack Harvester fighters that have targeted it, incoming missiles, shields about to ram, and attacking laser-equipped ships. Missile-equipped ships will fire on everything, just as shield-equipped ships will ram missile or laser ships with their shields — because they have no other way to defend themselves.
Also, the defend ROE targets missiles first before targeting any ships such as harvester fighters.
The weapons free ROE fires on any hostile ship, missile or shield within range.
Ships placed in formation now automatically try to defend any other ship in the same formation – unless they’re given a countermanding order or ROE.
Ships given a protect order automatically take on the defend ROE. Ships given an attack order automatically take on the weapons free ROE.
A ship attacking another ship under protection will only attack the protecting ship if the target is /not/ a warship. This allows the player to use weaker warships to protect other warships, while ensuring that a protecting warship is the first one attacked if it is protecting a civilian ship.
The ‘comms in progress’ message no longer disappears if you move from the galactic map to the starmap.
In the windows build of the game, hovering ships in the scout dialog no longer shows a vertical resource view.
A trigger wasn’t activating properly in the first mission, and I fixed that.
Heru fixed a bug where a ship made a sudden change up or down when hit.
Dragging a ship to scout no longer loses its health bar.
Corp warships no longer run away from the target they are trying to protect.
I fixed the weapon detail box in the trade menu when it lost a couple of pieces.
Giving an order to a single ship in a formation no longer causes the formation to follow that ship.
Heru fixed a bug where formations were not being saved, causing a bug when a weapons-free order was issued.
Hovering the minimap now displays local resource quality properly.
Changing the position of a formation ship now causes formation ships to immediately re-order themselves.
Heru fixed a bug with resuming a particular saved game.
Formation logic was tidied up, fixing some issues with ships ‘hunting’ and being out of formation order.
Ships no longer shift their location in formation unless reordered or given orders.
The ship destroyed sound now doesn’t play when destroying fighters.
The minimap rotational arrow no longer persists after hovering a spinward/antispinward action.
The options menu was temporarily visually messed up.
Mouse pointer ‘nope’ temporarily stopped appearing when hovering a ship that you couldn’t select.
The scan tooltip no longer shows in the fleet list when hovering fleet ships (the zoom tooltip shows instead)
One of our events was spawning two gunboats instead of one. No longer.
An invalid compare operator error was fixed.
Heru fixed a bug where a shield ram would trigger a hit on a ship multiple times instead of just once.
Shieldships no longer fire on themselves when given a protect order.
The scan text needed to be centered properly when it was the only action available.
Doing an abandon action when multiple ships are selected no longer abandons all selected ships.
An edge case was fixed that was thrown when you attacked one of your own ships.
A movement bug was fixed with some refugee ships stopping short of their target.
I cleaned up an obsolete tag from our event file.
Scan now works as designed on Harvester ships (not showing crew).
An assertion failed bug was fixed.
A rewired error having to do with formations was eliminated.
You can now load a game where you’ve sent a scout twice or lost a scout and not have an issue.
Attacking Rover fixers no longer throw null reference errors.
You can no longer send two or more scouts to the same destination.
Fixed an issue where you could fail a certain mission and keep the event ship in your fleet.
Some endEvent blocks were removed from certain events as they were ending the event prematurely. Go figure.
The shieldship destructible decided to disappear, so we made it reappear. Same thing happened to some text in pirate events.
Several additional minor bugs were fixed.
UI and 3D
I worked with Randall on a UI refactor based on his playtesting and feedback. We worked on the resources, ship health, ROE and weapon data displays. After several rounds the mockups are done and we’re both happy with the results. We still have to implement the updated UI, but I am pushing that out past alpha since it is pure polish and doesn’t add any new functionality.
All of our clickable elements now highlight when hovered and make a sound. This sounds like a quick thing but we have quite a few clickable elements so it actually took a couple of full days to get them all hooked up.
We bumped the camera out past the playfield boundary to give more breathing room. It makes a huge difference.
I reduced the bloom on some game elements.
The hover bar on the galactic map was adjusted to line it up better with a hovered destination.
The position of the weapon detail box in the trade view was adjusted.
I modified the minimap model to fix an edge case with z-fighting and the context menu.
The galactic hover now only displays resources in horizontal mode, not vertical mode.
The planet name, faction and planet type are now displayed when hovering a destination in the galactic map.
Hovered ships in the scout dialog now show their names.
In the galactic map, the mouse tooltip now displays ‘out of range’ when a hovered destination is out of jump range.
Resources for a destination (if known) are now displayed on hover in the galactic map, same as in the starmap.
An additional rotational arrow indicating the direction ship(s) will travel was added to the minimap. This really helps reinforce the spinward/antispinward UI.
The scan window now has a close button, which helps reduce the chance that your ships are accidentally deselected when trying to close the scan window. Previously you had to click outside the box to close it, unlike any other of our dialogs. It’s now consistent.
I adjusted the angle of the post-jump camera to be more isometric. I’ll probably make some further adjustments there.
Non-selectable ships now display a scan tooltip.
I added some text to the formation editor describing how ships in formation automatically defend one another, and to drag ships into the formation to add them.
And I increased the size of the auto pause comms.
The starmap ‘galaxy 8’ model received a visual upgrade, and the galactic current icon was made much more apparent.
The character title position was adjusted.
Spacing on the context menu was adjusted.
Narrative and Events
I added a narrative option to learn more about camera controls to all of the harvester intro events, and a narrative explanation of the real time with pause mechanic with a wink to outrageous Star Trek plot devices.
I made many other improvements to the opening narrative, about the first twenty days of play, based on observations and discussions with local playtesters. This was easily a full day of work.
The destination the player is supposed to jump to should show up in the HUD for all missions now; it was missing on a few.
I added some ‘destruction hastening’ and ‘save the day’ events if the player does certain things horribly, horribly wrong. These are all preventable rather than random.
And I adjusted event timing for more narrative continuity.
Some event types were prevented from starting under certain water conditions.
A few events needed their endEvent tags removed based on their new design, so I did that.
‘Replacement’ event conditions were relaxed to ensure they always can spawn when called on.
I also added numerous cues in events to help guide players to the flow of the game.
Some changes needed making to an event so the ship wouldn’t run away from you, so I did that.
A mission was adjusted that was giving a negative relationship hit instead of a positive bonus.
I expanded events that had abandoned ships in them to allow for wider player actions and results based on playtesting, and to be more responsive when the player crews them.
Global variables were added to ensure only one abandoned ship event can be active at any given time; having two nearly identical events to choose from isn’t very fun. Then I added conditions to all of those events to set and reset that variable.
I added another global variable to ensure that only one Harvester intro event will trigger per game. I removed some duplicate triggers in the Harvester intro events as a result.
The negative penalty on a particular event was increased and the number of ships that would abandon ship was reduced.
I added triggers and narrative for dropping crew on certain stations.
It is no longer possible to have a second pirate event start if one is already running thanks to adding some occurIf conditions to all pirate events.
A sequence of certain actions needed adjustment to ensure that a trade window didn’t come up at the wrong time in one of the early events.
I brought the post-harvester events in a little closer to the harvester intro window.
I adjusted early events requiring the player to rescue crews not to spawn if the battleship was full. It felt really unfair. Later events have no such restrictions as you should have prepared better by that point.
The events file no longer has hailedBy actions without an id, and I also made sure that all events use the [hailer] tag instead of the more restrictive [player] tag, which only works for the battleship. A few other hailedBy tweaks happened as well.
The ship lore text was tightened up by embedding tips and powers of each ship in the (occasionally silly) ship descriptions, proving once again that reading is a good thing. Farmships in particular benefit from this. I made several passes on this text in May.
I adjusted the timers in the start event to cover an edge case where the timer would stop, and made sure the HUD cleared on success of that event.
Text was added to the fuel and water resource bar hovers explaining that each was automatically collected (for a grind-free experience, natch).
I tightened some early events not to trigger if a certain ship was present. How mysterious.
The amount of ore required in a bribery event was altered.
A certain event was pushed out 15 days to give the player time to gather more options to deal with it.
I added new crewmembers: majors and admirals. Then I updated all of our events that required those crewmembers. Now very tempted to add a Major Major Major Major.
All refugee events were adjusted to the submedium distance; some were spawning too far out.
Hail messages were improved when hailing ships that are unfriendly or neutral.
I walked my cat quite a few times. No, really.
Relationships were balanced in a few events.
I pulled in refugee-type events to day 8 from a little further out.
The dictionary now uses final ship type names.
I added cues to rescue-based events that suggest crewing abandoned ships to the player, and adjusted some early event text to make rescuing and their impact on relationships clearer.
I cleaned up the language in the tutorial mission to better explain actions like mouse wheel select and clarify mouse pointers and the like.
Some stray quotation marks received the ultimate punishment. Bad marks, bad!
A double relationship reward was removed in an event. One cookie is enough.
I fixed some text that went missing in one event. And in another event too.
Hailing a disabled pirate now gives you a specific message.
I decided that an 8 ore bonus was just too much for a particular event.
I added some more water low events to mix things up.
The text used to say things like ‘report all occurrences’ and then I realized that you could never do such a thing. So I removed references like that so as not to cause confusion.
I rewrote lifeboat hail messages to make more sense.
Looted station events got pushed a bit further out.
Certain weapons won’t appear until it is possible to have a ship that you can equip them to.
I removed some unnecessary spaces taking space.
And I made several minor tweaks to event balance and narrative based on directly observing playtests.
I tested our process for updating Steam builds, worked out a couple of kinks and now we are able to smoothly update Steam.
I created a script to scan all the tags in our event file and report if any tags were missing in the dictionary file. I caught a few missing tags and fixed those as well.
I completed the myriad of things required to get our Steam store page approved. I will be making the store page live after I post this update with a ‘coming soon.’
I worked on the teaser trailer, capturing gameplay, rendering text
and putting it all together in a rough cut. Quite a few people gave me
great pointers on improving it, and then I sent a slightly less rough
cut to Jason who somehow managed to knock 31 seconds off of it and make
it even better before sending it back to me for final polish. That guy
is a wizard (you should see his fan cut of SW EP1).
As of May 31st, there are seventeen minor development tasks remaining. As of today (6/7) we have sixteen known bugs to fix at this time, also minor.
We’ll finish most of the minor development tasks first, then we will begin optimizing in June. Then we will fix the bugs. I’ll continue testing and adding narrative and political/relationship fleet events during that time.
Based on this I’ve set an alpha date of July 31st, 2019. There is a chance we will be sooner, and there is zero chance we will be later than that. I’ll be posting an alpha update with more info in the next few weeks.
Immediately after we begin alpha, we will begin making some substantial UI improvements. As data comes in from the alpha testers we’ll fix bugs, continue game balance, and implement the end game.
I do not yet have a beta date. I will post here when I’m ready to announce one. Beta will absolutely be this year, and we will absolutely, positively release XO in 2019.
Thank you everyone for the positivity and encouragement!