Crosstalk, a postmortem – Abstraction, part 2

Crosstalk hasn’t gotten a ton of attention from people.  As of this writing it only has 41 reviews from fellow Ludum Dare participants.  However, the reaction to the game is mostly in the range of “totally taken aback” to “very interesting, unique!”.  So I want to talk a bit about how the game came into being.

I was totally disappointed with the chosen theme for Ludum Dare 40.  I was not inspired one bit.  I participated in Ludum Dare 40 at a local hosting site, and when the theme was announced, ideas were being tossed around all over the office space, and it was a bit chaotic.  So I went for a walk in the cool air of downtown, with headphones on listening to music.  I suppose I isolated myself and just let my brain chew on the theme for a while.

Perhaps it was the experience of being in the midst of all the brainstorming from other jam participants, or perhaps it was hearing through my music the rowdy shouting of vague plans from various groups of pre-gamed bar hoppers.  Whatever it was, the phrase “cross talk” popped into my head.  I liked the concept of “the more noise you have, the worse it is”, but I still didn’t like the idea of making a game based on that concept.

When I got back from my walk, I resigned myself to developing that nuissance of an idea “cross talk”, and began writing things down.  I desperately wanted to avoid the obvious interpretation of the theme, which was “the more you progress the more difficult it becomes”.  Very quickly I focused in on two components of the aesthetic for the game:

1. Subtle, hidden-but-discoverable rules and mechanics.  (@lexi described the gameplay with the phrase “hidden dynamics”)

2. Visual abstraction.

I don’t know why my mind focused on abstraction for this idea, but I can probably take a guess.  For the past couple of years, and especially in the past few months I have been studying art history.  My research has primarily focused on modern art, in particular DADA, surrealism, abstract expressionism, and most recently pop art.  I began studying these artistic periods because I wanted to understand my own artistic approach.  Why do I favor Rod Humble’s The Marriage or Ian Bogost’s A Slow Year or Anna Anthropy’s Dys4ia more than say Dark Souls or EVE Online or The Witcher?

I haven’t made a lot of games, but I am interested in seeing what expressive capacity gameplay has.  So when I see a game expressing an idea through story or through visuals, I am less interested than when I see that idea expressed through a player’s interaction with the rules and mechanics of the game.

The approach is called formalism.  If games are art, then from where does their artistic expression come?  I say it comes from play.  I definitely do not want to discount other approaches (indeed, one of my favorite authorities on game design, Anna Anthropy, despises abstract play and formalism).

So while I did not expect to make an abstract game for Ludum Dare 40, that’s what happened.  I did not want to make a game where the player plays a role which is defined by story or a particular character sprite or a set of items.  I did not want to make a game where you use raycasting to disappear sprites that move toward you or where you press a button to use a “weapon” to “hit” “enemies”.  I did not want to make a game that simulated a real-world activity like shooting or climbing or driving.

I wanted to make a game that caused players to contemplate the the various aspects of the system with which they are interacting.  I wanted them to think about color, shape, sound, motion, distance, tranforms, and even the game window itself.  How do all those aspects interplay to affect your mind?  What kind of impression can that interplay leave?  Perhaps this abstract approach, where representation of reality doesn’t distract, is a way to *measure* the expressive capacity of play.

Maybe it’s not the best way, but it’s what I am thinking at the moment and though I didn’t expect to put these ideas into an actual game so soon, Ludum Dare 40 dared me to try.

P.S. Consider Crosstalk a prototype for my next game.

Play it here:

Malevich and abstract art – Abstraction, part 1

Kazimir Malevich, The Black Square, 1915, oil on linen, 79.5 x 79.5 cm, Tretyakov Gallery, Moscow.

This may be the first in a two-part article on the concept of abstraction in art, with the second being focused on game design.

I have been actively interested in art criticism and art history for the past couple of years, though I can’t say that I have gone very far into the deep end on those topics.  So I will keep this short and surface-level.

Kazimir Malevich is famous for painting The Black Square, which he called an end and a beginning.  The painting marked the end of “every attempt to feebly imitate the world of nature. There would be no copying any more, no more representation. It would be the beginning of an art which would be entirely self-sustaining.”[Glover, 2014]

