When a mechanic fixes a generator he has to walk up to some location on the generator and do something.
But what does it mean to “walk up” to a generator, and where does the colonist actually go?
These are the sorts of things that I have to deal with.
This is my story.
Access Positions
The first issue to solve is: “Where does a colonist go when he wants to interact with an object?”
Our solution is to mark specific locations on each object that a colonist can walk to. We call them “access positions”.
The medical bed has 2 access positions: one on each side. A colonist will always walk to an access position before “using” the bed.
Closest Access Position
Most objects have multiple access positions, like the medical bed.
It would be weird if a colonist took a longer route than was necessary to use an object. Ideally, the closest access position is always used.
Let me just show you.
Here’s a medical bed with 2 access positions and a colonist who desperately wants to go to sleep.
I’ve drawn a path to both access positions (using colored carpet). You can see that the “blue” access position is slightly further away than the red access position, so the colonist will walk to the red one.
Internally, we generate pathfinding routes. Whenever a floor is added to a possible pathfinding route, we check to see if it matches the floor of the access position. If it does, the route has succeeded and we store that access position (we’ll need it later)
A simplified version of the code might look like this:
void AddFloorToRoute(Route route, Floor floor) { route.Add(floor); foreach(AccessPosition accessPosition in allAccessPositions) { if(accessPosition.floor == floor) { route.foundAccessPosition = accessPosition; allSuccessfulRoutes.Add(route); break; } } }
Access Position Rotation
Once the colonist arrives at an access position, we rotate him/her towards the object.
This sounds obvious, and it is, but it’s not an automated process. We have to manually provide rotations for every single access position.
If you scroll back up to the medical bed you’ll notice that the access positions are actually pointing at the bed. This to prevent the colonist from putting its back (or side) to the bed before getting in.
Special Access Positions
Colonists go to objects for a few different reasons. A mechanic might need to inspect a generator. A laborer might be delivering resources. Or a colonist might be sitting in a chair.
It would be weird if a box of ore was dropped off in the same location that a mechanic fixes an ore refinery. So we added unique locations that are used for different purposes
Here’s an ore refinery:
There are 3 access positions on an ore refinery.
From top left it goes:
Terminal (inspecting/fixing)
Raw ore drop-off
Produced metal pick-up
This adds a small extra step in pathfinding generation. We manually provide pathfinding reasons, and then we filter out invalid access positions.
By the way, the ore refinery is an example of why we can’t automatically calculate the correct rotation towards an object—it’s simply too large. From the bottom right access position, the angle towards the center of the ore refinery is probably around -30 degrees or so. This caused the colonist to look left (instead of straight) when arriving at the refinery.
Mounting Objects
Colonists can also “mount” a few different objects: chairs, beds, toilets, etc.
To “mount” means to teleport to a static position on the target object. It would be weird if a colonist slept at the bottom of a bed or appeared to “hover” above a chair.
Once again, let me just show you:
On the left is a chair. On the right is a colonist mounting that chair.
And also once again, this seems obvious, of course a colonist should be positioned appropriately on a chair. But someone has to manually provide that mounting position. The unsung hero of game development.
Colonist can mount more than just chairs and beds. Here’s a colonist mounting a fountain and doing whatever it is that a colonist does when it mounts a fountain.
By the way, just like with access positions, we have to provide a rotation when a colonist mounts something. In the previous image, it would have been weird if the colonist was facing the center of the fountain (because of clipping and possibly drowning)
Setting up mounting positions is also incredibly tedious, because colonists are 2D sprites that love to clip into 3D models.
FREEEEDOM
An actual unsung hero of access positions is that they give the player more freedom when placing objects.
We add seemingly redundant access positions to objects so that you can place beds against walls, beds next to other beds, and chairs next to tables. As long as 1 access position can be reached, the object can be used by a colonist
Here’s an example. The bed (non-medical) has an access position on both sides and at the bottom, for a total of 3 access positions.
It’s difficult to see, but there’s a green access position poking out of the wall. A colonist will use 1 of the 2 available positions when using that bed (whichever one is closer).
We don’t want the player to worry too much about where to place objects for optimal pathfinding. Just place a bed and make sure that there’s some sort of route to them.
That’s It
That’s it for access positions and mounting, but we actually have some new art to show you (it’s been a while).
Cafeteria Chair
You already saw this in the mounting section, but Victor converted the sprite cafeteria chair into a 3D model.
The sprite chair has been with us a for a long long time. I think it was the oldest art asset in the game actually.
Here’s a really old picture of the game for proof. This was taken in early 2016. Back then you actually built your station room by room. It was a simpler time.
New Toilet
We finally have a 3D toilet too. This is what the Kickstarter money goes towards. Toilets.
That’s Really It
Ok, that’s really it this time.
We’re getting closer to Alpha every week (and as we get closer I can spend more time writing posts and less time frantically trying to get everything working). We’re still not sure when it will be released.
It’s going to be a closed Alpha. If you aren’t already in the Alpha, you can’t get in. We honestly want to use the Alpha for testing, not for “Early Access buy the game and play right now”
In the meantime, play some other game that’s already fun and finished.
Like a fantastic Chucklefish game (have you taken over a prison in Starbound yet?),
Space Station 13 (it’s free)
Mount and Blade: Warband (because forming your own kingdom is awesome).
And yes, you can consider those official endorsements from 1 person in the Starmancer Development team.
Thanks for reading, everyone.
-Tyler
p.s. I just heard about a new Chucklefish partnered game, Inmost. It looks awesome and you should check it out.