It's been quite a few months since I've posted, but we're still making great progress! This post highlights all of the changes we've made since our last update in July.
Note that I am going to try and keep new posts coming out on the site as much as I can this year, but feel free to join our discord server if you'd like to be more involved with ongoing development discussions! (The link for which is on the homepage).
- Provisioning scripts to quickly stand up a virtualized server environment with Kubernetes & other components which will be used for deploying and scaling game servers.
- Database migration framework that can handle migrating database entities/tables from older versions to the latest by allowing each implementor to specify a set of migration instructions.
- CICD tooling rewritten with shareability in mind. Nearly every step of our automated jobs is defined in a reusable Jenkins library so that each job doesn't have to know the.. 10x lines needed to parse a release configuration file, send a message to discord, build a Unity application, etc.
- Completely rip apart our monorepo for the game into multiple Git repositories. This will allow us to restrict contributors to the particular components they need access to. I.e. the game servers, vs the player client, vs the content service/web application, etc.
wiki.funkhouse.gamesis setup and integrated with Funkhouse SSO! Designers have access to a special location to define lore, images, and other information which will eventually be released to the public.
- All entities are configurable via the content site now. From doors which are tracked on the server, to NPC body/DNA presets.
- New reusable libraries for all games we create in the future:
- Event publisher/consumer libraries, which can handle the packing/unpacking of structured messages between clients/servers. This is separate from socket requests, and instead a library which can be used in conjunction with any networking framework.
- Reflection library for common functionality that is being used throughout other libraries, games, etc.
- Library to bootstrap a new, platform-agnostic, .NET service. This is reused by all 3 game servers.
- IO library for serialization/deserialization of entities<->files, compression utilities that are used by multiple libraries, etc.
- Simplify content creation service to reuse game entities already defined in the Core game server library.
- 50% of the content service code used to be custom wrappers around each game entity.
- Now a small amount of code deals with entities and mostly the Core game library definitions are reused directly w/o wrappers.
- Unlocked creation of female players, configuration of female NPCs.
- Allowed face, skin color, facial hair, etc. for each race is configurable. Additionally, can build NPC presets to pre-define/reuse body and DNA configurations.
- Get rid of nasty Unity Multipurpose Avatar's "recipe string" for rendering a humanoid character across all clients. Now, each body component (face, skin color, facial hair, etc.) along with their DNA settings (bellySize, forearmWidth, glueteusSize, etc.) are sent as their own explicit fields. This shrunk a character's visual definition from 1000+ bytes to well under 100 bytes.
- Authoritative NPC client performance enhancements:
- Strip out all materials, textures, particles, etc. during build. This reduced memory usage, hard drive space, and CPU usage by the NPC client multiple times over.
- Batch movements of NPCs into multiple requests which are sent asynchronously / in parallel.
- Race specific audio clips for combat, foley, etc.
- Combat messages are appropriately matched based on race. A lion won't punch you anymore.. it mauls you!
- Socket server can be configured with compression (gzip or zlib). Right now this applies to all requests which is overkill, but eventually will make this a configuration on the request itself rather than a socket server. Not all requests are worth compressing! Just those which are frequent and therefore expensive, such as position movements.
- NPCs are more tightly bound to the NavMesh. If they somehow were to fall under the world they will be warped back onto the NavMesh.
Cape Commonswith starter NPCs to kill throughout the zone. As you get further away from town, the NPCs start becoming more difficult.
- Spawn groups can be setup so that a large number of "roaming" NPCs spawn within a boxed area.
- NPCs can be configured to hate animals, undead, or those who are completely unknown to them (i.e. no corresponding faction tying them together).
- Add quite a few new NPC races:
- Pattern in place to quickly scale the number of NPC races we support. I.e. custom animation controller actions can easily be configured for each race.
- Objects can be controlled using a set of actions/triggers which are defined on the server.
- Currently support for opening/closing doors on the server, keeping them synchronized across all clients.
- Large portions of our first town drafted out in terms of environment and object placement:
- Configuration of custom NPC behaviors using an externalized library (written in F# for those who like the geeky details). This allows for quests and other NPC behaviors to be updated without compiling / releasing a new client, server, etc.
- Swimming! You can die after staying underwater for too long. The amount of time increases as your swimming skill increases.
- In game commands to lookup who else is online in the game.
- /who <race>
- /who <class>
- /who <level>
- /who <minLevel> <maxLevel>
- /who all <filters>
- UI & hotkey configuration / placement on screen is saved in a player specific configuration file.
- Chat enhancements
- Search/quickly re-send previous messages by pressing shift up or shift down
- Quickly reply to messages by pressing R
- Persist chat messages across zone boundaries
- Keep events classes/definitions for the Authoritative NPC client in separate libraries from the Player client. That way players cannot decompile / learn how NPCs behave.
- Improvements to guilds
- Members are assigned ranked roles upon joining the guild (recruit, officer, leader, etc.)
- Officers and above can demote/promote other guild members
- Officers and above can set a Message Of the Day and invite other players.