The appeal of abstract art is in this rejection of representation, of imitation.  To rebel against the notion that realism contains valuable truths which are not inherently counterfeit.  It is born of the spirit of revolt and in turn inspires revolt.

But revolt is not the endgame for abstract art.  Pure personal expression is the lofty goal.  Jackson Pollock said:

“The modern artist is working with space and time, and expressing his feelings rather than illustrating. “

Modern art starts with the Impressionists precisely for this reason.  What’s more, the Impressionists started from a kind of rebellion as well (their art became popular for its display in the Salon des Refusés).

Questioning the efficacy of abstraction in the above-linked article, Glover poses this question:

“…what exactly is it that we are supposed to be looking at, and can this ever-elusive something really hope to sustain us to the depths of our emotional natures?”

I think Albert Camus might have something of a reply.  From The Stranger, where Meursault begins to learn to live in his prison cell (emphasis mine):

Eventually, once I learned how to remember things, I wasn’t bored at all.  Sometimes I would get to thinking about my room and in my imagination I would start at one corner and circle the room, mentally noting everything there was on the way.  At first it didn’t take long.  But every time I started over, it took a little longer.  I would remember every piece of furniture; and on every piece of furniture, every object; and of every object, all the details, and of the details themselves–a flake, a crack, or a chipped edge–the color and the texture…And the more I thought about it, the more I dug out of my memory things I had overlooked or forgotten.  I realized then that a man who had lived only for a day could easily live for a hundred years in prison.

Meursault’s exercise of finding all of the details, and all of the qualities of all the details within his prison cell is directly comparable to the process of abstraction in the context of artistic expression.  With each successive ‘pass’, the prison cell (the world) looks less like its surface/macro representation.  With each pass, new details are discovered, their importance elevated.  At a certain depth of observation, the prison (the world) becomes unrecognizable; it is abstracted.

Side note: Camus’ corollary to Meursault’s exercise is in his essay The Myth of Sisyphus, in the section entitled Absurd Freedom, where ‘life experiences’ are analogous to the details that Meursault finds in his cell.

My essential argument is that the formal qualities that abstract art emphasizes, and which (for its non-representational quality) are more sure to be of a personal rather than worldly nature, can have infinite depth.  But only if we are willing to dive.

Or perhaps I am wrong and there is a kind of cruel irony in the slow decay of Malevich’s The Black Square, the paint tessellating over time to resemble the Salt Flats of Death Valley.  That even for the alpha and omega of abstract paintings, Nature still finds a way to become represented.

Computer-games literacy

Humans are already very literate game players.  Play, and structured play has been a core component of our evolution as a species from the very beginning.  Games, the kind of games that give definition to a magic circle, are almost as old as our first tools.

But to speak of computer-games literacy is a very different matter.  A computer is a tool which–unlike a hammer or a spear, or a wheel–replicates some of our brain’s ability to solve problems.  A computer is a machine capable (in the abstract) of thinking, and it can do so largely without our intervention.  Therefore, we are forced to consider (at least on a philosophical level) that a computer is a tool with a separate, and fundamentally different kind of intelligence.  There are complex, nuanced relationship dynamics between humans and computers.

To be computer literate might mean being able to interface with a computer with ease, to learn software quickly, to perform very complex tasks using a computer, and to even make scripts or program the computer.  But is that actual computer literacy?

At about 70 years young, our relationship with computers is still in the ‘honeymoon’ phase.  From a language perspective, perhaps we are still proto-writing.

True computer literacy might take a thousand more years, and by that time computers will undoubtedly be of an entirely different nature.  Like language now, perhaps in the far future, that separate and fundamentally different kind of intelligence that is the computer, will be integrated into our psyche.

It may be unfair, or even lazy to move the goal post of computer literacy so far into the future.  You might be seen as removing yourself from the argument.  There are those who are deeply embeded at the bleeding-edge of this topic, working wittingly or unwittingly to expand the boundary of the edge.

So for the sake of intellectual honesty, a computer-literate person is someone near that edge right now, and we shall not worry about the far future.

With that said, what does it mean to be computer-game literate?

Computer games are a means of exploring the complex, nuanced relationship dynamics between humans and computers.  Each computer game is a unique lense, through which we might discover something new and interesting about this strange relationship.

