As we approach the full start of the Macroscopic stage, I want to discuss what we can do to make sure it starts smoothly. The Macroscopic and Aware stages will likely be the most complicated stages in the entire game. Considering the amount of time spent on the Microbe and Multicellular stages, we might very well be working on the Macroscopic and Aware stages for the next decade, so it’s important we start them off strong with proper design.
At a minimum, each design document should be reviewed by the lead programmer (or another experienced programmer if the lead made it) and the lead game designer before any code is written, but more eyes on the document are always helpful.
Why?
I’ll discuss what I think we should include in design documents further down, but these are the big benefits to using them. I know writing documents isn’t fun, but I think they will lead to us having a more fun and productive time developing the Macroscopic stage once they’re made.
- It forces programmers to think about how their code will interact with the big picture, leading to inherently more scalable and maintainable code.
- Right now, Hyyrylainen is often the only one who sees the big picture, which adds extra strain on him during code reviews
- It reduces the risk of reworks and redesigns after features are implemented because all stakeholders have a chance to give input before the feature is developed
- It makes it easier for new volunteers to jump in, either by implementing a system designed by someone else or by reading through a design document to understand the basics of an already implemented system.
- Currently, it’s very hard for new volunteers to figure out where they fit in, which I think is why we have so many people making up new features to implement or tweaking existing systems that don’t necessarily need tweaking, rather than helping move Thrive definitively towards a more complete game.
- It helps reduce merge conflicts when two programmers are both working on major systems because it’s easier to see how those systems will interact.
Systems vs Features
When thinking about how to create designs for Thrive, I separated things into “systems” and “features”. Systems are the major foundations that power the stage while features are the specific things that use the systems. For example, Mouths would be a feature that would utilize these systems
- Metaball Manipulation to place the mouth
- Procedural Animation to animate biting and chewing
- Nutrient Storage and Consumption, because the mouth consumes nutrients
- AI, as the AI organisms need to know how to use their mouths
- Auto-Evo, so AI species can evolve mouths
My hope is that, if we can identify all (or at least most) of the systems needed before we dive into development, we can design and implement those first. Then, if we do it right, adding features will be as simple as plugging them into the interfaces and helper methods of the systems they utilize.
So, this would lead to a seemingly slow start to the Macroscopic stage as most of our effort would be on designs and implementing systems that the players can’t interact with much, but once the initial setup is finished, we should be able to start pumping features out quickly and finish the Macroscopic stage much faster than we otherwise would have.
Interface Design Document
To guide the individual design documents and the order we design and implement systems, I think a simple Interface Design Document (IDD) would be useful. The point of this document is to show a high-level overview of how each system interacts with each other system. We don’t need to get too detailed with it. I think a diagram showing all the interactions and a one sentence description of each interaction would be plenty.
I made a very rough draft of what that diagram could look like as a starting point. Auto-evo has no arrows because basically everything affects it and I didn’t want to clutter the diagram. Reproduction has no arrows because I don’t know what would affect that yet. Some systems have question marks because I haven’t seen them mentioned anywhere yet, but they seem pretty important to the stage, so I assume they’ll exist in some form.
We’ll need a lot more discussion about what systems should exist before anything can be finalized, and the final document would have descriptions of all those arrows too, but hopefully that gives an idea of what the IDD means to accomplish. It helps plan out what types of methods and properties need to be exposed when implementing a system to make implementing related systems cleaner.
Design Document Template
This is what I would like to see in each design document.
- General summary of what this system does
- What systems relate to this?
- What methods does this system need to expose for those systems?
- What methods do those systems need to expose for this system?
- What performance concerns are there with this system? How can those be mitigated?
- UI mockups
- Limitations and assumptions
Example Design Document
This isn’t at all a fleshed-out design, so don’t focus on the content. It’s just something I threw together to show the idea of what these documents should contain.
Terrain Generation
Summary
The Terrain Generation system is responsible for creating the physical environment the game takes place in. It generates rocks, hills, caves, lakes, etc., and it decides how to place fully sessile organisms determined by the LOD system to be “terrain”, like grass and trees.
Related Systems
- The LOD system relates to this system because it determines what organisms should be treated as terrain. The LOD system will also be utilized to improve performance by lowering the detail of terrain that’s far from the player.
- The LOD system needs a public method called “GetTerrainOrganisms” that accepts a patch as a parameter and returns all the organisms that should be handled by the Terrain Generation system
- The Terrain Generation system needs a public method called “GetDistantObjects” that returns a collection of terrain features far enough to be simplified by the LOD system
- The Patch system relates to this system because it determines what environmental conditions exist, which will impact terrain generation. For example, a dry patch will have fewer bodies of water.
- The Patch system needs a public method called “GetEnvironmentalConditions” that returns an EnvironmentalConditions struct representing a specific patch. The struct will be created as part of the Terrain Generation system
- The Nutrient Storage and Consumption system relates to this system because this system determines what rocks can be consumed.
- The Terrain Generation system needs a public method called “GetEdibleRocks” that returns a collection of all rocks that can be consumed
Performance Concerns
We want the terrain to feel rich and interactive, but the more interesting the terrain is, the worse it will be for performance. The main way to mitigate this is by utilizing the LOD system to make far away objects simpler.
UI Mockups
This should have no impact on UI, other than some new options for world generation when starting a new game.
Limitations and Assumptions
- Each patch will only be 1 square kilometer, and players will be unable to move between patches without entering the editor, so we only need to generate 1 square kilometer at a time
