(Continued from Volume 4)
How to design a game? And how to do it in a nicely orchestrated manner, rather than through an indefinite series of case-by-case analyses which can be deemed highly inefficient? It is my hope that a genuine search for "Universal Laws of Game Design" will be able to answer this question.
It is not hard to observe that among numerous game development professionals, especially those who call themselves "indie", there is a tendency of over-emphasizing the importance of practice and undermining the importance of theory when it comes to game design. A common advice that is being given to a newcomer often starts with: "Hey, you want to become a game developer? Then JUST MAKE A GAME first! Playtest it and see how fun it is. Identify its problems, fix them, and playtest again. Let other people play your game and give some feedback. Spend your time playing other games, too, and see why they are fun to play! etc etc..."
This approach is mostly valid and mostly works well, but there is one major hole here. In order to start the initial stage of development, one must be able to design and implement at least a decent prototype of the game in the first place. And during this early phase, a vague advice such as "Just make a game!" is almost always in vain because a game is a system of interlocking logical elements rather than a mere product of self-esteem.
Once we have a solid prototype, the rest of the development process may simply be empirical in nature. We may playtest it, fix its problems, add more features, playtest it more, fix its problems, add more features, and continue on and on like this, never requiring any profound theory for perfecting the design of the game. The problem of formulating such a solid prototype in the first place, however, will remain as an excruciating process as long as we only stick to the virtue of practice and not to the virtue of theory. In order to create something out of nothing, we must establish a theoretical groundwork of the game first in order to have something to experiment with, instead of just throwing in a bunch of random features first and then trying out each one of their random combinations until we find one peculiar recipe that "feels fun enough".
And in order to mitigate this difficulty of initial conception, I have been endeavoring to come up with a solid design foundation upon which any game prototype can be devised without requiring endless rounds of brute-force experimentation.
Here is the recap of the original model which had been proposed in volume 1 and 2 (shown below). A game begins with 3 most fundamental goals that the player is expected to follow, which are referred to as "Absorb", "Expand", "Secure", respectively. In order to achieve these goals, we need at least one protagonist character (aka "myself"). In our model, this character is represented as a hypothetical lifeform whose body is a single mathematical point in space.
This being, as the player's avatar, measures its current degree of success as a biological organism by means of the three metrics: (1) Its distance from resources, (2) Area of its region of influence, and (3) Its distance from obstacles. In order to achieve the "Absorb" goal, it strives to be closer to resources. In order to achieve the "Expand" goal, it strives to broaden its region of influence by visiting unfamiliar places and procreating. And in order to achieve the "Secure" goal, it strives to be farther away from obstacles either by running away from them or by destroying them (because the distance between a living being and a dead being is greater than any potential distance between two living beings).
The intrinsic limitation of this model, however, plays as a major bottleneck when trying to increase the richness of our gameplay. For example, this model contains only one player character, represents every "object" as a single point in space which discourages the designer from coming up with various interesting spatial features, apparently suggests no room for advanced narratives, and so on.
And in order to overcome such limitations without straying off to a mud pool of groundless complexity, I have suggested in the previous volume that there is a set of criteria one must follow in order to extend the system's scope of narratives/mechanics while also preserving its conceptual simplicity. First, the way we describe the core of our gameplay architecture must be "mathematically minimal" - that is, we must avoid complicated math as much as possible (in order to make sure that almost anyone can understand it) while still keeping a sense of mathematical precision for the purpose of acutely expressing the universality of its abstract nature. Second, we must extend the architecture in a strictly quantitative manner because introducing qualitative factors quickly degrades the whole design scheme into a gigantic table of arbitrary definitions. The purpose of obeying the characteristics of quantitative expansion is to compute everything from the perspective of only one observer at a time, as well as to always ensure to design complex objects in terms of "additive composition" - that is, design by establishing connections among already existing types of atoms instead of trying to introduce brand new types of atoms out of nowhere.
The benefit of mathematical minimalism is already pretty self-evident, I presume, since not everybody in the game industry is fond of advanced topics in mathematics yet they still concede that at least a small degree of mathematical precision is necessary for clarifying the game's design. This usually results in a state of implicit agreement which says, "Yes! We do need some math, but it must be as simple as possible for every one of us to understand".
The benefit of additive composition, on the other hand, is not so self-explanatory. One thing that is for sure is that it encourages us to create compound objects by assembling individual atoms together, but whether it will improve the versatility of our game design methodology or not remains a mystery as long as we do not see an example in action. So in the following few paragraphs, I will go over a couple of examples to demonstrate how additive composition will play out in practice.
Imagine that there is a human being who indicates him/herself as "myself", and that there is an angry cow nearby. This cow has a great deal of milk stored in its breast, and the person wants to steal milk from it. However, the cow is in a bad mood and is looking forward to hurt anyone nearby.
What does this mean to the human protagonist? From the viewpoint of "myself", this angry cow is both a resource and an obstacle. It is a resource because it possesses milk which provides human beings with useful nutrients (energy), yet it is also an obstacle because it is likely to damage human beings and divert their energy from being spent on tasks that are more productive than repairing their broken bones/tissues.
If we decide to satisfy these criteria by means of qualitative expansion, we will have to introduce a brand new class of objects and assign it a unique name such as "resource-obstacle" (in order to indicate that it is a halfway mixture between a resource and an obstacle). This will force us to start computing the dynamics of the entire in-game universe in terms of not only the existing primitive elements (i.e. myself, resources, and obstacles), but also another type of elements which popped out of nowhere (i.e. resource-obstacles). The main problem with this approach is that we now have to take account of how the protagonist must react to the presence of "resource-obstacles" and manually devise an entirely separate network of subgoals and tasks to make sense of their newly introduced web of causality.
This guides us to the realization that we should resolve the problem of the angry cow by means of quantitative expansion instead. For instance, rather than coming up with a whole new category of atoms, we can simply let each object be made out of two or more atoms (instead of just one) for the purpose of diversifying the context of gameplay without having to invent additional rules.
Suppose that the angry cow is not a single particle, but a connected pair of particles which represent the cow's body and milk, respectively. The cow's body is a threat to nearby human beings due to its sharp horns and bad temper; this makes it an obstacle to the protagonist. The cow's milk, on the other hand, is a collectible item that the person is able to steal from the cow; this makes it a resource to the protagonist.
The coexistence of these two relations, however, introduces a motivational dilemma between the sequence of actions that one must take in order to get farther away from an obstacle, and the sequence of actions that one must take in order to get closer to a resource. Two separate goals (i.e. "Secure" and "Absorb") are partially interfering with each other here due to the presence of two potential targets (i.e. The cow's body and milk), and the complexity of such a scenario has a tendency of forcing us to design additional heuristics to let the agent determine which degrees of prioritization ought to be assigned to each one of its goals; for it seems quite obvious that following both of these goals in parallel without any tie-breaking rule may trap the agent in a weird deadlock state, during which mutually conflicting goals and their ensuing actions cancel each other out and hardly motivate the character to do anything in particular.
Here is a solution. Just like we split up the angry cow into two components (i.e. cow's body and milk), we can split up the protagonist (aka "myself") into two separate components as well, which may be labeled as "my body" and "my hand". "My body" denotes the person's entire body except his/her hand, and "my hand" denotes the person's hand.
When a person wants to acquire milk from a cow, how does he/she do it? There could certainly be a variety of mechanical tools by means of which one may achieve such a goal, but the most rudimentary way of milking a cow is to grab its breast (i.e. where the milk is located) with one's hand and squeeze it. This means that it is only "my hand" which regards the cow's milk as a resource, and that "my body" has nothing to do with the cow's milk because we do not expect the entire body of a person to wrap the cow's breast and perform the squeezing action (Unless you.. never mind). Likewise, the cow's body doesn't have to care about "my hand" because such a marginal body part is not the main focus of the cow's point of attack. The cow's milk, on the other hand, regards "my hand" as its obstacle because a person's hand is a direct threat to the persistence of its connection to the cow's body.
The resulting schema is a neatly isolated pair of one-to-one bidirectional relations - one between "my body" and the cow's body, and the other one between "my hand" and the cow's milk. This simplifies the expected behavior of every one of the four atoms that are involved in our scenario, as each of them only regards either one obstacle or one resource (but not both) as its volitional pivot point. As long as this arrangement persists, "my body" will be running away from the cow's body, cow's body will be chasing "my body", "my hand" will be chasing the cow's milk, and the cow's milk will be running away from "my hand".
There is no multifaceted decision-making process involved in here whatsoever, since each atom always follows exactly one goal; the consequence of this simplicity is a nicely orchestrated system in which everything happens in a purely mechanical manner, fully explicable in terms of energy particles and their respective force vectors.
The practical implication of such a strictly minimalistic mechanical system is that, despite the apparent lack of any intelligence in the individual parts of the system, their combination introduces myriads of interesting emergent phenomena due to their additive nature. In the case of the angry cow depicted above, for instance, one can easily expect the person and the cow to display some kind of rotational behavior due to the combination of their pairwise opposing forces. The cow chases the person from behind the person's back, and the person chases the cow from behind the cow's back; the net result is a goofy-looking mutual tail chase.
Unless this spinning routine is perfectly stable, it is bound to end up in either of the following two cases.
(1) The person may successfully grab the cow's breast and squeeze milk out of it, after which the person will be free to simply run away from the cow because his/her hand will no longer be motivated to get closer to the cow's milk,
(2) Or the cow may successfully destroy the person with its horns before the person squeezes milk out of its breast, in which case the person's body will be sent to the imaginary space (due to death) and his/her hand will immediately follow it because both of them are part of the same object (aka "person").
Such nice decoupling of individual behaviors, however, is bound to face a major hint of contradiction when two mutually exclusive behaviors are allowed to coexist.
Let me take an example. The angry cow is not a perpetual motion machine and therefore must eat something (e.g. grass) in order to survive. In other words, it is expected to follow its "Absorb" goal as much as it is expected to follow its "Secure" goal. The problem is, a serious dilemma arises when we think about it within the context of physical realism.
Based upon the principle of additive composition, we can first represent the current scenario as shown above. Everything stays the same, except that now the angry cow has an additional component which represents its mouth. This mouth does not care about the presence of the person whatsoever, and solely focuses on the nearby grass which it can chew and swallow. The grass, which is an external object, is a resource from the perspective of the cow's mouth.
And just like before, it is theoretically possible to just assign separate goals to the cow's body and mouth. The cow's body can simply pursue its "Secure" goal by chasing/attacking its obstacle (i.e. person's body), and the cow's mouth can simply pursue its "Absorb" goal by eating the nearby grass. The nature of additivity does not prevent the system from simultaneously executing these two goals.
Yet, we all know that eating grass while also chasing/attacking a person is a nearly impossible task. The reason why it is so is that both the cow's weapon (pair of horns) and its mouth are part of one small and rigid object (head), which prevents these two from pursuing two different targets at once. In the previous case in which the cow was both chasing the person and dodging his/her hand, there was at least a fair amount of distance between the cow's horns and its breast which rendered the concurrent execution of their goals quite feasible (by means of the cow's rotation). In case where the spatial constraint (i.e. distance limit) is way too tight, as in the case of the cow's mouth being too close to its horns, we cannot simply superimpose two separate behavioral elements together and let their actions add up linearly.
So, what should be a solution to such mutually conflicting goals? Strictly speaking, there are obvious ways to circumvent this problem such as introducing a set of criteria for deciding when to spend time chasing the person and when to spend time eating grass, based off of parameters such as the distance between the cow and the person, the distance between the cow and the grass, the cow's hunger level, the person's aggro level, and so on. Just as mentioned before, however, such additional rules complicate the gameplay logic too much and clearly violate the principle of additive composition.
From an engineering point of view, this is a problem of how we should combine multiple subsystems in a modular way. When subsystems are completely isolated from one another, what we see is a mere conglomeration of small independent entities which do not possess any ability to collaborate. When subsystems directly depend on one another, on the other hand, what we see is a convoluted jungle of dependencies which is extremely hard to construct and maintain.
A typical solution to such a problem is to let subsystems neither isolate themselves nor establish direct interdependencies, but simply "communicate" with each other in an explicit way. A large-scale computer program, for example, does not let its internal modules directly access/modify one another; instead, it lets them use an intermediary medium such as a messaging system for cooperative purposes. The reason why such a buffered method of communication is deemed a great way of designing a computational framework is that it allows us to control the way in which the modules interact with each other by simply controlling the way in which information flows from one place to another.
This design philosophy can be applied to our case as well. From what we have observed so far, it appears to be a bit too rash to assume that every one of the individual atoms of an object can operate in a completely independent manner while also preserving the realism of our everyday physical phenomena. Yet, it is also true that establishing additional rules which involve multiple atoms and their implicit properties complicates the matter way too much. Therefore, it seems pretty evident that we should allow atoms to communicate with one another through a separate medium in order to establish a nice compromise between the two extreme methodologies (i.e. No Dependency VS Direct Dependency).
In the next volume, I will go over in detail the methods of leveraging this conclusion as means of ensuring the robustness of our gameplay system without damaging its modularity.
(Will be continued in Volume 6)