One pillar of computer-games literacy is familiarity with the various interfaces through which we interact with the game.  A PC is one interface, a mobile phone is another, and there are VR headsets, consoles, handhelds, and perhaps others.  A computer-games literate person would not only be aware of these interfaces, but would know generally how to use them, and also have some awareness of the ways in which they constrain or inform the gameplay.

A second pillar of computer-games literacy might be familiarity with modern gameplay conventions.  One might be tempted to point toward “platformers”, “item collection”, “leveling up”, or “dialog choices” here.  Certainly familiarity with those conventions contributes to literacy, but that level of specificity is distracting.

On a more basic level, conventions which are essentially unique to computer games are: moving an image around on a screen (indeed, the screen is so far the only visual interface for computer games), moving a ‘camera’ or character around in 3D space with artificial boundaries, simulating gravity or other physical forces, animating of representational graphics, theatrical AI, competition between the player and the computer, split-screen, shared-screen, or networked play, the illusion of choice, save points, dynamic sound effects, and more.

Computer simulation in general informs a plethora of gameplay conventions which I won’t dive into with this post.

If there is a third pillar of computer-game literacy, maybe it is an acknowledgement of the complexity and nuance of the human-computer relationship, and an understanding of the role that computer games have in discovering more about that relationship.  Maybe also it is an understanding of the artistic merit and expressive capacity of games and computer games.



Their silence is the deafening crescendo of a unsung feud between the old and new. A thousand pair of eyes watch as the instigator feebly conceals her dread, her footsteps are alone. A thousand camera shutters continuously sound off, each accompanied by a flash of light, like bombs bursting in air. Each flash a momentary protest in itself. Each shutter cycle forms a thousand unspoken words. The silence is deafening.


On my way to the museum I stepped around a discarded cigarette that had fallen on the sidewalk next to a wooden bench and a pair of worn shoes. I wondered about the kind of curious circumstances that might have facilitated the commingling of such a combination of objects.

School Shooting

Weeks after the incident that left four students and two teachers dead, the local news station still thought it prudent to peer into the life of the shooter. They would air an hour long segment each night, wherein an “investigative reporter” would manufacture a fatalistic narrative. Emotional images and footage from the shooter’s childhood would flash on screen, describing the decent of an allegedly dysfunctional person into madness. The last segment (there were seven in all) featured interviews with several students who survived the incident. All of the students interviewed provided different explanations for why it happened, and they were all predictably over-simplified, but there was a singular common thread between all the answers given. Each and every student interviewed gave as an example of the shooter’s dysfunctional personality, the fact that he incessantly complained that the cafeteria didn’t serve Chili Crispitos often enough.

The air of Air

I have spent the last several weeks writing and rewriting Air, with the goal of modeling realistic hot-air balloon flight.  This post will explain most of my progress to that end.

Standard Temperature and Pressure
You might know it as ‘STP’.  STP is defined in most places as: 20°C and 101.325 kPa.  ‘Pressure’ here is referring to average atmospheric pressure at sea level. One formula for calculating atmospheric pressure (p) as a function of altitude or height (h), in Pascals and meters respectively, is:

p = 101325 (1 – 2.25577 10-5 h)5.25588

This has the effect of decreasing atmopheric pressure exponentially with altitude.

function objects.Atm:getAbsPressure()
  return (self.AbsPressure*(1-0.00002255770*(player:getAltitude()))^5.25588)

My atmosphere (Atm) is a class, stored in a table called objects.  The function above returns a value representing the absolute air pressure as it varies with the player’s altitude.  One critical aspect of pressure that is missing from the above calculation is water vapor.  So let’s account for that.

Density of Humid Air
I’ll start by backing up a bit to explain what I need for a hot air balloon to fly.  A hot air balloon flies because of buoyant force (as explained previously), so I need to calculate said force.

FB,net = (ΔDensity)*volume

FB,net = Net buoyant force
ΔDensity =  density outside envelope – density inside envelope, in kg/m³.
volume = volume of the envelope, in m³.

I used the formula for density of humid air, described here, to determine both air density values.


Dry partial pressure (Pd) is just the air component of an air-water vapor mixture, so you subtract water vapor pressure from absolute pressure:

function objects.Atm:getDryPartialPressure()
  return (self.AbsPressure*(1-0.00002255770*(player:getAltitude()))^5.25588)-self:getVaporPartialPressure()

Since water vapor is less dense than air, pressure decreases as more water vapor is added (hence the subtraction).

The gas constant for dry air (Rd) is calculated by dividing the Universal gas constant (8.3144621 J/mol K)??? by the mean molar mass of dry air (28.9645 g/mol).  The value I use is 287.058 J/kg⋅K.

Relative Humidity
The pressure of water vapor in the mixture (Pv) is found by relating the vapor pressure at saturation (psat) to relative humidity (bfd070bbf4b8539e9b3af50740384bf6).


Relative humidity is just a ratio of how much water vapor is in the air (partial pressure) to how much water vapor can possibly be in the air at any given temperature (saturation pressure).  So it looks likes this:


function objects.Atm:getRelativeHumidity()
  return math.max(0.03,math.min(self:getVaporPartialPressure()/self:getSatVaporPressure(),1))

You will often see this value included in weather forcasts, expressed in percent.  In my function for relative humidity, the minimum value is 3% and the maximum is 100%.

I feel an example calculation is needed before we move on:

Actual Vapor Pressure = Maximum Pressure × (Partial Pressure/Maximum Pressure)
= 2316 × (1505.4/2316) = 2316 × 0.65 = 1505.4 Pascals

You might notice that Actual Vapor Pressure of water will always be equal to Partial Vapor Pressure of water.  When we are talking about a mixture of gases, that is expected. 

In the game, I choose the partial pressure arbitrarily, but saturation (equilibrium) pressure is defined as:*source

function objects.Atm:getSatVaporPressure()
  return  (33.8639*((0.00738*(self:getAmbientTemp()-273.15)+0.8072)^8)-0.000019*(math.abs((1.8*self:getAmbientTemp()-273.15)+48)+0.001316))*100

I subtract 273.15 to convert to celcius so that my temperature values are friendly to the constants used, then I multiply the value returned by 100 to convert to Pascals.

There are many different methods for estimating vapor pressure of a gas.  I chose the Bosen formula for it’s large effective temperature range (-60 to 120 celcius).  I determine whether the value returned is accurate simply by comparing it to the real world.  At STP, the saturation vapor pressure of water is about 2310 Pascals, and in-game, I see 2316 Pascals.  Close enough.

Ambient Temperature, Vapor Gas Constant, and Putting It All Together

Most people intuitively know that higher altitudes have cooler temperature.  The rate at which ambient temperature decreases with altitude is called the Lapse Rate.  In the troposphere (<17km), the temperature of dry air decreases at a rate of ~10°C/km, or 0.01°C/m.

Currently, my temperature decreases by said lapse rate:

function objects.Atm:getAmbientTemp()
  return self.BaseAirTemp-(player:getAltitude()*self.LapseRate)

My current plan is to adjust BaseAirTemp according to the level and maybe also the weather that the player chooses.

Our last variable–the vapor gas constant–is the Universal gas constant divided by the molar mass of water at 18.01528 g/mol.  I use a value of 461.495 J/kg⋅K.

So now we have all of our needed variables in order to calculate the density of humid air for any given temperature.  I will restate the formula:


And in code:

function objects.Atm:getAirDensity()
  return ((self:getDryPartialPressure()/(self.DryGasConstant*self:getAmbientTemp()))

The hot air balloon is of course equipped with a burner for heating the air inside the envelope.  So I just reuse the same formula, substituting ambient temperature for balloon temperature:

function objects.Player:getBalloonDensity()
  return (atm:getDryPartialPressure()/(atm.DryGasConstant*self:getBalloonTemp()))

Buoyant Force

Putting it all together, we can finally arrive at the force which will drive the core of the game:

FB,net = (ΔDensity)*volume

function objects.Player:getBuoyantForce()
  return ((atm:getAirDensity()-self:getBalloonDensity())*self.volume)*atm:getGravity()

This force is continously applied to the hot air balloon, and only when it exceeds the weight of the hot air balloon system (pilot, passengers, burner, basket, envelope fabric, fuel, etc…) does it achieve enough buoyancy to lift off.

Up Next…

I am modeling dew point currently, with the goal of creating a basic cloud-generating system.